Биометрические данные Android: IllegalStateException. По крайней мере, один биометрический должен быть зарегистрирован для создания ключей, требующих аутентификации пользователя.

Я использую библиотеку Android Biometricx для аутентификации по лицу и отпечатку пальца. Когда зарегистрирован только FaceID и я пытаюсь создать секретный ключ, я получаю IllegalStatException: для создания ключей, требующих аутентификации пользователя, должен быть зарегистрирован хотя бы один биометрический параметр

Я пытаюсь создать secretKey вот так

            try {
                
                mKeyGenerator.init(new KeyGenParameterSpec.Builder(KEY_NAME,
                        KeyProperties.PURPOSE_ENCRYPT |
                                KeyProperties.PURPOSE_DECRYPT)
                        .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
                        // Require the user to authenticate with a fingerprint to authorize every use
                        // of the key
                        .setUserAuthenticationRequired(true)
                        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
                        .build());
                secretKey = mKeyGenerator.generateKey();
            } catch (NoSuchAlgorithmException | InvalidAlgorithmParameterException
                    | CertificateException | IOException e) {
                Toast.makeText(this,"Create Key "+ e.getLocalizedMessage(), Toast.LENGTH_LONG).show();
            }

Код работает нормально при регистрации отпечатка пальца. Это происходит только при регистрации FaceId. Что мне здесь не хватает?


person abhishek maharajpet    schedule 09.07.2020    source источник
comment
Тот факт, что устройство поддерживает распознавание лиц, автоматически не означает, что его можно использовать для предоставления доступа к ключам хранилища ключей сторонним приложениям. Для этого должны быть выполнены определенные требования, указанные в Android CDD. Обратите внимание, что это вне вашего контроля как разработчика приложений, по крайней мере, до Android R, который позволяет вам доверять слабой биометрии, если вы захотите это сделать.   -  person Michael    schedule 09.07.2020
comment
@ Майкл, я понимаю. Выданная ошибка должна быть неправильной, потому что в ней говорится, что необходимо зарегистрировать хотя бы один биометрический параметр (я уже зарегистрировал Face ID).   -  person abhishek maharajpet    schedule 09.07.2020
comment
Как работает один и тот же фрагмент кода, если Fingerprint и FaceId зарегистрированы на одном устройстве?   -  person abhishek maharajpet    schedule 09.07.2020
comment
Что ж, если обнаружение лиц на устройстве, на котором вы тестируете, считается слабым (что может иметь место практически для всех устройств Android прямо сейчас, кроме Pixel 4), то с точки зрения Биометрический API, у вас нет зарегистрированных биометрических данных.   -  person Michael    schedule 09.07.2020
comment
Если есть несколько типов биометрических данных, которые можно использовать, то, насколько я понимаю, пользователь сможет каким-либо образом выбрать свои предпочтительные биометрические данные (например, в приложении «Настройки»). В действительности ваше приложение не имеет никакого контроля над тем, что используется (за исключением различия Strong и Weak в Android R).   -  person Michael    schedule 09.07.2020
comment
@Michael Есть ли способ проверить, является ли зарегистрированный биометрический параметр слабым? или нам просто нужно использовать Exception   -  person abhishek maharajpet    schedule 09.07.2020
comment
Здесь есть одна загвоздка. Если пользователь зарегистрировал оба, ему будет предложено выбрать любой из них для аутентификации. Пользователи могут выбрать FaceId и пройти аутентификацию, даже если это считалось слабым.   -  person abhishek maharajpet    schedule 09.07.2020
comment
Это похоже на ошибку в реализации BiometricPrompt (или, возможно, в настройке OEM). Вы можете отправить отчет об ошибке в ответственную компанию.   -  person Michael    schedule 09.07.2020
comment
Причина ошибки здесь в том, что крипто-объект не передается при аутентификации с помощью биометрической подсказки. В случае передачи биометрический API не будет использовать незащищенную биометрию, если криптообъект не будет передан, он покажет все доступные биометрические данные.   -  person abhishek maharajpet    schedule 24.07.2020


Ответы (1)


Проблема здесь. Все это связано с настройкой .setUserAuthenticationRequired(true)

Если для этого ключа установлено значение true при создании ключа, это означает, что должен быть зарегистрирован хотя бы один безопасный биометрический / разблокирующий пин-код / ​​шаблон. Поскольку ключ был установлен на true и присутствовали только небезопасные методы аутентификации, была выдана ошибка At least one biometric must be enrolled to create keys that require user authentication.

Примечание. Face ID в Samsung на данный момент считается незащищенным. Это была причина вышеупомянутой проблемы

person abhishek maharajpet    schedule 24.07.2020