我目前正在使用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作为参考,以及其他一些来源。
提前感谢您的帮助。
答案 0 :(得分:10)
我发现this是stackoverflow上未接受的答案:
“无法存储非PrivateKeys”错误消息通常表示您 正试图使用JKS密钥库类型的秘密对称密钥。该 JKS密钥库类型仅支持非对称(公共/私有)密钥。您 必须创建一个JCEKS类型的新密钥库来支持secret 密钥。
很难确认这一点,虽然我的记忆告诉我这是正确的。