繁体   English   中英

Android - 使用指纹扫描仪和密码对多个字符串进行加密和解密

[英]Android - Use Fingerprint scanner and Cipher to encrypt and decrypt multiple strings

在用户使用指纹扫描仪进行身份验证后,我需要结束对不同字符串和相关解密的加密。

按照这个项目( https://github.com/StylingAndroid/UserIdentity/tree/Part1 )并更改“tryEncrypt”方法,如下所示:

  private boolean tryEncrypt(Cipher cipher) {
    try {
        cipher.doFinal(SECRET_BYTES);
        String one = "augusto";
        String two = "test@gmail.com";
        String three = "3333333331";
        byte[] oneEnc = cipher.doFinal(one.getBytes());
        byte[] twoEnc = cipher.doFinal(one.getBytes());
        byte[] threeEnc = cipher.doFinal(one.getBytes());
        Log.d("test", "oneEnc: " + Base64.encodeToString(oneEnc,0));
        Log.d("test", "twoEnc: " + Base64.encodeToString(twoEnc,0));
        Log.d("test", "threeEnc: " + Base64.encodeToString(threeEnc,0));

    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
    return true;
}

我收到此错误:

java.lang.IllegalStateException: IV has already been used. Reusing IV in encryption mode violates security best practices.

如何做到这一点的正确方法是什么?

谢谢

*******************更新:*****************************

为了帮助其他人解决这个问题,我使用了这个库并像魅力一样工作:

https://github.com/Mauin/RxFingerprint

您遇到了问题,因为您使用 Cipher 的单个实例进行多个加密 (dofinal)。 您正在使用单个向量初始化 (IV)。

看看如何初始化密码的选项。

SecureRandom r = new SecureRandom();
byte[] ivBytes = new byte[16];
r.nextBytes(ivBytes);

cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(ivBytes));

如您所见,您需要指定初始化向量。 初始化向量不能重复以保证加密有效。

在您的场景中,您可能需要执行新的初始化。

*Ps:也可以在没有 IvParameterSpec 的情况下使用 Cipher 初始化。 在这种情况下,该类将为您生成一个。 但是,我相信您需要为每个 DoFinal 执行初始化以保证一些随机性。

为了帮助其他人解决这个问题,我使用了这个像魅力一样工作的库:

https://github.com/Mauin/RxFingerprint

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM