簡體   English   中英

如何將私鑰存儲在 android 密鑰庫中?

[英]How to store private key in android keystore?

我想將私鑰存儲在 android KeyStore 中,但是 KeyStore.getInstance("JKS") 的問題是這樣的錯誤:java.security.KeyStoreException: JKS not found。

請幫助我為什么不知道這種情況?

  • 我有文件加載我的密鑰庫: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 上推薦的密鑰庫是AndroidKeyStore 對於您的情況,使用AndroidKeyStore而不是JKS獲取密鑰庫實例並將密碼設置為null因為AndroidKeyStore不接受任何密碼:

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

AndroidKeyStore中,您不能為密鑰或密鑰庫設置密碼,因為密鑰庫文件由 Android 系統本身管理。 此外,在AndroidKeyStore內部生成密鑰而不是導入(例如調用setKeyEntry )是更安全和推薦的方式。 (在受支持的設備中,Android 在單獨的安全硬件中生成密鑰。這意味着,包括應用程序本身在內的任何人都無法從該設備導出密鑰)

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

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

但是如果您認為AndroidKeyStore仍然不適合您,您可以通過以下方式列出 Android 中可用的密鑰庫類型:

// 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 Emulator 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM