it-swarm.com.de

Verwenden Sie SHA-256, um das Passwort vor dem Verschlüsseln vorzuverarbeiten?

Ich möchte Benutzern meiner Webanwendung erlauben, lange Passwörter zu haben, wenn sie dies wünschen. Heute wurde mir die Beschränkung der Passwortlänge von bcrypt bewusst (72 Zeichen, der Rest abgeschnitten).

Wäre es für mich sicher, Folgendes zu tun? Ich benutze PHP.

Aktuelle Implementierung:

password_hash($password, PASSWORD_BCRYPT, $options);

Implementierung in Frage:

password_hash(hash('sha256', $password), PASSWORD_BCRYPT, $option);

Was sind die Nachteile der fraglichen Implementierung?

Ich bin kein Krypto-Experte, bitte beraten Sie.

Wird die betreffende Implementierung die Kennwortlänge begrenzen, die ein Benutzer verwenden kann? Wenn ja, wie hoch ist die Grenze?

20
Jay

Im Allgemeinen wird dies in Ordnung sein. Es ist sogar eine ziemlich gut empfohlene Methode, um Passwörter beliebiger Länge in bcrypt zuzulassen.

Mathematisch verwenden Sie jetzt bcrypt für eine 64-Zeichen-Zeichenfolge, bei der 2 ^ 256 mögliche Werte vorliegen (SHA-256 gibt eine 256-Bit-Ausgabe aus, die üblicherweise als 64-Zeichen-Hexadezimalzeichenfolge dargestellt wird). Selbst wenn jemand allgemeine Kennwörter in SHA-256 vorberechnet hätte, müsste er diese über bcrypt ausführen, um die tatsächliche Eingabe für einen bestimmten Hash zu ermitteln.

Der potenzielle Hauptnachteil sind Implementierungsfehler: Wenn Sie die SHA-256-Werte jemals speichern, sind sie relativ schnell zu brechen, sodass ein Angreifer sich nicht die Mühe machen muss, die bcrypt-Werte zu brechen.

Es wird weiterhin empfohlen, eine ausreichend hohe Iterationszahl für den bcrypt-Schritt beizubehalten. Dies sollte sich nicht besonders nachteilig auf Ihre Verarbeitungszeit auswirken, erschwert jedoch Brute-Force-Angriffe erheblich.

Siehe Pre-Hash-Passwort vor dem Anwenden von bcrypt, um eine Einschränkung der Passwortlänge zu vermeiden für den allgemeinen Fall.

24
Matthew

Ihre vorgeschlagene Implementierung ist sicher. Achten Sie jedoch darauf, Ihre spezielle Nutzung der Funktion zu dokumentieren.

Bitte beachten Sie, dass password_hash Das Passwort beim ersten NULL-Byte abschneidet, sodass Sie die Option $raw_output=true Der Funktion hash NICHT verwenden dürfen.

11
A. Hersean

Tun Sie es nicht, Sie beschränken Ihre Schlüsselstärke auf viel weniger, als bcrypt allein akzeptieren kann.

Verwenden Sie stattdessen diesen Ansatz (Pseudocode nicht gültiges PHP):

if length($password) > 72 bytes
then
    $hash = sha256($password)
    $password = concat(substring($password, 320 bits), base255encode($hash))
end if
bcrypt($password)

Auf diese Weise behalten Passwörter zwischen 256 und 576 Bit ihre volle Entropie bei, und Passwörter mit mehr als 576 Bit verwenden nicht nur die 256 Bit aus dem Hash, sondern so viel von der ursprünglichen Entropie, wie neben den Hash passen kann.

Es ist fraglich, ob der Hash über das gesamte Passwort oder nur über den Teil mit mehr als 320 Bit ausgeführt werden soll, den der Hash ersetzt. Ich bezweifle ernsthaft, dass es einen Unterschied macht, wenn Sie einen kryptografischen Hash mit guten Eigenschaften ausgewählt haben.

Der base255encode-Schritt vermeidet, dass ein NUL-Byte den Schlüssel vorzeitig beendet, wie @ a-heresean warnte.

4
Ben Voigt