Android-使用指纹扫描仪和密码加密和解密多个字符串
我需要一个终端加密不同的字符串和相关的解密后,用户验证使用指纹扫描仪 遵循此项目()并更改了“tryEncrypt”方法,如下所示:Android-使用指纹扫描仪和密码加密和解密多个字符串,android,Android,我需要一个终端加密不同的字符串和相关的解密后,用户验证使用指纹扫描仪 遵循此项目()并更改了“tryEncrypt”方法,如下所示: private boolean tryEncrypt(Cipher cipher) { try { cipher.doFinal(SECRET_BYTES); String one = "augusto"; String two = "test@gmail.com"; String thr
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示例应用程序,似乎每次应用程序要进行加密或解密时都需要验证。我想这是有道理的。你能解释一下这是如何帮助你使用同一身份验证多次加密/解密的吗?这并没有回答关于使用同一个密码实例加密多个值的原始问题。