gpt4 book ai didi

android - 使用 Android KeyChain API 交换公钥

转载 作者:行者123 更新时间:2023-11-29 01:47:14 25 4
gpt4 key购买 nike

我正在尝试编写一个应用程序,使用户能够通过蓝牙/NFC 交换他们的公钥(例如 RSA)。要存储和稍后检索 key ,我想使用 Android's KeyChain API.

到目前为止,我已经阅读了在线 API 文档和一些教程/示例。它们都涉及从 PKCS12 文件导入钥匙串(keychain),该文件包含私钥和相应的公钥和证书。导入此文件后,将返回别名字符串以供后续引用。到目前为止,还不错。

但是,我想做的是接收某人的公钥,存储它,取回别名,将该别名存储在某处(例如联系人数据),并在用户想要加密消息时使用它来检索公钥给那个人。那可能吗?我对公钥密码学的经验很少,感觉我误解了 KeyChain API 的全部目的。

任何帮助将不胜感激!谢谢。

最佳答案

Android KeyChain API 旨在存储 SSL 证书和 key :安装 PKCS#12 或受信任的根证书颁发机构证书时您自己的 key 。此 key 和证书随后可用于所有应用程序。

这取决于您正在开发的应用程序的目的,但您可能应该考虑使用专用于您的应用程序的 KeyStore 来存储您收到的 key ,而不是 KeyChain API。

两个 API(KeyStore 和 KeyChain)的另一个限制是不能直接存储公钥。你需要有证书。我建议您在您的应用程序中嵌入一个自签名证书,并使用该证书签署包含应用程序将收到的公钥的“虚拟”证书。

使用 bouncycaSTLe 库存储公共(public) RSA key 的简化代码 fragment :

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,并将其作为资源添加到您的应用中。

关于android - 使用 Android KeyChain API 交换公钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20704046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com