Недействительность ключа Android при удалении отпечатков пальцев

Я тестирую устройство Google Pixel на 7.1.1 и обнаруживаю, что мой закрытый ключ не становится недействительным, когда с устройства удаляются все отпечатки пальцев. Я протестировал использование одного симметричного SecretKey в соответствии с демонстрационным приложением, и это сработало, как и ожидалось, однако использование пары асимметричных ключей выдает KeyPermanentlyInvalidatedException только при регистрации новых отпечатков, а не при их удалении.

Более того, если я затем зарегистрирую новый отпечаток пальца, затем покажу диалоговое окно своего отпечатка пальца и успешно просканирую свой отпечаток пальца, аутентифицируя объект Cipher, когда я затем вызову doFinal() для объекта Cipher, он выдаст KeyStoreException: Key user not authenticated. Если я затем попытаюсь снова инициализировать объект Cipher после KeyStoreException, я получу недействительное исключение, как требуется.

Я провел тест на Samsung S7 с использованием версии 6.0.1, и она работает правильно, при этом KeyPermanentlyInvalidatedException выдается, когда все отпечатки удаляются. Я нашел в сообщении по теме, что у кого-то еще были проблемы с Nexus (версия ОС не упоминалась), возможно, связано? Может ли быть ошибка, связанная с тем, что определенные комбинации устройств/ОС не делают недействительными определенные ключи?

Казалось бы, что:

  1. На устройствах Pixel или 7.1.1 закрытый ключ не становится недействительным после удаления всех отпечатков пальцев.
  2. Если вы регистрируете новые отпечатки после того, как предварительно удалили их все, PrivateKey нельзя использовать для расшифровки данных, однако он становится недействительным только после того, как вы попытаетесь его использовать.

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

ОБНОВЛЕНИЕ: показ генерации ключа по запросу.

mKeyPairGenerator.initialize(
            new KeyGenParameterSpec.Builder(getKeyName(), KeyProperties.PURPOSE_DECRYPT)
                        .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
                        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)
                        .setUserAuthenticationRequired(true)
                        .setRandomizedEncryptionRequired(true)
                        .build());
        mKeyPairGenerator.generateKeyPair();

person rossco    schedule 21.02.2017    source источник
comment
Вы использовали setUserAuthenticationRequired и setUserAuthenticationValidityDurationSeconds? Покажи свой код.   -  person Codo    schedule 21.02.2017
comment
Да, я использую setUserAuthenticationRequired(true), не используя срок действия, хотя я хочу разрешить каждое использование ключа.   -  person rossco    schedule 22.02.2017
comment
Привет, у меня точно такая же проблема. Вы смогли ее решить? Спасибо ;)   -  person Venator85    schedule 16.03.2017
comment
Привет, @Venator85, к сожалению, нет. Как я упоминал в посте, я думаю, что это ошибка с Android и этой конкретной комбинацией клавиш.   -  person rossco    schedule 17.03.2017
comment
Даже Pixel, работающий на Android 8.0, также вызывает у меня ту же проблему. Там есть работа?   -  person SathishKumar    schedule 20.04.2018


Ответы (1)


ОБНОВЛЕНИЕ Похоже, это частично связано с Google Проблема 227919. Комментарий от 17 февраля. Говорит, что исправление было добавлено в последнюю версию N, но я все еще могу воспроизводить, как и другие.

Если у вас возникла эта проблема, отметьте ее звездочкой Google, чтобы привлечь к ней больше внимания.

person rossco    schedule 07.04.2017