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