Android keystore UserNotAuthenticatedException бесконечный цикл - PullRequest
0 голосов
/ 25 ноября 2018

Я использую 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 Я личностолкнулся с этой проблемой в одном из наших тестовых устройств.Я не мог понять, почему это происходит.Я снял блокировку устройства из настроек и установил заново.После этого проблема исчезла.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Я лично сталкивался с этой проблемой на одном из моих тестовых устройств (OnePlus).

Я снял блокировку устройства из настроек и снова установил ее.После этого проблема исчезла.

0 голосов
/ 07 декабря 2018

Я твердо чувствую, что это ошибка в Android OS и создала проблему для этого здесь: https://issuetracker.google.com/issues/119944680.

Пожалуйста, отметьте проблему, если вы столкнулись с этим.

...