Android Keystore, требующий аутентификации, не разблокированный по отпечатку пальца, а только по пин-коду? - PullRequest
0 голосов
/ 23 апреля 2019

EDIT: По-видимому, это зависит от устройства. У меня есть один эмулятор, на котором это происходит, и тот, который работает так, как я ожидал. Хотелось бы получить универсальный ответ, но, возможно, его нет?

Переживание чего-то, что я считаю немного странным. Я создал AndroidKeyStore, который требует учетные данные пользователя. Поэтому, когда я пытаюсь зашифровать с помощью этого ключа, я получаю исключение «UserNotAuthenticatedException», идеально.

Затем я запускаю подтверждающие учетные данные устройства:

val keyguardManager = requireContext().getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
        val intent = keyguardManager.createConfirmDeviceCredentialIntent(("Test"),"This is the description")
        if (intent != null)
            startActivityForResult(intent, AUTHENTICATION_REQUEST)

Это работает отлично, onActivityResult после разблокировки с помощью PIN-кода или отпечатка пальца я возвращаюсь в состояние успеха. Однако, когда я сейчас пытаюсь пойти и использовать хранилище ключей снова:

Если бы я использовал свой PIN-код на экране учетных данных, я могу использовать хранилище ключей без проблем.

Если я использовал свой отпечаток пальца на экране учетных данных, он снова выдает «UserNotAuthenticatedException». И я в принципе могу идти по бесконечному циклу с отпечатками пальцев. Я пропускаю настройку или что-то, что позволяет использовать отпечаток пальца? Я могу разблокировать телефон без проблем с отпечатком пальца, это просто хранилище ключей, через которое я не могу дозвониться.

    val keyGenerator =
                    KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore")
                val builder = KeyGenParameterSpec.Builder(
                    alias,
                    KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
                )
     builder.setBlockModes(KeyProperties.BLOCK_MODE_GCM)
                        .setUserAuthenticationRequired(userAuthenticationRequired)
                        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
                        builder.setUserAuthenticationValidityDurationSeconds(
                            userAuthenticationValidityDurationSeconds
                        )
keyGenerator.init(builder.build())
            keyGenerator.generateKey()

Спасибо

...