【发布时间】:2014-11-12 19:56:15
【问题描述】:
我目前正在研究 Java 中的密钥处理类,特别是使用 KeyStore。我正在尝试使用 AES 实例生成 SecretKey,然后使用 setEntry() 方法将其放置在 KeyStore 中。
我已经包含了我的代码的相关部分:
// The KS Object
private KeyStore keyStore;
private KeyStore.SecretKeyEntry secretKeyEntry;
private KeyStore.ProtectionParameter protectionParameter;
private KeyGenerator keyGenerator;
private SecretKey secretKey, newSecretKey;
keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(256);
newSecretKey = keyGenerator.generateKey();
protectionParameter = new KeyStore.PasswordProtection(KEYSTORE_PASSWORD.toCharArray());
secretKeyEntry = new KeyStore.SecretKeyEntry(newSecretKey);
keyStore.setEntry(KEYSTORE_ALIAS, secretKeyEntry, protectionParameter);
我使用的两个常量也被定义为字符串。
我不断收到的异常是在我的 setEntry() 调用中:
java.security.KeyStoreException: Cannot store non-PrivateKeys
at sun.security.provider.JavaKeyStore.engineSetKeyEntry(Unknown Source)
at sun.security.provider.JavaKeyStore$JKS.engineSetKeyEntry(Unknown Source)
at java.security.KeyStoreSpi.engineSetEntry(Unknown Source)
at java.security.KeyStore.setEntry(Unknown Source)
我主要使用此文档 http://docs.oracle.com/javase/7/docs/api/java/security/KeyStore.html 作为参考,以及其他一些来源。
提前感谢您的帮助。
【问题讨论】:
-
所以我假设您使用的是 Java 7 运行时环境?你能打印出精确的版本吗?您是否安装了无限加密策略文件?
-
你是如何初始化(加载)密钥库的?我检索到了相同的异常,但我确实必须插入一个特定的方法来加载
KeyStore实例。 -
我在 .load( , KEYSTORE_PASSWORD.toCharArray()) 方法上使用 FIS 或空参数加载了 KeyStore。
-
在修改了代码并进行了更多搜索之后,我将使用的 KS 实例从 (KeyStore.getDefaultType()) 更改为简单的 ("JCEKS")。这似乎解决了问题。
-
看我的回答:)。请注意,您的 question 更中肯,所以我不会称其为骗子。
标签: java encryption aes keystore