首页 > 解决方案 > 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错误以及这样的问题: thisthis

但是,仍然无法得出可能导致这种情况的结论。一个猜测是它UserNotAuthenticatedException在应该抛出的情况下抛出 keypermanentlyinvalidatedexception(如第二个问题和上面链接的第一个错误中所述),但仍然不确定。

PS 我个人在我们的一个测试设备中遇到过这个问题。我不知道为什么会这样。我从设置中删除了设备锁定并重新设置。在那之后,这个问题就消失了。

标签: androidandroid-keystore

解决方案


我强烈认为这是 android 操作系统中的一个错误,并在此处为此创建了一个问题:https ://issuetracker.google.com/issues/119944680 。

如果您遇到此问题,请给问题加注星标。


推荐阅读