使用KeyStore -Java存储自己创建的密钥

时间:2014-04-08 18:24:34

标签: java rsa keystore

我有一个基于Clifford Cocks基本技术的简单RSA算法。我已经完成了所有工作,但我需要将我的私钥和公钥存储在KeyStore中,以便服务器和客户端可以使用密钥共享文件。

我做了一些研究,我发现了'keytool'这个命令,但它为你创建了使用RSA或DES的密钥,而且我不知道如何使用它来存储我自己的密钥。有没有办法解决这个问题?

或者如何使用KeyStore类解决这个问题?

感谢。

PD:密钥现在存储在BigIntegers中。但我认为这不重要。

2 个答案:

答案 0 :(得分:1)

听起来您已经开发了自己的RSA算法实现并拥有自己的私钥和公钥类。我将假设这是出于教育目的而避免使用现有实现的咆哮。

但是,要使用现有的KeyStore提供程序,您需要将密钥转换为该提供程序所需的格式以进行存储。从密钥库中检索密钥后,您需要执行反向转换回您自己的私钥/公钥类。

对我而言,将密钥推入KeyStore对象的最小好处似乎是一项非常艰巨的工作。我建议你考虑使用序列化数据制作自己的简单存储方案。

答案 1 :(得分:1)

根据this article,公钥和私钥与" normal"没有什么不同。 RSA密钥。因此,您可以使用相同的RSAPublicKeyRSAPrivateCrtKey作为容器。问题是KeyStore实现非常有限(pkcs#12,jks,jceks) - 它们不能用于存储单个私钥。您需要为公钥创建证书链。这可能是一个自签名证书,但存储密钥非常麻烦。

你也可以创建自己的KeyStore实现,但这似乎是一大堆工作。在您自己的提供商中实施KeyStoreSpi稍微复杂一点,但它要求您的提供商使用私钥和Oracle签署的证书进行签名。

基本上我会使用上面解释的自签名证书技巧或Duncan提出的序列化方案。


非信徒:

Exception in thread "main" java.lang.IllegalArgumentException: invalid zero-length input chain
    at java.security.KeyStore$PrivateKeyEntry.<init>(KeyStore.java:393)

Exception in thread "main" java.lang.NullPointerException: invalid null input
    at java.security.KeyStore$PrivateKeyEntry.<init>(KeyStore.java:390)