Android 密钥库 UserNotAuthenticatedException 无限循环

Android keystore UserNotAuthenticatedException infinite loop

我在我的应用程序中使用 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));
}

此代码的预期行为是:

当用户在过去 30 分钟内(我传递给 setUserAuthenticationValidityDurationSeconds 的持续时间)未进行身份验证时,它会抛出 UserNotAuthenticatedException。 我正在监听那个异常,当它被抛出时,我要求使用以下方法对用户进行身份验证:

Intent intent = keyguardManager.createConfirmDeviceCredentialIntent("Unlock", null);
if (intent != null) {
        startActivityForResult(intent, REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS);
}

然后onActivityResult(),如果我收到RESULT_OK,我会尝试再次执行methodToConsumeSecretKey()

现在,它在大多数情况下都有效。但我观察到我们的一些客户 methodToConsumeSecretKey() 反复抛出 UserNotAuthenticatedException 即使用户已成功验证。因此,他们有点陷入了一个循环,在这个循环中他们不断进行身份验证并且 OS 不断抛出此异常。 我没有在这些客户的设备或 android 版本中观察到任何模式。这些是每个 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"}]

.

此外,这不会发生在特定制造商身上。这些用户在 XiaomiOnePlusLenovoMotorola 上按计数降序排列。还有其他厂商。

我已经解决了 android issuetracker 错误,例如 this and this,以及以下问题: this and this.

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

P.S。我个人在我们的一个测试设备中遇到过这个问题。我不能 弄清楚为什么会这样。我从设置中删除了设备锁并重新设置。之后,问题就解决了。

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

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

我个人在我的一个测试设备 (OnePlus) 中遇到过这个问题。

我从设置中删除了设备锁并重新设置。之后,问题就解决了。