Значение возвращаемого значения KeyInfo isInsideSecureHardware-метода зависит от модели устройства, версии os и некоторых других случайных факторов.
Например, при использовании Sony xperia z5 compact со старой версией os isInsideSecureHardware() может вернуть true в течение некоторого времени, а затем внезапно начать возвращать false для того же частного ключа. С последней версией os (32.2.A.0.224) она возвращает только false. Huawei Nexus 6P всегда возвращает true.
Есть ли способ убедиться, что ключ хранится в защищенном оборудовании?
Вот мой текущий код:
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
keyPairGenerator.initialize(new KeyGenParameterSpec.Builder(KEY_NAME, KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_ENCRYPT)
.setUserAuthenticationRequired(true)
.setBlockModes(KeyProperties.BLOCK_MODE_ECB)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
.build());
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// Check that private key is inside secure hardware
KeyFactory factory = KeyFactory.getInstance(key.getAlgorithm(), "AndroidKeyStore");
KeyInfo keyInfo = factory.getKeySpec(key, KeyInfo.class);
boolean secure = keyInfo.isInsideSecureHardware(); // this usually returns false
Спасибо!
Изменить: В форуме поддержки sony есть тема о той же проблеме: https://talk.sonymobile.com/t5/Android-development/hardware-backed-keystore/td-p/1154124
Было упомянуто, что в журналы записывается следующее предупреждение:
W keystore: первичному устройству-клавиатуре не удалось сгенерировать ключ, возвратившись к SW.
В соответствии с Android API, единственный способ проверить это - сначала создать ключ, а затем просмотреть информацию, чтобы обеспечить ее аппаратную поддержку.
Глядя на спецификации телефона, он был первоначально выпущен на Lollipop. Это было до того, как официальные спецификации API/аппаратных средств фингерпринта Marshmallow Fingerprint и производители сделали свое дело. В этой статье упоминается устройство, которое вы используете специально (http://blog.elcomsoft.com/2016/06/fingerprint-unlock-security-ios-vs-google-android-part-ii/). Мне интересно, были ли правильные значения, которые вы возвращали, были неправильными, а затем благодаря обновлению O/S он исправил логику (или сломал ее?). Обновленная версия O/S, о которой вы упоминаете, содержит "1 апреля 2016 года исправления безопасности Google"
У меня есть несколько вопросов:
Что теперь возвращает на ваше устройство isUserAuthenticationRequirementEnforcedBySecureHardware()? Согласуется ли значение? Если это ложь, которая может сказать вам, что считыватель отпечатков пальцев не считается защищенным (или существует дефект O/S)
Что означает более старая версия ОС? Леденец? Вы пытались сбросить настройки до factory по умолчанию?