使用AES SecretKey的Java KeyStore setEntry()

使用AES SecretKey的Java KeyStore setEntry(),java,encryption,aes,keystore,Java,Encryption,Aes,Keystore,我目前正在Java中开发一个密钥处理类,特别是使用密钥库。我试图用一个AES实例生成一个SecretKey,然后使用setEntry()方法将其放入密钥库中 我已经包含了代码的相关部分: // The KS Object private KeyStore keyStore; private KeyStore.SecretKeyEntry secretKeyEntry; private KeyStore.ProtectionParameter protectionParameter; priv

我目前正在Java中开发一个密钥处理类,特别是使用密钥库。我试图用一个AES实例生成一个SecretKey,然后使用setEntry()方法将其放入密钥库中

我已经包含了代码的相关部分:

// 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()调用中:

我主要使用此文档作为参考,以及一些其他来源

提前感谢您的帮助。

我在stackoverflow上找到了一个不被接受的答案:

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


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

所以我认为您使用的是Java 7运行时环境?你能打印出准确的版本吗?您是否安装了无限制加密策略文件?您是如何初始化(加载)密钥存储的?我检索到了相同的异常,但我必须插入一个特定的方法来加载
密钥库
实例。我使用FIS或.load(,KeyStore\u PASSWORD.toCharArray())方法上的null参数加载密钥库。在处理代码和进行更多搜索后,我更改了我使用的KS实例(KeyStore.getDefaultType()。请注意,您的问题更切中要害,因此我不会将其称为dupe。如果您遵循我的解决方案并获得一个JCEKS密钥库实例,它应该可以工作。我所使用的oracle示例具有误导性,因为他们跳过了这一部分以获取机密/私钥。如果有人使用Android 4.3中引入的“AndroidKeyStore”发现了这一点,那就是对称密钥(即AES)不仅不支持非对称。@scottyab谢谢-这正是我看到的问题。请注意,默认情况下,Java 9将切换到PKCS#12(
“PKCS12”
)密钥存储格式。PKCS#12密钥存储应允许存储
SecretKey
实例(并使引导更安全)。这个功能也应该在Java8中,但不是默认的。JCEKS也可以是一种选择(正如问题下面的评论中所注意到的)。
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)