我想导入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 app中的byteArray中转换。但它对我来说并不清楚, 如何将这个byteArray导入AndroidKeyStore?
所以一般来说,我的问题是如何导入KeyStore键作为String或byteArray存在?
ps:我知道可以通过keyPairGenerator.generateKeyPair()生成keyPair,但是我想导入我的密钥,例如由openssl生成,然后在应用程序中进行硬编码。
答案 0 :(得分:6)
将私钥硬编码到应用程序中并不是一个好主意。 此密钥已被盗用,因为您的APK内容并非保密,因此可以从APK中提取密钥。如果你仍然认为你需要这样做,尽管有这个警告,请继续阅读。
要将私钥导入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));
最后,将私钥和证书导入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上的更多高级示例。