3

我目前正在研究 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作为参考,以及其他一些来源。

提前感谢您的帮助。

4

1 回答 1

10

我在stackoverflow上发现这是一个不被接受的答案:

“无法存储非私有密钥”错误消息通常表明您正在尝试使用具有 JKS 密钥库类型的秘密对称密钥。JKS 密钥库类型仅支持非对称(公共/私有)密钥。您必须创建一个 JCEKS 类型的新密钥库来支持密钥。

很难证实这一点,尽管我的记忆告诉我这是正确的。

于 2013-08-15T01:08:46.137 回答