2014-04-08 23 views
1

我有一个简单的基于Clifford Cocks基本技术的RSA算法。我有这一切工作,但我需要将我的私钥和公钥存储在KeyStore中,以便服务器和客户端可以使用密钥共享文件。使用KeyStore存储自己制作的密钥-Java

我做了一些研究,发现了关于'keytool'的命令,但是它为您创建了使用RSA或DES的密钥,我不知道如何使用它来存储我自己的密钥。有什么办法可以解决这个问题吗?

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

谢谢。

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

+0

的可能重复[?如何使用密钥库中的Java存储私钥(http://stackoverflow.com/问题/ 9890313 /如何使用密钥存储在java中的存储私钥) – Drunix

+0

@Drunix如果这是一个普通的私钥,这将是一个骗局。现在不是很多。 –

+0

@owlstead:至少在链接帖子中接受的答案显示了如何在不使用密钥库的情况下存储公钥,如果您将密钥的模数和指数设置为BigIntegers。私钥可以做同样的事情。所以如果我们不把它称为完美的重复,那么答案可能非常有用。此外,他们还演示了如何使用KeySpecs将作为组件给定的键转换为键。所以如果OP真的想要使用密钥库,这可能会有所帮助(留下从公钥创建证书的问题)。 – Drunix

回答

1

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

但是,要使用现有的KeyStore提供程序,您需要将密钥转换为该提供程序所需的格式进行存储。一旦您从密钥存储区取回密钥,您需要执行反向转换回您自己的私人/公共密钥类。

对我来说,这似乎是一个非常大的努力,以获得将钥匙推入KeyStore对象的最小好处。我建议你考虑使用序列化数据制作自己简单的存储方案。

1

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

你也可以创建自己的KeyStore实现,但这似乎是一个巨大的工作量。在你自己的提供者中实现KeyStoreSpi稍微不复杂,但它需要你的提供者使用私钥和由Oracle签名的证书进行签名。

基本上我会去上面解释的自签名证书技巧或与邓肯提出的序列化方案。


对于非信徒:

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) 
+0

KeyStore.Entry.PrivateKeyEntry究竟是什么,如果你不能存储私钥?当然可以。 [Javadoc](http://docs.oracle.com/javase/7/docs/api/java/security/KeyStore.html)甚至提供了示例。 – EJP

+2

@EJP“这种类型的条目拥有一个加密的PrivateKey,它可以选择以受保护的格式存储以防止未经授权的访问**它还附带一个相应公钥的证书链**” –

+0

@EJP基本上目前的KeyStore类及其实现仅针对基于X5.09的PKI。 Sun的PKCS#11提供商甚至也是如此。有关于扩展这些类的讨论,但是讨论!=实现。 –