今天下午我必须这样做,@JasonG 的解决方案有效,但 keytool 选项无效。
从 Java 8 开始,您可以将 -importpass 选项与 Keytool 一起使用,这将帮助您实现所需。
假设我想将敏感密码foobar 保存在名为myks.jceks 的密钥库中的mypass 别名中,此处使用密码password 保护,请执行以下操作:
$ keytool -importpass -storetype pkcs12 -alias mypass -keystore myks.p12
Enter keystore password: <password>
Re-enter new password: <password>
Enter the password to be stored: <foobar>
Re-enter password: <foobar>
Enter key password for <mypass>
(RETURN if same as keystore password): <password>
Re-enter new password: <password>
然后你可以使用与@JasonG 相同的代码,我的代码中有这个:
private Try<String> loadKey(Resource path, String pw) {
return Try.of(() -> {
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(path.getInputStream(), pw.toCharArray());
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBE");
SecretKeyEntry ske = (SecretKeyEntry) ks.getEntry("mypass",
new PasswordProtection(pw.toCharArray()));
PBEKeySpec keySpec = (PBEKeySpec) factory.getKeySpec(
ske.getSecretKey(), PBEKeySpec.class);
return new String(keySpec.getPassword());
});
}
请注意,由于 JCEKS 使用专有格式,因此我使用了 PKCS12,建议迁移到行业标准格式 PKCS12。
此外,我们遇到了一些问题,一些 Windows 机器(运行 Java 8)在尝试加载 JCEKS 存储时卡住,引发异常。 PKCS12 似乎是更好的选择。