gpt4 book ai didi

android - FingerprintManager.authenticate() 期间出现 UserNotAuthenticatedException

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:46:27 26 4
gpt4 key购买 nike

我在 Android KeyStore 中存储了一个加密密码。

我想通过使用指纹 API 对用户进行身份验证来解密该密码。

据我所知,我必须调用 FingerprintManager.authenticate(CryptoObject cryptoObject) 方法来开始监听指纹结果。 CryptoObject 参数是这样创建的:

public static Cipher getDecryptionCipher(Context context) throws KeyStoreException {
try {
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
SecretKey secretKey = getKeyFromKeyStore();
final IvParameterSpec ivParameterSpec = getIvParameterSpec(context);

cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
return cipher;

} catch (NoSuchAlgorithmException | NoSuchPaddingException | IOException | UnrecoverableKeyException | CertificateException | InvalidAlgorithmParameterException | InvalidKeyException e) {
e.printStackTrace();

}

return null;
}

Cipher cipher = FingerprintCryptoHelper.getDecryptionCipher(getContext());
FingerprintManager.CryptoObject cryptoObject = new FingerprintManager.CryptoObject(cipher);
fingerprintManager.authenticate(cryptoObject, ...);

方法 getDecryptionCipher() 正常工作,直到 cipher.init() 调用。在这个调用中,我得到一个 UserNotAuthenticatedException,因为用户没有通过这个 secretKey 的身份验证。这在某种程度上是有道理的。但这不是一个循环,无法实现吗:

  • 要验证用户身份,我想使用他/她的指纹
  • 要监听他/她的指纹,我需要初始化 Cipher,而 Cipher 则需要经过身份验证的用户

这是怎么回事??

编辑:

我使用模拟器(Nexus 4,API 23)。

这是我用来创建 key 的代码。

private SecretKey createKey() {
try {
KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, ANDROID_KEY_STORE);
keyGenerator.init(new KeyGenParameterSpec.Builder(
KEY_NAME,
KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT
)
.setBlockModes(KeyProperties.BLOCK_MODE_CBC)
.setUserAuthenticationRequired(true)
.setUserAuthenticationValidityDurationSeconds(AUTHENTICATION_DURATION_SECONDS)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
.build());
return keyGenerator.generateKey();
} catch (NoSuchAlgorithmException | NoSuchProviderException | InvalidAlgorithmParameterException e) {
throw new RuntimeException("Failed to create a symmetric key", e);
}
}

最佳答案

我找到了逃脱第 22 条军规的方法!

你这样做:

尝试{ .init 像往常一样使用Cipher

  1. 如果没有 UserNotAuthenticatedException(因为用户在您的 key 有效期内通过了身份验证,即因为他在几秒钟前解锁了他的设备),那么执行您的加密/解密例程。结束!

  2. 您捕获了 UserNotAuthenticatedException - 使用 null 运行 FingerprintManager.authenticate 工作流(是的!) CryptoObject ,然后在 onAuthenticationSucceeded 回调中再次初始化你的密码(是的!),但这次它不会抛出 UserNotAuthenticatedException 并使用这个初始化的实例来加密/解密(回调返回null 因为我们用 null CryptoObject 调用它,所以我们不能使用它)。结束!

就这么简单...

但是我摸索了两天才找到这个方法。更不用说 - 似乎在线提供的所有身份验证示例都是错误的!

关于android - FingerprintManager.authenticate() 期间出现 UserNotAuthenticatedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39078271/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com