Удаление фингерпринта не запускает InvalidKeyException для проверки подлинности отпечатка пальца

SathishKumar спросил: 28 марта 2018 в 04:02 в: android

Я столкнулся с проблемой аутентификации с помощью Fingerprint, на самом деле, я включил аутентификацию Fingerprint в моем приложении и отлично работаю, за исключением одного случая.

Я установил два фингерпринта на своем устройстве после инициализации KeyGenerator с помощью Fingerprint KEY, я удалил один отпечаток с устройства и вернулся в свое приложение и выполнил Fingerprint Auth, он работает нормально. Я не знаю, почему он не запускает InvalidKeyException, как будто добавляет работу отпечатка пальца. Является ли это ожидаемым поведением или какой-либо ошибкой с ОС?

Ниже приведены сведения об устройстве,

Device : Pixel

OS: Android 8.0

Ниже приведен код моей реализации,

protected void generateKey() {
       try {
           keyStore = KeyStore.getInstance("AndroidKeyStore");
       } catch (Exception e) {
           e.printStackTrace();
       }       KeyGenerator keyGenerator;
       try {
           keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
       } catch (NoSuchAlgorithmException | NoSuchProviderException e) {
           throw new RuntimeException("Failed to get KeyGenerator instance", e);
       }       try {
           keyStore.load(null);
           keyGenerator.init(new
                   KeyGenParameterSpec.Builder(KEY_NAME,
                   KeyProperties.PURPOSE_ENCRYPT |
                           KeyProperties.PURPOSE_DECRYPT)
                   .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
                   .setUserAuthenticationRequired(true)
                   .setEncryptionPaddings(
                           KeyProperties.ENCRYPTION_PADDING_PKCS7)
                   .build());
           keyGenerator.generateKey();
       } catch (NoSuchAlgorithmException |
               InvalidAlgorithmParameterException
               | CertificateException | IOException e) {
           throw new RuntimeException(e);
       }
   } public boolean cipherInit() {
       try {
           cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7);
       } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
           throw new RuntimeException("Failed to get Cipher", e);
       }       try {
           keyStore.load(null);
           SecretKey key = (SecretKey) keyStore.getKey(KEY_NAME,
                   null);
           cipher.init(Cipher.ENCRYPT_MODE, key);
           return true;
       } catch (KeyPermanentlyInvalidatedException e) {
           return false;
       } catch (KeyStoreException | CertificateException | UnrecoverableKeyException | IOException | NoSuchAlgorithmException | InvalidKeyException e) {
           throw new RuntimeException("Failed to init Cipher", e);
       }
   }
}

Я уже пробовал несколько сообщений ( Как определить удаление отпечатков пальцев в Android? , API отпечатков пальцев Android и частные / открытые ключи , Аннулирование Android-ключа при удалении отпечатков пальцев ), ничто не помогло мне избавиться от него.

1 ответ

Есть решение
CommonsWare ответил: 28 марта 2018 в 07:30

Ваш код не привязан строго к отпечаткам пальцев. Все, что он имеет, в некоторой степени связано с этим:

setUserAuthenticationRequired(true)

Это говорит о том, что ключ, который вы создаете в AndroidKeyStore, требует аутентификации пользователя. В нем ничего не говорится о отпечатках пальцев.

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

Это ожидаемое поведение или какая-либо ошибка в ОС?

Это ожидаемое поведение.

SathishKumar ответил: 29 марта 2018 в 07:02
Большое спасибо за краткую информацию и есть ли способ идентифицировать удаление отпечатков пальцев?
CommonsWare ответил: 29 марта 2018 в 07:05
@SathishKumar: я так не думаю.
SathishKumar ответил: 29 марта 2018 в 07:06
Хорошо, спасибо.
Michael ответил: 02 апреля 2018 в 09:33
"Кроме того, пользователю не нужно использовать отпечаток пальца для проверки подлинности - он может использовать свою фразу-пароль, PIN-код или шаблон, если он того пожелает." Нет, если setUserAuthenticationValidityDurationSeconds не использовался для разрешить многократное использование ключа для каждой аутентификации в течение определенного периода времени. В противном случае в документации говорится: "В настоящее время единственным средством такой авторизации является аутентификация по отпечатку пальца" .