如何在 Java PKCS12 密钥库中存储对称密钥

How to store symmetric secret key in Java PKCS12 keystore

我需要一个适用于 .NET 和 Java 的对称密钥安全存储区。我需要能够以编程方式,而不是通过命令行工具,以两种语言从同一商店存储和检索 HmacSha* 密钥。

我的第一次尝试是使用 PKCS12 密钥库从 Java 生成和存储密钥,这是一种可移植格式,我认为它支持存储秘密密钥以及私钥X.509 证书。

不过,到目前为止,我的经验是它没有(注意:Java SE 6),在调用 java.security.KeyStore.setKeyEntry() 时抛出异常,抱怨我的关键试图存储的不是私钥。

我发现一篇文章声称这应该是可能的:http://www.pixelstech.net/article/1420427307-Different-types-of-keystore-in-Java----PKCS12

但是,如果我从那篇文章中提取示例代码(标题为 "Store secret key" 的部分下的示例),我会在对 setKeyEntry() 的同一次调用中得到相同的异常。

有人知道我在 Java 中使用 PKCS12 密钥库是否可以满足这些要求吗?

FWIW,这是代码:

public void gen( String thePath, String thePassword ) throws Exception {
    KeyGenerator keygen = KeyGenerator.getInstance("HmacSHA1");
    Key key = keygen.generateKey();

    KeyStore keystore = KeyStore.getInstance("PKCS12");
    keystore.load(null, null);

    // This call throws an exception
    keystore.setKeyEntry("theKey", key, thePassword.toCharArray(), null);
    keystore.store( new FileOutputStream(thePath), thePassword.toCharArray() );
}

编辑: 嗯 - 在 .NET 方面对此进行调查表明,也没有对使用 PKCS12 格式的 importing/exporting 对称密钥的直接编程支持。似乎最受支持的方法是拥有一个用于加密对称密钥的 X.509 密钥对,并将 store/transport PKCS12 文件中的该对与加密的对称密钥一起用于任何其他需要使用对称密钥的系统。

有人遇到同样的问题并找到了可行的解决方案吗?

Java SE 的 KeyStore 实现在后来的版本中获得了很多关注。对于 JCEKS 密钥存储,您的代码应该 运行 在 Java SE 8 上正常,但在 Java SE 7 上不正常。

您可能需要等待 Java 9 才能获得 PKCS#12 支持。 Java9 将重点支持 PKCS#12 密钥存储。