【问题标题】:Java KeyStore setEntry() using an AES SecretKey使用 AES SecretKey 的 Java KeyStore setEntry()
【发布时间】: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


【解决方案1】:

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

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

虽然我的记忆告诉我这是正确的,但很难证实这一点。

【讨论】:

  • 如果您遵循我的解决方案并获得 JCEKS KeyStore 的实例,它应该可以工作。我正在使用的 oracle 示例具有误导性,因为他们跳过了这部分以获取密钥/私钥。
  • 如果有人使用 Android 4.3 中引入的“AndroidKeyStore”发现了这一点,那也是一样的,对称密钥(即 AES)不支持仅非对称。
  • @scottyab 谢谢 - 这正是我看到的问题。
  • 请注意,Java 9 默认会切换到 PKCS#12 ("PKCS12") 密钥存储格式。 PKCS#12 密钥存储应该允许存储SecretKey 实例(并且更安全地启动)。这个功能也应该在 Java 8 中,但不是默认的。 JCEKS 也可以是一种选择(正如问题下方的 cmets 中所指出的那样)。
猜你喜欢
  • 1970-01-01
  • 2016-08-11
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多