2016-03-01 166 views
7

在Java加密庫中,有兩個不同的密鑰表示 - KeyKeySpec。文檔暗示兩者之間存在差異 - 一個KeySpec是「透明的」(無論這意味着什麼),但沒有方法,而Key有一個getEncoded方法。您打算使用KeyFactory在兩者之間進行轉換(並且確實已獲得getKeySpec轉換方法)。Key和KeySpec有什麼區別?

然而,SecretKeySpec實現KeyKeySpec!但也有一個SecretKeyFactory類,它不會繼承關閉KeyFactory

這一切都讓我徹底困惑。 KeyKeySpec之間有什麼不同?SecretKeySpecSecretKeyFactory是如何進入的?

回答

3

透明這裏意味着所有的類/接口實現/延長KeySpec接口都應該揭示的關鍵元數據,以提供獨立的方式。這個元數據實際上並不用於密鑰的常見用途(加密等),而只在需要查看密鑰的數學屬性時才使用。例如,如果您想從/向字節流生成密鑰,如果密鑰位於HSM上,或者發現密鑰是否弱,如:

DESKeySpec.isWeak(byte[] key, int offset) 

無論您想要公開關於密鑰的元數據都取決於您。 KeySpec只是用作標記界面(標記界面設計模式)。

至於反對這種可能的自省與KeySpec,使用SecretKeyFactory生成的密鑰是「不透明」,因爲你不能得到數學(模數,指數編碼等)以及其它感(如果提供如上面的DESKeySpec)關於密鑰的元數據。

在另一方面SecretKeySpec是JCE的出用於從字節流鍵框溶液,因此,同時實現了KeyKeySpec - 生成使用提供KeySpec密鑰,使密鑰可用使用Key.getEncoded()

2

關鍵對象和關鍵規範(KeySpecs)是關鍵數據的兩種不同表示。

密碼使用密鑰對象來初始化他們的加密算法,但密鑰可能需要轉換爲更便攜的格式進行傳輸或存儲。

密鑰的透明表示意味着您可以通過相應規範類中定義的get方法之一單獨訪問每個密鑰材料值。

For example, DSAPrivateKeySpec defines getX, getP, getQ, and getG methods, to access the private key x, and the DSA algorithm parameters used to calculate the key(the prime p, the sub-prime q, and the base g). 

如果密鑰被存儲在硬件設備上,其說明書可以包含有助於識別在device.This表示的鍵是對比不透明表示,通過鍵接口所定義的信息,在其中無法直接訪問關鍵材料字段。換句話說,「不透明」表示使您能夠有限地訪問密鑰 - 只有Key接口定義的三種方法:getAlgorithm,getFormat和getEncoded。

密鑰可以按照特定於算法的方式或與算法無關的編碼格式(如ASN.1)指定。

For example, a DSA private key may be specified by its components x, p, q, and g (eg: DSAPrivateKeySpec), or it may be specified using its DER encoding (eg: PKCS8EncodedKeySpec). 

的的KeyFactory和SecretKeyFactory類可用於即,按鍵和KeySpecs之間不透明和透明鍵表示之間進行轉換。

參考,並提供更多的細節: https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html#KeySpecs

相關問題