Android 将RSA密钥对导入密钥库

Android 将RSA密钥对导入密钥库,android,certificate,rsa,keystore,Android,Certificate,Rsa,Keystore,对于我的特定情况,我必须使用以下代码生成RSA密钥对(在我的Android应用程序中):- KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA/ECB/PKCS1Padding"); generator.initialize(1024,new SecureRandom()); KeyPair keyPair = generator.generateKeyPair); 如何将密钥对导入Android密钥库?我有时在I

对于我的特定情况,我必须使用以下代码生成RSA密钥对(在我的Android应用程序中):-

 KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA/ECB/PKCS1Padding");
 generator.initialize(1024,new SecureRandom());
 KeyPair keyPair = generator.generateKeyPair);
如何将密钥对导入Android密钥库?我有时在Internet上搜索,但没有找到如何为RSA公钥创建自签名证书以导入到keystone的方法


非常感谢任何提示,甚至是示例代码。

我假设,您明确需要在
AndroidKeyStore
之外生成密钥,并将它们导入
AndroidKeyStore
。在Android中,推荐的生成密钥的方法是将密钥生成到
AndroidKeyStore

将密钥导入
AndroidKeyStore
非常简单。但棘手的部分是生成自签名证书,因为Android SDK和Java本身都没有内置的X509证书生成器

您可以使用以下代码段生成和导入密钥:

KeyPairGenerator generator=KeyPairGenerator.getInstance(“RSA”);
初始化(2048,新的SecureRandom());
KeyPair KeyPair=generator.generateKeyPair();
证书自签名证书=生成自签名证书(密钥对);
证书[]certificateChain=新证书[]{selfSignedCertificate};
KeyStore KeyStore=KeyStore.getInstance(“AndroidKeyStore”);
keyStore.load(null);
keyStore.setKeyEntry(“有意义的密钥别名”,keyPair.getPrivate(),null,certificateChain);
棘手的部分,生成X509证书:

由于Android中没有提供生成
X509Certificate
的方法,我认为生成证书的最佳方法是使用一些值得信赖的加密库
BouncyCastle
是著名的证书生成工具之一,并且
BouncyCastle bcpkix
支持证书生成

在应用程序的
build.gradle
文件中添加依赖项:

implementation 'org.bouncycastle:bcpkix-jdk15on:1.64' // check for updated version
为您的需求实施
generateSelfSignedCertificate
方法,例如:

private X509Certificate generateSelfSignedCertificate(KeyPair KeyPair)抛出IOException、Operator CreationException、CertificateException{
AlgorithmIdentifier sigAlgId=new DefaultSignatureAlgorithmidIdentifierFinder().find(“SHA256withRSA”);//不要将SHA1与RSA一起使用。它不再安全。
AlgorithmIdentifier DigalId=新的DefaultDigestAlgorithmIdentifierFinder().find(SigalId);
AsymmetricKeyParameter keyParam=PrivateKeyFactory.createKey(keyPair.getPrivate().getEncoded());
SubjectPublicKeyInfo spki=SubjectPublicKeyInfo.getInstance(keyPair.getPublic().getEncoded());
ContentSigner signer=new BcRSAContentSignerBuilder(sigalid,digalid).build(keyParam);
X500名称发行人=新X500名称(“CN=Tolga Okur CA,L=Istanbul”);
X500Name主题=新X500Name(“CN=MyBeautifulApp,L=Istanbul”);
BigInteger serial=BigInteger.valueOf(1);//如果将使用唯一一个来标识此证书,则使用唯一一个进行更新
Calendar notBefore=Calendar.getInstance();
Calendar notAfter=Calendar.getInstance();
notAfter.add(Calendar.YEAR,20);//本证书有效期为20年。
X509v3CertificateBuilder v3CertGen=新X509v3CertificateBuilder(发行人,
电视连续剧
notBefore.getTime(),
notAfter.getTime(),
主题,,
spki);
X509CertificateHolder certificateHolder=v3CertGen.build(签名者);
返回新的JcaX509CertificateConverter().getCertificate(certificateHolder);
}
备选方案:

如果您要在服务器上生成密钥并希望将它们安全地导入到硬件支持的密钥库中,在Keymaster 4或更高版本附带的Android 9(API级别28)及更高版本之前,您可以使用