关于安全性:java密钥库和密码设置

java keystore and password settings

我在Java密钥库和密钥工具上有以下问题。我假设一个密钥库可能有一个以上的证书。正如我所尝试的,通过keytool,我可以创建一个密钥库,要访问这个密钥库,我必须设置一个密码。另外,要访问每个证书条目,我必须设置密码。对于密钥存储库和条目是否必须具有相同的密码?如果没有(我认为这样做是合理的),为什么要使用以下代码:

1
2
3
4
char[] pwd = new char[]{'s','e','c','r','e','t'};
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(new FileInputStream("myPersonal.keystore"), pwd);
kmf.init(ks, pwd);//fails here with exception

给我以下例外情况?

1
2
3
4
5
Exception in thread"main" java.security.UnrecoverableKeyException: Cannot recover key
    at sun.security.provider.KeyProtector.recover(Unknown Source)
    at sun.security.provider.JavaKeyStore.engineGetKey(Unknown Source)
    at sun.security.provider.JavaKeyStore$JKS.engineGetKey(Unknown Source)
    at java.security.KeyStore.getKey(Unknown Source)

secret是访问我通过keytool创建的keystore myPersonal.keystore的密码。其中有2个条目,用于证书、1个DSA和1个RSA。每个密钥库都有不同的密码(以及彼此)。现在代码是正确的,因为如果我使用一个具有与密钥库相同密码的单个证书条目的密钥库,就没有异常,并且程序运行良好。

那么这里的问题是什么呢?我不应该有不同的密码?我不应该有很多证书?或者什么?


按照API的指定,keymanagerFactory.init方法接受用于从密钥库检索密钥的密码。因为只有一个密码参数,所以所有密钥的密码都是相同的。如果其中一个密钥使用了不同的密码,则会出现错误,因为该密码对于特定的密钥库条目不正确。

最简单的解决方案是对密钥库中的所有条目使用相同的密码。如果设置为维护每个条目的不同密码,则可能需要构建自己的自定义安全元素,例如keymanager。