dart - 如何在flutter dart中像android的“PBEWithMD5AndDES”一样进行加密?
问题描述
我正在尝试将现有的移动应用程序重新创建为颤振,但在 android 上的“PBEWithMD5AndDES”加密中苦苦挣扎,我似乎在 dart 中找不到类似的方式。
到目前为止,这是我尝试使用 Flutter_Des.dart、Password_Hash.dart 和 Crypto.dart 库来实现相同的目标,但仍然无法获得相同的输出。
encryptPassword(String keyStr, String passwordStr) async {
if (keyStr.length == 0 || passwordStr.length == 0) {
return "";
}
var generator = new PBKDF2(hashAlgorithm: md5);
String saltStr = generateSaltBase64String();
var hash = generator.generateBase64Key(keyStr, saltStr, round, keyLength);
var encryptBase64 = await FlutterDes.encryptToBase64(passwordStr, hash.toString());
return encryptBase64;
}
以下是我目前在 Android 上的内容。
KeySpec keySpec = new PBEKeySpec(str.toCharArray(), salt, iterationCount);
SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);
ecipher = Cipher.getInstance("PBEWithMD5AndDES");
ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
byte[] utf8 = password.getBytes("UTF8");
byte[] enc = ecipher.doFinal(utf8);
enc = Base64.encode(enc, Base64.DEFAULT);
return new String(enc);
我期待与 android 相同的输出,因此我的后端能够解密它。
解决方案
PBEWithMD5AndDES 使用 PBKDF1 生成密钥材料(不是 PBKDF2)。这为您提供了 128 位密钥材料,然后您将其用作两个 64 位半部分作为密钥和用于 DES 的 IV。
按如下方式导出密钥和 IV - 我已经为迭代、密码和盐插入了一些任意值,并针对 JCrypto 进行了确认。
int iterations = 31;
List<int> salt = [0x21, 0x21, 0xf0, 0x55, 0xc3, 0x9f, 0x5a, 0x75];
List<int> password = utf8.encode('test');
List<int> saltedKey = password + salt;
Digest d = md5.convert(saltedKey);
for (int i = 1; i < iterations; i++) {
d = md5.convert(d.bytes);
}
print(d);
List<int> key = d.bytes.sublist(0, 8);
List<int> iv = d.bytes.sublist(8, 16);
print(key);
print(iv);
我找不到将密钥和 IV 作为字节的 DES 的 Dart 实现。triple_des
想要它们作为字符串 - 即它被简化了。Pointy castle 不做 DES。FlutterDes 似乎也想要字符串。您也许可以修改triple_des
为采用二进制密钥和 IV。或者使用不同的密码。
推荐阅读
- amazon-web-services - AWS EKS Kubernetes 和 DockerHub
- java - 检查 Java 组合类中的字段布尔值
- javascript - componentwillmount() 未捕获错误:操作必须是普通对象。使用自定义中间件进行异步操作
- swiftui - 有没有一种简单的方法来对齐子视图?
- xamarin.android - 卸载应用程序时的密码请求
- reactjs - React Router v5 - 单击不是重新渲染
- python - Scrapy:如何使用 XPATH 在表中迭代创建 dict 输出
- matlab - matlab如何求解微分方程?
- azure-virtual-machine - 如何关闭虚拟机以免产生费用,但要像在 VMware 中那样在磁盘上关闭它?
- pointers - 当我们从程序堆栈中压入和弹出时,为什么我们将堆栈指针递增/递减“4”?