В Android, как гарантировать, что закрытый ключ хранится внутри защищенного оборудования

1

Значение возвращаемого значения 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.

Теги:
security
android-keystore
private-key

1 ответ

0

В соответствии с 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 по умолчанию?

  • 0
    Пожалуйста, не пишите ответ на вопрос, когда хотите попросить разъяснений. Комментарии лучше для этого.
  • 0
    Привет, извините, что так долго отвечал. IsUserAuthenticationRequirementEnforcedBySecureHardware () возвращает значение false с текущей версией. Кажется, чтобы быть последовательным. Более старая версия была 32.1.A.1.185. В этой версии isUserAuthenticationRequirementEnforcedBySecureHardware () возвращает true. Восстановление заводских настроек не решило проблему. О сканере отпечатков пальцев: та же проблема остается, когда я установил для UserAuthenticationRequired значение false. Так что больше нет ничего, что связано со сканированием отпечатков пальцев.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню