- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 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 的身份验证。这在某种程度上是有道理的。但这不是一个循环,无法实现吗:
这是怎么回事??
编辑:
我使用模拟器(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
如果没有 UserNotAuthenticatedException
(因为用户在您的 key 有效期内通过了身份验证,即因为他在几秒钟前解锁了他的设备),那么执行您的加密/解密例程。结束!
您捕获了 UserNotAuthenticatedException
- 使用 null
运行 FingerprintManager.authenticate
工作流(是的!) CryptoObject
,然后在 onAuthenticationSucceeded
回调中再次初始化你的密码(是的!),但这次它不会抛出 UserNotAuthenticatedException
并使用这个初始化的实例来加密/解密(回调返回null
因为我们用 null
CryptoObject 调用它,所以我们不能使用它)。结束!
就这么简单...
但是我摸索了两天才找到这个方法。更不用说 - 似乎在线提供的所有身份验证示例都是错误的!
关于android - FingerprintManager.authenticate() 期间出现 UserNotAuthenticatedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39078271/
有没有办法模拟或模拟FingerprintManager.authenticate() ?我想为我的指纹验证器编写仪器化测试。 如果有一个解决方案限制测试可以在模拟器或设备上运行,我很好。我使用 JU
我在 Android KeyStore 中存储了一个加密密码。 我想通过使用指纹 API 对用户进行身份验证来解密该密码。 据我所知,我必须调用 FingerprintManager.authenti
我有一个应用程序可以使用指纹进行身份验证。 在询问用户是否要启用它之前,我会验证它是否可用并通过以下方式完成: FingerprintManager fingerprintManager = cont
当我的应用遇到“尝试次数过多...”、身份验证错误 0x7、FINGERPRINT_ERROR_LOCKOUT 时,我如何才能在不循环调用 FingerprintManager.authenticat
当手动请求指纹传感器权限时,oreo 对话框不显示。 我已经在 Manifest 中列出了 USE_FINGERPRINT 权限,但仍然出现异常 W/System.err: java.lang
尝试从 Android Studio 运行我的应用时出现以下错误: Failed to find byte code for android/hardware/fingerprint/Fingerpr
我正在编写一个使用 native Android Fingerprint API(在 Android 6.0 及更高版本上)对用户进行身份验证的应用。 在一种情况下 - 设备收到 Gcm 通知,如果屏
我刚刚通过 http://www.androidofficer.com/2016/06/g900vvru2dpd1-android-601-marshmallow.html 中列出的手动说明将 Ver
当我们打电话时 mFingerprintManager .authenticate(cryptoObject, 0 /* flags */, mCancellationSign
我是一名优秀的程序员,十分优秀!