gpt4 book ai didi

java - 如何在android keystore 中存储私钥?

转载 作者:行者123 更新时间:2023-12-01 23:53:09 49 4
gpt4 key购买 nike

我想将私钥存储在 android KeyStore 中,但我遇到 KeyStore.getInstance("JKS") 的问题,错误如下:java.security.KeyStoreException:未找到 JKS。

请帮助我为什么不知道这个实例?

  • 我有文件加载我的 keystore :mykeystore.jks

我的代码如下:

try {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
KeyPair keyPair = keyPairGenerator.genKeyPair();
X509Certificate certificate = generateCertificate(keyPair);
KeyStore ks = KeyStore.getInstance("JKS");
char[] password = "xxxxxx".toCharArray();
try (FileInputStream fis = new FileInputStream("path\\mykeystore.jks")) {
ks.load(fis, password);
}
Certificate[] certChain = new Certificate[1];
certChain[0] = certificate;
ks.setKeyEntry("key1", keyPair.getPrivate(), password, certChain);

} catch(Exception e) {
e.printStackTrace();
}
  • 结果错误:java.security.KeyStoreException:未找到 JKS

最佳答案

Java KeyStore (JKS) 在 Android 上不可用

Android 上推荐的 keystore 是 AndroidKeyStore。对于您的情况,使用 AndroidKeyStore 而不是 JKS 获取 keystore 实例,并将密码设置为 null 因为 AndroidKeyStore 不接受任意密码:

//...
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
//...
ks.setKeyEntry("key1", keyPair.getPrivate(), null, certChain);

AndroidKeyStore 中,您无法为 key 或 keystore 设置密码,因为 keystore 文件由 Android 系统本身管理。此外,在 AndroidKeyStore 内部生成 key 而不是导入(例如调用 setKeyEntry)是更安全且推荐的方式。(在支持的设备中,Android 在以下位置生成 key )分离的安全硬件。这意味着,任何人(包括应用程序本身)都无法从该设备导出 key )

因此,使用 KeyGenParameterSpec.Builder 而不是 KeyPairGenerator 生成 key 。

您可以在此处查看文档:https://developer.android.com/training/articles/keystore

但是,如果您认为 AndroidKeyStore 仍然不适合您,您可以通过以下方式列出 Android 中可用的 keystore 类型:

// Iterate in security providers
for(Provider provider: Security.getProviders()) {
for(Object item: provider.keySet()) {
if(item.toString().startsWith("KeyStore.")) { // grep KeyStores
Log.d(TAG, "Keystore: " + item.toString() + " available in provider: " + provider.getName());
}
}
}

在 Android 模拟器 Pixel 2 API 28 中,此代码输出:

Keystore: KeyStore.BouncyCastle available in provider: BC
Keystore: KeyStore.PKCS12 available in provider: BC
Keystore: KeyStore.BKS available in provider: BC
Keystore: KeyStore.AndroidCAStore available in provider: HarmonyJSSE
Keystore: KeyStore.AndroidKeyStore available in provider: AndroidKeyStore

这意味着可用的 KeyStore 是:

BouncyCastle
PKCS12
BKS
AndroidCAStore
AndroidKeyStore

关于java - 如何在android keystore 中存储私钥?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58213793/

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