Wie funktioniert Passwort Hash + Salz?

9

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 Ссылка

%Vor%

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%     
gloo 20.02.2014, 18:03
quelle

2 Antworten

2

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 .

    
Alexey Ten 20.02.2014, 18:49
quelle
2

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:

%Vor%

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:

%Vor%

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:

%Vor%

So sollten wir diese Konstruktion verwenden:

  • erstellt Hash während der Erstellung von Benutzerdaten: %Code%
  • Speichern von 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.

    
Vitaliy Andrusishyn 25.01.2017 13:36
quelle

Tags und Links