Ich habe zwar Hashing- und Salting-Passwörter verstanden, aber es scheint, dass ich einige Missverständnisse habe. Ich erstelle ein Benutzer-Account-System für meine Website in nodejs.
So wie ich es verstanden habe, erzeugen wir, wenn ein Benutzer ein Passwort erstellt, ein zufälliges Salt, hängen es an das Passwort an und hashen diese Zeichenfolge. Wir können auch einen Arbeitsfaktor hinzufügen, um den Hash langsam arbeiten zu lassen und gegen Brute-Force-Angriffe zu schützen. Wir speichern das Salz zusammen mit dem Hash in unserer Datenbank und um einen Login-Versuch zu validieren, wiederholen wir den obigen Prozess (auf dem Server) mit dem gespeicherten Salz und dem versuchten Passwort und prüfen, ob die Hashes übereinstimmen.
Es scheint, dass das Modul bcrypt
in nodejs nicht mit meiner Interpretation von Hashing konsistent ist. Dies ist ein Beispiel für Ссылка
Erstens, warum wird der Arbeitsfaktor auf das Salz und nicht auf den Hash angewendet? Wenn jemand mit roher Gewalt angreift, würde er die Hash-Funktion korrekt ausführen? Ist das Hash nicht die Funktion, die wir brauchen, um langsam zu sein?
Ich bin auch verwirrt durch Validierung mit bcrypt:
%Vor%Die Hashes müssen eindeutig sein, auch wenn zwei Benutzer dasselbe Passwort auswählen. Also warum machen wir das nicht?
%Vor% salt
enthält die Anzahl der Runden, so dass bcrypt.hash(Sync)
function weiß, wie viele Runden es zu tun hat.
Also ist hash
kein einfacher Hash, sondern ein Container mit eingebettetem salt
.
SALT
ist ein Grad von 2 Zahlen (von 4 bis 31) - Kreise der Iterationsfunktion der Funktion, die Hash erzeugt. bcrypt
nehmen das Salz, multiplizieren 2 von selbst Salz Zeiten. Und nimm diesen Wert, um die Dekodierfunktion zu unserer Zeichenkette die Gesamtmenge mal zu implementieren. Es ist "runder" der Schleife in der bcrypt-Funktion.
Jedes Mal wenn du es tust:
bcrypt
create NEUE "zufällige" Zeichenfolge, jedes Mal verwenden Sie die gleiche Eingabezeichenfolge und verwenden Sie die gleiche salt
nehmen wir die andere Ausgabezeichenfolge , es ist die Schlüsselidee der Arbeit bcrypt Funktion, und dieses Gesamtergebnis werden wir in unserer Basis speichern.
Dann benutzen wir:
Und compareSync
berechnen, wenn der Hash von String "mein Passwort" erstellt wurde. Und wenn wir compareSync
add salet zu unserem String ( "mein Passwort" ) verwenden, ändern wir den gestarteten String und nehmen niemals true
auf diese Weise. Weil bcrypt
hash
vergleicht, wenn das auf diese Weise erstellt wurde:
So sollten wir diese Konstruktion verwenden:
var salt = bcrypt.genSaltSync(10);
var hash = bcrypt.hashSync("my password", salt);
in db Nächster Schritt Authentifizierung Benutzer während der Anmeldung wie:
hash
ohne irgendwelche bcrypt.compareSync("my password", hash);
oder Parameter.