android - Android 密钥库 UserNotAuthenticatedException 无限循环
问题描述
我在我的应用程序中使用 AndroidKeystore 来存储一个密钥,它有
.setUserAuthenticationRequired(true)
.setUserAuthenticationValidityDurationSeconds(30*60)
我在用户注册时生成并存储密钥。然后消耗密钥,我
methodToConsumeSecretKey(){
....
KeyStore keyStore = KeyStore.getInstance(ANDROID_KEY_STORE);
keyStore.load(null);
KeyStore.SecretKeyEntry secretKeyEntry;
secretKeyEntry = (KeyStore.SecretKeyEntry) keyStore.getEntry(getSecretKeyAlias(), null);
final SecretKey secretKey = secretKeyEntry.getSecretKey();
final Cipher cipher = getCipherInstance();
byte[] iv = BaseEncoding.base64().decode(<stored iv>);
cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(iv));
}
此代码的预期行为是:
UserNotAuthenticatedException
当用户在过去 30 分钟(我传递到的持续时间)内未通过身份验证时,它会抛出setUserAuthenticationValidityDurationSeconds
。我正在监听那个异常,当它被抛出时,我要求使用以下方法对用户进行身份验证:
Intent intent = keyguardManager.createConfirmDeviceCredentialIntent("Unlock", null);
if (intent != null) {
startActivityForResult(intent, REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS);
}
然后onActivityResult()
,如果我收到RESULT_OK
,我会尝试methodToConsumeSecretKey()
再次执行。
现在,它在大多数情况下都有效。但是我观察到我们的一些客户,即使用户已成功验证,也会methodToConsumeSecretKey()
反复抛出。UserNotAuthenticatedException
所以,他们有点陷入了一个循环,他们不断地进行身份验证,操作系统不断抛出这个异常。我没有在这些客户的设备或安卓版本中观察到任何模式。这些是每个 android 版本的用户数:
[{"version":"8.1.0","count":"8119"},{"version":"8.0.0","count":"3384"},{"version":"7.0","count":"2882"},
{"version":"9","count":"1645"},{"version":"6.0.1","count":"1281"},{"version":"6.0","count":"1063"},
{"version":"7.1.2","count":"931"},{"version":"7.1.1","count":"880"}]
.
此外,特定制造商不会发生这种情况。这些用户在Xiaomi
, OnePlus
, Lenovo
,Motorola
上按计数递减顺序排列。还有其他制造商。
我经历过像这样和这样的android issuetracker错误,以及像这样的问题: this和this。
但是,仍然无法得出可能导致这种情况的结论。一个猜测是它UserNotAuthenticatedException
在应该抛出的情况下抛出 keypermanentlyinvalidatedexception
(如第二个问题和上面链接的第一个错误中所述),但仍然不确定。
PS 我个人在我们的一个测试设备中遇到过这个问题。我不知道为什么会这样。我从设置中删除了设备锁定并重新设置。在那之后,这个问题就消失了。
解决方案
我强烈认为这是 android 操作系统中的一个错误,并在此处为此创建了一个问题:https ://issuetracker.google.com/issues/119944680 。
如果您遇到此问题,请给问题加注星标。
推荐阅读
- flutter - 从 IBM Watson 下载 CoreML 文件时出错
- excel - 使用列表中的名称创建新工作表
- rabbitmq - 使用 request-reply 和 pub-sub 进行微服务通信
- python - 针对工作日字符串使用 Pandas .corr
- python - 为什么坐标只返回“N/A”?尝试通过从 Zillow 抓取来比较要出租的社区
- swift - Swift 范围界定问题,在 alamofire 请求函数中添加变量,但变量在函数之外时似乎丢失了
- python - 如何在 tkinter 中替换背景图像?
- linux - TensorFlow 库未编译为使用 SSE4.1、SSE4.2、AVX、AVX2 指令来加速 CPU 计算
- subnet - EC2:“启动失败您请求的实例类型 (t2.micro) 在您请求的可用区 (ap-south-1c) 中不受支持”
- amazon-web-services - 与 VS Code Notebooks 配合使用的 Python 和 Spark 版本