2016-04-22 2 views
6

Я хотел бы импортировать в AndroidKeyStore ключ. Таким образом, я могу генерировать его OpenSSL следующим способомКак импортировать закрытый ключ RSA, который сгенерирован openssl, в AndroidKeyStore

OpenSSL -text -в RSA privateKey2048.pem

OpenSSL pkcs8 -topk8 информ PEM -in ./privateKey2048.pem -outform DER -out private2048.der -nocrypt

тогда я могу преобразовать его из private2048.der в шестнадцатеричный формат, который может быть преобразован в ByteArray, в приложении для Android. Но это не ясно для меня, Как импортировать этот byteArray в AndroidKeyStore?

В общем, мой вопрос заключается в том, как импортировать ключ KeyStore, который существует как String или byteArray?

ps: Я знаю, что можно создать keyPair с помощью keyPairGenerator.generateKeyPair(), но я хотел бы импортировать мой ключ, например, сгенерированный openssl, а затем жестко закодированный в приложении.

+0

Вы можете обратиться к этому сообщению http://stackoverflow.com/questions/36688119/import-existing-private-key-into-bks-keystore –

ответ

4

Неплохо вставлять секретный ключ в ваше приложение. Этот ключ скомпрометирован, потому что содержимое вашего APK не является секретным, и поэтому ключ может быть извлечен из APK. Если вы все еще верите, что вам нужно это сделать, несмотря на это предупреждение, читайте дальше.

Чтобы импортировать закрытый ключ в Keystore Android, вам необходимо представить его как экземпляр PrivateKey, а затем вам также нужен сертификат X.509 (для открытого ключа, соответствующего закрытому ключу), представленный как экземпляр X509Certificate. Это связано с тем, что абстракция JCA KeyStore не поддерживает хранение закрытых ключей без сертификата.

Для преобразования PKCS # 8 DER закодированного закрытый ключа в PrivateKey:

PrivateKey privateKey = 
    KeyFactory.getInstance("RSA").generatePrivate(
     new PKCS8EncodedKeySpec(privateKeyPkcs8)); 

Для преобразования PEM или DER закодированного сертификата в сертификат:

Certificate cert = 
    CertificateFactory.getInstance("X.509").generateCertificate(
     new ByteArrayInputStream(pemOrDerEncodedCert)); 

Наконец, импортировать частный ключ и сертификат в запись «myKeyAlias» в базе данных Keystore:

KeyStore ks = KeyStore.getInstance("AndroidKeyStore"); 
ks.load(null); 
ks.setKeyEntry("myKeyAlias", privateKey, null, new Certificate[] {cert}); 

См. mo передовые примеры на https://developer.android.com/reference/android/security/keystore/KeyProtection.html.

+0

Большое спасибо. ps:> «Неплохо сложно записать секретный ключ в ваше приложение». Да, я знаю, мне это нужно для образовательной цели. – i716

 Смежные вопросы

  • Нет связанных вопросов^_^