Как безопасно хранить модуль, общественный экспонент и частный экспонент на Android?

Я дал модуль, открытый экспонент и частный экспонент, и мне нужно безопасно хранить эти значения на Android. Как я могу это достичь?

В большинстве примеров создаются общедоступные и закрытые ключи без получения параметров n, d, e. Я дал эти значения n, e, d и хочу их безопасно хранить, а затем использовать эти значения для создания моего сертификата открытого ключа ICC, а также для подписи моих динамических данных.

Как я могу это достичь?

Ответ 1

Используйте Keystore System.

setEntry() позволяет хранить любой объект, реализующий KeyStore.Entry. Вы можете просто реализовать свой собственный подтип, если вам нужно хранить данные, которые не соответствуют значениям по умолчанию. (Там RSAPrivateCrtKey, хотя вы можете сохранить его в PrivateKeyEntry.)

Ответ 2

Вероятно, единственным безопасным хранилищем на Android-устройстве будет Android Keystore System.

Ключевой материал никогда не входит в процесс приложения.

и

Ключевой материал может быть привязан к защищенному оборудованию.

(см. http://developer.android.com/training/articles/keystore.html)

Проблема заключается в том, что вы ограничены тем, что вы можете сохранить в нем. Класс KeyChain позволяет хранить приватные ключи и цепочки сертификатов. Хотя Keystore Provider поддерживает следующие типы записей: PrivateKeyEntry, SecretKeyEntry, TrustedCertificateEntry в соответствии с документами. На практике попытка поставить экземпляр SecretKeyEntry вызывает исключение.

Я предлагаю поместить две записи в хранилище ключей.

  • KeyStore.PrivateKeyEntry, который можно создать с помощью PrivateKey (сгенерированный модулем и частным показателем с помощью RSAPrivateKeySpec в сочетании с KeyFactory)
  • KeyStore.TrustedCertificateEntry с вашим самоподписанным сертификатом, который вам нужно предварительно создать с помощью java keytool и загрузить во время выполнения из активов. Он не должен быть секретным по определению.