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

时间:2015-02-23 22:14:37

标签: cryptography keystore pkcs#12

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

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

到目前为止,我的经验是,它没有(注意:Java SE 6),在调用java.security.KeyStore.setKeyEntry()时抛出异常,抱怨我尝试的密钥store不是PrivateKey。

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

但是,如果我从该文章中提取示例代码(标题为&#34;存储密钥&#34;)下的示例,我会在同一个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格式导入/导出对称密钥,也没有直接的编程支持。似乎最好的支持方法是使用X.509密钥对来加密对称密钥,并将该对在PKCS12文件中与加密的对称密钥一起存储/传输到任何其他系统。需要使用对称密钥。

任何遇到同样问题的人都找到了可行的解决方案吗?

1 个答案:

答案 0 :(得分:3)

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

您可能需要等待Java 9以获得PKCS#12支持。 Java 9将专注于对PKCS#12密钥库的支持。