我正在尝试将自己的秘密密钥存储在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密钥库中存储并获取我自己的秘密吗?
答案 0 :(得分:0)
您确定上面的代码有效吗?因为DSA
是非对称算法,而不是对称算法。如果确定它是密钥,则必须为AES
或DES
或DESede
(三重DES)。您的上述代码应该失败。
以及您的问题的答案:
Triple DES
或DES
键。 DES / TripleDES使用奇偶校验位,并且Java API SecretKeySpec
纠正了奇偶校验位。这会使密钥看起来与原始密钥不同,但实际上是相同的。您可以了解有关奇偶校验位here的更多信息。作为最佳实践,您不应将秘密密钥存储在PKCS12
密钥库中。互联网标准定义PKCS12
密钥库应仅包含一个与其证书链相关联的KeyPair
条目。尽管它可以包含多个条目,但理想的情况是只包含一个条目,key password
与keystore password
相同。它们也可以存储密钥,但是最好以JCEKS
密钥库格式存储它们。