2012-03-18 97 views
5

我需要知道是否有可能在没有提供'storepass'的情况下从KeyStore获取密钥。文档here“当从密钥库中检索信息,密码是可选的;如果没有密码,给出的检索信息的完整性不能被检查并显示警告”KeyStore无密码获取密钥

然而,当我尝试无密码获取密钥我得到“java.lang.IllegalArgumentException:密码不能为空”异常。

以下是我如何创建密钥库

密钥工具-genseckey -alias “的myKey” -keystore KEYSTORE.jks -storepass “密码” -storetype “JCEKS” -keyalg AES -keysize 128

我试过如下

final KeyStore keyStore = KeyStore.getInstance("JCEKS"); 
keyStore.load(new FileInputStream(new File("C:\\temp\\keytool\\KEYSTORE.jks")), 
    null); 
final Key key = keyStore.getKey("myKey", null); 

会抛出以下异常检索它

java.lang.IllegalArgumentException: password can't be null 
at com.sun.crypto.provider.SunJCE_z.<init>(DashoA13*..) 
at com.sun.crypto.provider.JceKeyStore.engineGetKey(DashoA13*..) 
at java.security.KeyStore.getKey(KeyStore.java:763) 

我完全误解了文档吗?有没有其他解决方法,因为我没有看到在我的代码中明确存储'storepass'的地方,因为每个人都可以看到它,因此使密码无用。

回答

4

如果没有提供storepass(用于访问私钥),那么它会尝试使用keypass,即密钥库密码,您也不提供该密码。
这就是为什么你会得到例外。
你不能有keypassstorepass
从你的链接:

对于-keypass选项,如果你不指定在命令行 选项,密钥工具将首先尝试使用密钥库密码 恢复私有/私钥,如果失败,那么将提示您 为私营/私钥密码

+0

是的,貌似我没有误会d ocumentation。那么有没有建议的解决方案来解决这个问题?我只是不能在代码中拥有这样的密码。谢谢 – Nishant 2012-03-19 16:28:34

+0

所以你的问题是为了避免代码中的硬编码密码?这是最常见的问题。你真的不能做太多的事情。推荐的方法一般是从用户请求密码。如果你不能这样做你可以做一些精心设计的例如对密码进行加密,但这并不会让你感到太多。也可以将责任委托给用户,即保持文件系统的安全。 – Cratylus 2012-03-19 16:47:06