Я тестирую устройство Google Pixel на 7.1.1 и обнаруживаю, что мой закрытый ключ не становится недействительным, когда с устройства удаляются все отпечатки пальцев. Я протестировал использование одного симметричного SecretKey в соответствии с демонстрационным приложением, и это сработало, как и ожидалось, однако использование пары асимметричных ключей выдает KeyPermanentlyInvalidatedException
только при регистрации новых отпечатков, а не при их удалении.
Более того, если я затем зарегистрирую новый отпечаток пальца, затем покажу диалоговое окно своего отпечатка пальца и успешно просканирую свой отпечаток пальца, аутентифицируя объект Cipher
, когда я затем вызову doFinal()
для объекта Cipher
, он выдаст KeyStoreException: Key user not authenticated
. Если я затем попытаюсь снова инициализировать объект Cipher после KeyStoreException
, я получу недействительное исключение, как требуется.
Я провел тест на Samsung S7 с использованием версии 6.0.1, и она работает правильно, при этом KeyPermanentlyInvalidatedException
выдается, когда все отпечатки удаляются. Я нашел в сообщении по теме, что у кого-то еще были проблемы с Nexus (версия ОС не упоминалась), возможно, связано? Может ли быть ошибка, связанная с тем, что определенные комбинации устройств/ОС не делают недействительными определенные ключи?
Казалось бы, что:
- На устройствах Pixel или 7.1.1 закрытый ключ не становится недействительным после удаления всех отпечатков пальцев.
- Если вы регистрируете новые отпечатки после того, как предварительно удалили их все, 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();
setUserAuthenticationRequired
иsetUserAuthenticationValidityDurationSeconds
? Покажи свой код. - person Codo   schedule 21.02.2017setUserAuthenticationRequired(true)
, не используя срок действия, хотя я хочу разрешить каждое использование ключа. - person rossco   schedule 22.02.2017