2014-11-21 17 views
7

Was ist der Unterschied zwischen SecretKey vs SecretKeySpec Klassen in Java?Warum wird eine SecretKeySpec benötigt, um einen Schlüssel aus einem Passwort in Java abzuleiten?

Die Dokumentation von SecretKeySpec sagt:

kann es eine SecretKey von einem Byte-Array

In diesem Code konstruieren, verwendet werden soll, wenn ich secretKey.getEncoded() oder secret.getEncoded(), in hex drucken dann beide geben die gleiche Ausgabe. Also, warum brauchen wir die SecretKeySpec? Hier

final String password = "test"; 
int pswdIterations = 65536 ; 
int keySize = 256; 
byte[] ivBytes; 
byte[] saltBytes = {0,1,2,3,4,5,6}; 

SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); 

PBEKeySpec spec = new PBEKeySpec(
        password.toCharArray(), 
        saltBytes, 
        pswdIterations, 
        keySize 
        ); 

SecretKey secretKey = factory.generateSecret(spec); 

SecretKeySpec secret = new SecretKeySpec(secretKey.getEncoded(),"AES"); 

ist der Ausgang beiden Anrufe zu getEncoded():

00367171843C185C043DDFB90AA97677F11D02B629DEAFC04F935419D832E697

Antwort

10

Jeder SecretKey hat einen zugeordneten Algorithmusnamen. Sie können SecretKey mit dem Algorithmus "DES" nicht in einem Kontext verwenden, in dem beispielsweise ein AES-Schlüssel benötigt wird.

in Ihrem Code die folgende Zeile erzeugt ein SecretKey:

SecretKey secretKey = factory.generateSecret(spec); 

jedoch an dieser Stelle ist der Schlüssel nicht ein Schlüssel AES. Wenn Sie secretKey.getAlgorithm() anrufen, ist das Ergebnis "PBKDF2WithHmacSHA1". Sie brauchen Java, um zu sagen, dass dies tatsächlich ein AES-Schlüssel ist.

Der einfachste Weg, dies zu tun, ist ein neues SecretKeySpec Objekt zu konstruieren, um die ursprünglichen Schlüsseldaten und explizit den Algorithmus Namen angeben:

SecretKeySpec secret = new SecretKeySpec(secretKey.getEncoded(),"AES"); 

Hinweis: Ich persönlich würde secret als SecretKey erklären, da ich glaube nicht, dass du dich später um die konkrete Umsetzung kümmern musst.

+0

„Jeder SecretKey hat einen zugehörigen Algorithmus Namen.“ Würde das die Verschlüsselung nicht weniger sicher machen? sollte key nicht unabhängig vom Algorithmus sein? Wenn zum Beispiel jemand den Schlüssel erhalten würde, wären sie nicht in der Lage, den Algorithmus zu identifizieren, der für die Verschlüsselung verwendet wird? –

+8

Starke Kryptographie funktioniert auf der Grundlage, dass jeder alles weiß, * außer * der Wert Ihres Schlüssels. Sobald jemand Ihren Schlüssel hat, ist es eine triviale Aufgabe, herauszufinden, wie Sie Daten verschlüsseln. Also nein, Ihr Algorithmus muss nicht geheim sein. –

7

SecretKey ist nur eine Schnittstelle, die providerspezifische Implementierung erfordert. SecretKeySpec ist eine konkrete Klasse, die eine einfache Konstruktion von SecretKey aus bestehendem Schlüsselmaterial ermöglicht. Um SecretKey zu erhalten, müssen Sie entweder eine geeignete Factory-Klasse oder SecretKeySpec als Abkürzung verwenden.

3

SecretKey eine Schnittstelle und SecretKeySpec ist eine Implementierung von SecretKey