【问题标题】:How to do encryption like android's "PBEWithMD5AndDES" in flutter dart?如何在flutter dart中像android的“PBEWithMD5AndDES”一样进行加密?
【发布时间】:2019-05-23 07:45:11
【问题描述】:

我正在尝试将现有的移动应用程序重新创建为颤振,但在 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 相同的输出,以便我的后端能够解密它。

【问题讨论】:

    标签: dart flutter cryptography md5 des


    【解决方案1】:

    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。或者使用不同的密码。

    【讨论】:

    • 谢谢理查德,你让我更接近我正在寻找的东西。但我不知道如何修改三元组以获取二进制密钥和 IV,仍在寻找更好的密码库。我确实尝试将它们转换为字符串,但它似乎将实际值破坏为密码所不期望的其他东西。
    【解决方案2】:

    通过使用flutter的methodchannel并调用平台特定的代码来进行加密及其现在的工作来解决。谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      • 2019-02-13
      • 2021-02-09
      • 2021-10-11
      • 2023-01-25
      相关资源
      最近更新 更多