2016-03-01 7 views
7

Java暗号ライブラリでは、鍵の異なる表現が2つあります(KeyKeySpec)。ドキュメントには、KeySpecが「トランスペアレント」(それが何であれ)がありますが、方法はありませんが、KeyにはgetEncodedというメソッドがあります。あなたはKeyFactoryを使用して2つの間で変換することを意図しています(実際に変換する方法はgetKeySpecです)。KeyとKeySpecの違いは何ですか?

しかし、SecretKeySpecは、KeyKeySpecの両方を実装しています。しかしを継承しないSecretKeyFactoryクラスもあります。

これはすべて私を徹底的に混乱させてしまいました。 KeyKeySpecの違いは何ですか?SecretKeySpecSecretKeyFactoryはどのように入力されますか?

答えて

3

は、すべてのクラス/インタフェースがKeySpecインタフェースを拡張する/実装するプロバイダに依存しない方法で、キーに関するメタデータを明らかにすることになっていることを意味します。このメタデータは、キーの一般的な使用(暗号化など)では決して使用されませんが、キーの数学的属性を調べる必要がある場合にのみ使用されます。このようなプロバイダーに依存しないキーに関する知識は、たとえば、バイトストリームからキーを生成する場合、HSM上にある場合はキーをフックする場合、またはキーが弱いかどうかを調べる場合などに便利です。

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

あなたのキーについて公開したいメタデータはすべてあなたのものです。 KeySpecはマーカーインターフェイス(マーカーインターフェイスデザインパターン)として機能します。、SecretKeyFactoryを使用して生成されたキーが「不透明」で提供される場合(あなたがフル数学(モジュラス、指数、エンコーディングなど)やその他を得ることができないという意味で、KeySpecでそのような可能なイントロスペクションとは対照的に

上記のようなDESKeySpecのような)メタデータ。一方

SecretKeySpecはバイトストリームからキーを生成するためのボックスソリューションのJCEの外であるため、それはKeyKeySpecの両方を実装する - 提供KeySpecを使用してキーを生成し、Key.getEncoded()を使用してキーを利用できるようにします。

2

キーオブジェクトとキー仕様(KeySpec)は、キーデータの2つの異なる表現です。

暗号化では、暗号化アルゴリズムを初期化するために鍵オブジェクトを使用しますが、送信または格納のために鍵をより移植性の高いフォーマットに変換する必要があります。

キーの透過表示は、対応する仕様クラスで定義されている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の3つのメソッドだけです。

鍵は、アルゴリズム固有の方法またはアルゴリズムに依存しない符号化形式(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

関連する問題