java - 如何在 Java 8 PKCS12 密钥库中存储和获取自己的 screct 密钥
问题描述
我正在尝试将自己的密钥存储在 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
or DES
or DESede
(Triple DES)。您上面的代码应该失败了。
并回答您的问题:
- 就像数据库存储数据一样,密钥(秘密密钥和密钥对)和证书应该存储在密钥库中,它们应该驻留在您的应用程序中。您应该从密钥库中引用/检索它们。
- 根据您在其中一个陈述中所说的,密钥与您最初存储然后检索时的密钥不同,由此判断,我认为您拥有的密钥是 a
Triple DES
或 aDES
密钥。DES/TripleDES 使用奇偶校验位,奇偶校验位由 Java API 纠正SecretKeySpec
。这导致密钥看起来与原始密钥不同,但实际上是相同的。您可以在此处阅读有关奇偶校验位的更多信息。
作为最佳实践,您不应该将密钥存储在PKCS12
Keystore 中。Internet 标准定义PKCS12
密钥库应仅包含一个KeyPair
与其证书链关联的条目。即使它可以包含多个条目,但最好只有一个条目,key password
与keystore password
. 它们也可以存储密钥,但最好以JCEKS
密钥库格式存储它们。
推荐阅读
- javascript - Javascript 动态元素创建导致 HTML 中的阴影内容
- mongodb - Mongodb集合设计
- math - 我想知道我是否可以使用 Prolog 进行解析推理
- jenkins - 在哪里可以在我的 ubuntu 机器中找到新的重置密码路径?
- variables - 如何在 ABB codesys 中存储负值
- javascript - Next.js 和 Express.js,只为网页运行认证中间件
- python - 预期的二维数组,得到了标量数组:
- python - asyncio 错误 = rs.append(await session.get(urls)) RuntimeError: Task got bad yield:
- java - Springboot中如何配置@Transactional对Redis的支持?
- javascript - CSS 和 Material UI - 如何让表格内容只向下扩展 || 如何设置容器顶部的固定位置