如何在Java 8 PKCS12密钥库中存储和获取自己的正确密钥

时间:2019-03-12 06:30:49

标签: java keystore pkcs#12

我正在尝试将自己的秘密密钥存储在PKCS12密钥库中。我尝试使用以下代码:

char[] passArray = "password".toCharArray();// this is key store pass

String key  = "test123"; // this is my own secret key

// Loading a Keystore
KeyStore p12KeyStore = KeyStore.getInstance("PKCS12");
p12KeyStore.load(new FileInputStream("testKeyStore.p12"), passArray);

存储自己的密钥,如下所示:

byte [] byteKey = key.getBytes();

SecretKeySpec keySpec = new SecretKeySpec(byteKey, "DSA");

KeyStore.SecretKeyEntry secret = new KeyStore.SecretKeyEntry(keySpec);

KeyStore.ProtectionParameter password = new KeyStore.PasswordProtection(passArray);

p12KeyStore.setEntry("secret-key", secret, password);

但是我不确定是否根据最佳实践存储自己的密钥。以及尝试从密钥库中获取我自己的密钥时,因为它不像我原来的秘密密钥那样。

Key eKey = p12KeyStore.getKey("secret-key", passArray);

有人可以帮我在PKCS12密钥库中存储并获取我自己的秘密吗?

1 个答案:

答案 0 :(得分:0)

您确定上面的代码有效吗?因为DSA是非对称算法,而不是对称算法。如果确定它是密钥,则必须为AESDESDESede(三重DES)。您的上述代码应该失败。

以及您的问题的答案:

  • 就像数据库存储数据一样,密钥(秘密密钥和密钥对)和证书也应存储在密钥库中,这就是它们应位于应用程序中的位置。您应该从密钥库中引用/检索它们。
  • 从您在其中一项陈述中所说,该密钥与您最初存储和检索时的密钥不同,据此判断,我认为您拥有的密钥是Triple DESDES键。 DES / TripleDES使用奇偶校验位,并且Java API SecretKeySpec纠正了奇偶校验位。这会使密钥看起来与原始密钥不同,但实际上是相同的。您可以了解有关奇偶校验位here的更多信息。

作为最佳实践,您不应将秘密密钥存储在PKCS12密钥库中。互联网标准定义PKCS12密钥库应仅包含一个与其证书链相关联的KeyPair条目。尽管它可以包含多个条目,但理想的情况是只包含一个条目,key passwordkeystore password相同。它们也可以存储密钥,但是最好以JCEKS密钥库格式存储它们。