Android KeyChain API 旨在存储 SSL 证书和密钥:安装 PKCS#12 或受信任的根证书颁发机构证书时您自己的密钥。然后,所有应用程序都可以使用此密钥和证书。
这取决于您正在开发的应用程序的目的,但您可能应该考虑使用专用于您的应用程序的 KeyStore 来存储您收到的密钥,而不是 KeyChain API。
API(KeyStore 和 KeyChain)的另一个限制是不能直接存储公钥。你需要有一个证书。我建议你在你的应用程序中嵌入一个自签名证书,并使用这个证书来签署包含应用程序将收到的公钥的“虚拟”证书。
带有 bouncycastle 库的简化代码 sn-p 用于存储公共 RSA 密钥:
public void storeRSAPublicKey(String alias, BigInteger modulus, BigInteger exponent)
{
/** Load the key to generate the certificate */
KeyStore ks = getApplicationKeyStore();
KeyStore.PrivateKeyEntry entry = (KeyStore.PrivateKeyEntry)ks.getEntry(MY_PRIVATE_KEY, null);
X509Certificate issuerCert = (X509Certificate)entry.getCertificate();
PrivateKey skey = entry.getPrivateKey();
/** Prepare the certificate template */
RSAKeyParameters params = new RSAKeyParameters(false, modulus, exponent);
SubjectPublicKeyInfo pkInfo = SubjectPublicKeyInfoFactory.SubjectPublicKeyInfo(params);
X500Name issuer = new X500Name(issuerCert.getIssuerX500Principal().getName());
X500Name subject = new X500Name("CN=alias");
X509v3CertificateBuilder builder = new X509v3CertificateBuilder(issuer, randomSeriaNumber(), new Date(), dateIn20years(), subject, pkInfo);
/** Generate the certificate */
JcaContentSignerBuilder csBuilder = new JcaContentSignerBuilder("SHA256withRSA");
ContentSigner signer = csBuilder.build(skey);
X509CertificateHolder holder = builder.build(signer);
/** Store the certificate in the KeyStore */
JcaX509CertificateConverter conv = new JcaX509CertificateConverter();
X509Certificate cert = conv.getCertificate(holder);
ks.setCertificateEntry(alias, cert);
pushKeyStoreToPersistentStorage(ks);
现在你可以通过ks.getCertificateEntry(alias);获得证书
请注意,我省略了一些非基本代码,例如序列号生成和非过期日期计算。
您可以使用keytool 创建初始 KeyStore,并将其作为资源添加到您的应用中。