2010-03-03 6 views
16

Ich mache Passwort-basierte Dateiverschlüsselung in Java; Ich verwende AES als zugrundeliegenden Verschlüsselungsalgorithmus und PBKDF2WithHmacSHA1, um einen Schlüssel aus einer Salz- und Passwortkombination mit dem folgenden Code abzuleiten (den ich von einem anderen großzügigen Poster auf dieser Seite bekommen habe).Passwort-Verifizierung mit PBKDF2 in Java

SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); 
KeySpec ks = new PBEKeySpec(password,salt,1024,128); 
SecretKey s = f.generateSecret(ks); 
Key k = new SecretKeySpec(s.getEncoded(),"AES"); 

ich das Salz teilen, gibt der Benutzer sein Passwort an jedem Ende und die Verschlüsselung und Entschlüsselung funktionieren :-) Mein Problem ist, dass ich überprüfen möchte in der Lage sein, dass das Passwort der Benutzer richtig hineingeht, ist vor Einstieg in den (möglicherweise langen) Entschlüsselungsprozess. Ich weiß, dass die PBKD-Spezifikation einen optionalen 2-Byte-Verifizierungswert enthält, aber ich bin mir nicht sicher, wie ich diesen Wert mithilfe des obigen Ansatzes erzeugen kann. Bietet Java Unterstützung dafür oder wenn nicht, was wäre eine sichere Alternative?

Danke für Ihre Zeit.

Antwort

4

Hey, danke an verrückten Scot und Chris für die Hilfe. Nachdem ich etwas gegraben hatte, entschied ich mich, die Methoden zu verwenden, die unter Dr Gladmans file encryption page beschrieben sind, um sowohl die Passwortverifizierung als auch die Nachrichtenauthentifizierung durchzuführen. Ich glaube, dass diese Methode, basierend auf dem PBKDF2 und einem MAC, das Ableiten des Verifizierungswerts für das Passwort, das ausreichend teuer ist, um es sicher zu machen, macht. Nochmals vielen Dank, und ich hoffe, dass diese Lösung anderen hilft.

5

Es gibt keinen "Quick Check" -Mechanismus, der per Definition sicher ist. Der ganze Sinn der Verwendung von PBKDF2 oder verwandten Techniken besteht darin, die Passwort-Überprüfung langsam zu machen, um Passwort-Knack-Programme zu vereiteln. Wenn Sie ein Quick-Check-System hinzufügen, können Passwort-Cracker Passwörter in großen Mengen sehr schnell erraten.

+0

Hallo, vielen Dank für Ihre Antwort. Ich hatte den Eindruck, dass der Zweck von PBKDF2 und dessen wiederholtes Kombinieren von "salt" und "password" zum Ableiten des Schlüssels darin bestand, den Prozess des Errechnens des Schlüssels aus dem Klartext-Passwort teuer zu machen und daher Angriffe im Wörterbuchstil zu erschweren. Wie gesagt, die PBKDF2-Spezifikation enthält einen optionalen Passwortverifizierungswert, ich weiß einfach nicht, wie ich in der Java-Implementierung darauf zugreifen kann. – PinkyNoBrain

+0

Ich stimme zu, dass ein Brute-Force-Angriff leichter wird, wenn eine schnelle Überprüfung nach Abschluss des Prozesses der Schlüsselableitung möglich ist, da der Angreifer nichts entschlüsseln muss, um den Schlüssel zu überprüfen, aber ich hätte den großen Suchraum von 256-Bit-AES-Schlüsseln gedacht macht einen reinen Brute-Force-Angriff ohnehin unmöglich? – PinkyNoBrain

+0

@pinkynobrain: Das Problem mit der Schnellprüfung ist, dass es den Schlüsselraum sehr verkleinert: Sie haben eine schnelle Möglichkeit, alle Passphrasen zu finden, für die die Schnellprüfung erfolgreich ist. Daher haben Sie viel weniger Schlüssel, um das AES brutal zu erzwingen. –

2

Berechnen Sie eine Art Kennwortverifizierungstag und speichern Sie diese neben den verschlüsselten Dateidaten, damit Sie sie zuerst überprüfen können. Dies könnte etwas wie der PBMAC einer festen (kurzen) Zeichenfolge sein. Natürlich muss dies eine nicht reversible Funktion sein, so dass ein Cracker das Passwort nicht bestimmen und nicht zu schnell berechnen kann, um den Brute-Force-Angriff zu vereiteln.

Haben Sie überlegt, ob (und wie) Sie feststellen, ob die gesamte Datei korrekt entschlüsselt wurde? Sie sollten sich wahrscheinlich eine Kombination aus PBES2 und PBMAC ansehen, anstatt AES direkt zu verwenden.

+0

Hallo, vielen Dank für Ihre schnelle Antwort und Ihren Rat zu PBES2 und PMAC, ich werde mich definitiv darum kümmern. Ich hatte überlegt, den Fixed-String-Ansatz zu verwenden, war aber besorgt, dass es den Prozess für bekannte Klartextangriffe öffnet. Stattdessen dachte ich daran, einen sicheren Hash des Schlüssels selbst zu verwenden, wenn die Hash-Funktion wirklich nicht invertierbar ist, dann würde dies keine Informationen über den Schlüssel selbst liefern, würde mir aber immer noch erlauben, zu überprüfen, ob die Schlüssel die gleichen sind. Was meinst du, ist das ein guter Ansatz? – PinkyNoBrain

+0

Es stimmt, dass eine Art Verifikation notwendigerweise einen bekannten Klartext darstellt. Die Verwendung der PB * -Funktionen macht die Arbeit jedoch schwieriger, indem sie sie im Vergleich zu einem naiven Einzel-Hash mit der Iterationszahl multipliziert. – crazyscot