Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-使用指纹扫描仪和密码加密和解密多个字符串_Android - Fatal编程技术网

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

Android-使用指纹扫描仪和密码加密和解密多个字符串,android,Android,我需要一个终端加密不同的字符串和相关的解密后,用户验证使用指纹扫描仪 遵循此项目()并更改了“tryEncrypt”方法,如下所示: private boolean tryEncrypt(Cipher cipher) { try { cipher.doFinal(SECRET_BYTES); String one = "augusto"; String two = "test@gmail.com"; String thr

我需要一个终端加密不同的字符串和相关的解密后,用户验证使用指纹扫描仪

遵循此项目()并更改了“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.
正确的方法是什么

谢谢

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


为了帮助其他人解决这个问题,我使用了这个库,并且工作得很有魅力:


您遇到了一个问题,因为您正在使用一个密码实例进行多次加密(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的情况下使用密码初始化。在这个场景中,类将为您生成一个。但是,我认为您需要对每个DoFinal执行初始化,以保证一些随机性

为了帮助其他人解决这个问题,我使用了这个功能强大的库:


我得到android.security.KeyStoreException:如果我
init()
然后
doFinal()
密码只能用于加密或解密一次,则密钥用户未经身份验证。这是真的吗?从
FingerprintManager.AuthenticationCallback.onAuthenticationSuccessed()
返回的密码是否真的最多只能用于执行
tryEncrypt()操作一次
在OP中提到?@StephanHenningsen:您可以在生成密钥时使用
setUserAuthenticationValidityDurationSeconds
。那么密码(或者我想是SecretKey)在认证后只工作一次是否正确?
setUserAuthenticationValidityDurationSeconds
是否允许我多次使用它?我真的很想回答这些问题,这样我就可以填补缺失的部分,并尝试了解这里发生了什么=)你成功地测试了这个吗?我不能让它工作;结合使用
setUserAuthenticationValidityDurationSeconds(600)
setUserAuthenticationRequired(true)
仍然只允许我使用密码/密钥一次。我需要一个帮助,如何重现崩溃?您对此有进一步的了解吗?您是否在
doFinal()
之前尝试过
init()
?然后你得到了相同的android.security.KeyStoreException:密钥用户没有像我一样经过身份验证吗?如何多次使用密码?我尝试了RxFingerprint示例应用程序,似乎每次应用程序要进行加密或解密时都需要验证。我想这是有道理的。你能解释一下这是如何帮助你使用同一身份验证多次加密/解密的吗?这并没有回答关于使用同一个密码实例加密多个值的原始问题。