【问题标题】:How to import RSA private key, which generated by openssl, into AndroidKeyStore如何将openssl生成的RSA私钥导入AndroidKeyStore
【发布时间】:2016-04-22 13:00:52
【问题描述】:

我想将密钥导入 AndroidKeyStore。 所以,我可以通过以下方式通过openssl生成它

openssl rsa -text -in privateKey2048.pem

openssl pkcs8 -topk8 -inform PEM -in ./privateKey2048.pem -outform DER -out private2048.der -nocrypt

然后我可以将它从 private2048.der 转换为十六进制格式,可以在 android 应用程序中转换为 byteArray。但对我来说不是很清楚, 如何将这个 byteArray 导入 AndroidKeyStore?

所以一般来说,我的问题是如何导入作为字符串或字节数组存在的 KeyStore 键?

ps:我知道可以通过 keyPairGenerator.generateKeyPair() 生成 keyPair,但我想导入我的密钥,例如由 openssl 生成,然后在应用程序中硬编码。

【问题讨论】:

标签: android openssl keystore


【解决方案1】:

将私钥硬编码到您的应用程序中并不是一个好主意。 此密钥已泄露,因为您的 APK 内容不是秘密的,因此可以从 APK 中提取该密钥。如果您仍然认为尽管有此警告,您仍需要执行此操作,请继续阅读。

要将私钥导入 Android Keystore,您需要将其表示为 PrivateKey 实例,然后您还需要表示为 X509Certificate 实例的 X.509 证书(对应于私钥的公钥)。这是因为 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));

最后,将私钥和证书导入 Android Keystore 的“myKeyAlias”条目:

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

https://developer.android.com/reference/android/security/keystore/KeyProtection.html查看更多高级示例。

【讨论】:

  • 非常感谢。 ps:>“将私钥硬编码到您的应用程序中不是一个好主意。”是的,我知道,我需要它用于教育目的。
猜你喜欢
  • 2011-08-21
  • 2017-03-01
  • 2018-10-07
  • 2011-05-11
  • 1970-01-01
  • 2019-08-15
  • 2010-10-04
  • 1970-01-01
  • 2021-06-07
相关资源
最近更新 更多