2015-10-20 440 views
1

我有生成實現該接口爲java.security.PrivateKey一個類的實例的Java代碼(實際目的是sun.security.rsa.RSAPrivateCrtKeyImpl的一個實例)。此代碼的目的是生成一個PrivateKey,然後將其分成多個部分(密鑰部門),然後將這些共享存儲在智能卡上。股份部分工作正常,我的問題是如何處理PrivateKey一旦不再需要。我想從內存中刪除一個PrivateKey(sun.security.rsa.RSAPrivateCrtKeyImpl)的祕密信息?

有該專用密鑰信息(應保密)應該從內存中儘快被刪除,但是已經分裂成股份後的要求。

接口專用密鑰擴展接口破壞的,但我沒有看到被任何地方實施破壞的(必須在某處這種層次結構來實現)的方法。但是如果我在我有的PrivateKey上調用destroy(這是一個RSAPrivateCrtKeyImpl),那麼它會拋出一個javax.security.auth.DestroyFailedException。

,我有對象似乎完全不可改變的,有沒有辦法覆蓋對象中的字段?如將它們設置爲零?或者從內存中刪除這些祕密的不可變對象應該遵循什麼方法?謝謝!

回答

0

不,你不能。密鑰創建的Java軟件實現使用BigInteger,這確實是不可變的。正如你可能已經發現Destroyable.destroy方法僅在少數類中實現。從Java 7的這些是直接實現類:

KerberosKey, KerberosTicket, KeyStore.PasswordProtection, X500PrivateCredential 

我猜想,這些類實現Destroyable.destroy,但所有的其他人沒有。

因此,您唯一能做的就是依靠垃圾回收器和操作系統來清理和/或覆蓋BigInteger實例。請注意,當使用私鑰時,會有相同的問題。


如果你已經有一個智能卡,我會建議使用智能卡來生成和拆分密鑰。在內部生成密鑰,然後使用對稱AES密鑰對密鑰進行加密,拆分AES密鑰並將封裝的RSA密鑰和(剩餘的2個)密鑰部件從智能卡中移出。而不是從字面上分割關鍵字。