Я использую 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 этих клиентов.Это количество пользователей на версию 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
в порядке убывания количества.Также есть и другие производители.
Я прошел через баг андроид Issetracker, такие как this и this , и такие вопросы, как: this и this .
Но, тем не менее, не смогли прийти к заключению, что может быть причиной этого.Можно предположить, что он выбрасывает UserNotAuthenticatedException
в тех случаях, когда он должен выбросить keypermanentlyinvalidatedexception
(как указано во втором вопросе и первой ошибке, связанной выше), но все еще не уверен в этом.
PS Я личностолкнулся с этой проблемой в одном из наших тестовых устройств.Я не мог понять, почему это происходит.Я снял блокировку устройства из настроек и установил заново.После этого проблема исчезла.