2014-04-08 22 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提供商甚至也是如此。有關於擴展這些類的討論,但是討論!=實現。 –