2016-03-01 16 views
7

In den Java-Crypto-Bibliotheken gibt es zwei verschiedene Darstellungen eines Schlüssels - Key und KeySpec. Die Dokumente implizieren, es gibt einen Unterschied zwischen den beiden - ein KeySpec ist "transparent" (was auch immer das bedeutet), hat aber keine Methoden, während Key hat eine getEncoded Methode. Sie sollen eine KeyFactory verwenden, um zwischen den beiden zu konvertieren (und es hat tatsächlich eine getKeySpec Methode zu konvertieren).Was ist der Unterschied zwischen einem Key und einem KeySpec?

SecretKeySpec implementiert jedoch sowohl Key als auch KeySpec! Aber es gibt auch eine SecretKeyFactory Klasse, die nicht von KeyFactory erbt.

All dies hat mich gründlich verwirrt. Was ist der Unterschied zwischen einem Key und einem KeySpec, und wie kommen SecretKeySpec und SecretKeyFactory dazu?

Antwort

3

Transparent bedeutet hier, dass alle Klassen/Schnittstellen Implementierung/Verlängerung der KeySpec Schnittstelle sollen Metadaten über den Schlüssel offenbaren, in einem Provider unabhängige Art und Weise. Diese Metadaten werden niemals tatsächlich in üblichen Verwendungen des Schlüssels verwendet (Verschlüsselung usw.), sondern nur verwendet, wenn die mathematischen Eigenschaften des Schlüssels untersucht werden müssen. Die Kenntnis solcher providerunabhängiger Daten über den Schlüssel kann beispielsweise nützlich sein, wenn Sie den Schlüssel von/zu einem Bytestream generieren, den Schlüssel auf einem HSM einhängen oder sogar herausfinden möchten, ob ein Schlüssel schwach ist wie:

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

Welche Metadaten Sie über Ihren Schlüssel veröffentlichen möchten, liegt an Ihnen. KeySpec fungiert nur als Marker-Schnittstelle (Marker-Interface-Entwurfsmuster).

Wie bei den KeySpec zu solchen möglichen Selbstbeobachtung Gegensatz erzeugen die Schlüssel SecretKeyFactory „undurchsichtig“, in dem Sinne sind, die Sie nicht voll mathematische (Modul, Exponent, Codierung, etc.) und andere bekommen können (falls vorhanden wie DESKeySpec oben) Metadaten über den Schlüssel.

SecretKeySpec auf der anderen Seite ist aus der JCE der Box-Lösung für Schlüssel von Byte-Streams, und daher setzen sie sowohl Key und KeySpec zu erzeugen - zu erzeugen, um den Schlüssel KeySpec zur Verfügung gestellt und stellen die Schlüssel zur Verfügung mit Key.getEncoded().

2

Schlüsselobjekte und Schlüsselspezifikationen (KeySpecs) sind zwei verschiedene Darstellungen von Schlüsseldaten.

Codierer verwenden Schlüsselobjekte, um ihre Verschlüsselungsalgorithmen zu initialisieren, aber Schlüssel müssen möglicherweise in ein tragbareres Format für Übertragung oder Speicherung konvertiert werden.

Eine transparente Darstellung von Schlüsseln bedeutet, dass Sie auf jeden Schlüsselmaterialwert einzeln zugreifen können, und zwar über eine der in der entsprechenden Spezifikationsklasse definierten get-Methoden.

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). 

Wenn der Schlüssel auf einem Hardwaregerät gespeichert ist, seine Spezifikationsinformationen enthalten, die den Schlüssel auf der device.This Darstellung mit einer undurchsichtigen Darstellung steht im Gegensatz helfen bei der Identifizierung, wie durch die Key-Schnittstelle definiert, in dem Sie keinen direkten Zugriff auf die Schlüsselmaterialfelder haben. Mit anderen Worten, eine "undurchsichtige" Darstellung gibt Ihnen begrenzten Zugriff auf den Schlüssel - nur die drei Methoden, die von der Key-Schnittstelle definiert werden: getAlgorithm, getFormat und getEncoded.

Ein Schlüssel kann auf algorithmenspezifische Weise oder in einem algorithmusunabhängigen Codierungsformat (wie ASN.1) angegeben werden.

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). 

Die KeyFactory und SecretKeyFactory Klassen können zwischen opaken und transparenten Tastendarstellungen zu konvertieren, die verwendet werden, zwischen den Tasten und KeySpecs ist.

Referenz und weitere Informationen finden Sie unter: https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html#KeySpecs

Verwandte Themen