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

5
我需要一个安全的存储器来存储对称密钥,同时支持.NET和Java。我需要能够以编程方式在两种语言中从同一存储器中存储和检索HmacSha*密钥,而不是通过命令行工具。
我的第一次尝试是使用PKCS12 keystore从Java生成并存储密钥,这是一种可移植的格式,我认为它支持存储X.509证书的私钥和密钥。
然而,到目前为止,我的经验是它不支持(注意:Java SE 6),在调用java.security.KeyStore.setKeyEntry()时抛出异常,指出我正在尝试存储的密钥不是PrivateKey。
我找到了一篇文章声称这应该是可能的:http://www.pixelstech.net/article/1420427307-Different-types-of-keystore-in-Java----PKCS12 但是,如果我从该文章中提取示例代码(标题为“存储秘密密钥”的部分下的示例),我会在调用setKeyEntry()时得到相同的异常。
是否有人知道我是否可以使用Java中的PKCS12 keystore满足这些要求?
顺便说一句,以下是代码:
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
使用非对称解决方案对我来说似乎是可以接受的。虽然不太高效,但可能足够高效了。 - Maarten Bodewes
1个回答

4
Java SE的KeyStore实现在后期版本中受到了很多关注。您的代码应该可以在Java SE 8上正常运行,适用于JCEKS密钥库,但不适用于Java SE 7。
您可能需要等待Java 9来支持PKCS#12。 Java 9将专注于支持PKCS#12密钥库。

糟糕 - 对我来说,Java 8可能不是一个选择,即使是这样,使用.NET API从PKCS12格式中提取对称密钥似乎会遇到问题 - 这些库假定您想要存储在PKCS12文件中的唯一内容是X.509对象。 - Hoobajoob
Java 7即将走到尽头。如果Java 8对你来说不是一个选择,那还有什么呢?是的,.NET和Java几乎都面向X509。最好跟随潮流... - Maarten Bodewes
将此标记为解决方案,因为它正确地说明了Java SE 7支持在PKCS密钥库中存储SecretKey。但实际上,似乎没有一种解决方案可以使用PKCS12在Java和.NET之间交换对称密钥。 - Hoobajoob
我在.NET中没有看到过类似于PKCS#12存储对称密钥的东西,但是我在.NET方面的熟练程度不如Java。如果存在的话,我应该早就看到了。 - Maarten Bodewes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接