2014-02-20 9 views
9

Ich obwohl ich Hashing und Salting Passwörter verstanden, aber es scheint, dass ich einige Missverständnisse habe. Ich erstelle ein Benutzeraccount-System für meine Website in nodejs.Wie funktioniert Passwort Hash + Salz Arbeit

Die Art, wie ich es verstand, war, dass, wenn ein Benutzer ein Passwort erstellt, wir eine zufällige Salz generieren, an das Passwort anhängen und dann diese Zeichenfolge Hash. 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 aus einem Beispiel bei http://codetheory.in/using-the-node-js-bcrypt-module-to-hash-and-safely-store-passwords/

var salt = bcrypt.genSaltSync(10); 
var hash = bcrypt.hashSync("my password", salt); 

Zunächst einmal, warum wird der Faktor auf das Salz aufgebrachte Arbeit eher als die Hash? 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 durch die Validierung mit bcrypt verwechselt:

bcrypt.compareSync("my password", hash); 

Wir brauchen die Hashes sogar einzigartig zu sein, wenn zwei Benutzer das gleiche Passwort wählen, dann ist dies der Punkt, Salz oder? Warum machen wir das nicht?

bcrypt.compareSync("my password"+salt, hash); 
+0

Das Hauptziel von Salzen ist Rainbow-Tabellenangriffe zu verhindern, d. H. Vorberechnete Zuordnungen von Salzen zu Passwörtern, die die Komplexität des Crackens auf "originalPassword = rainbowTable [hash]" reduzieren. Viele Salze sind noch besser, aber nicht alle Systeme verwenden mehr als ein Salz. – FakeRainBrigand

Antwort

2

salt enthält Anzahl der Runden so bcrypt.hash(Sync) Funktion weiß, wie viele Runden es zu tun hat. Also ist hash kein einfacher Hash, sondern ein Container mit eingebetteten salt.

+1

Ok das macht Sinn. Bedeutet das, dass ich keine Saite in meinem db speichern muss? Ich muss einfach den Rückgabewert von 'hashSync ('pw', salt) 'speichern und das hat das Salz darin eingebettet, weshalb wir nicht explizit ein Salz an' compareSync 'übergeben. – gloo

+0

Speichern Sie einfach 'hash' –

2

SALT ist Grad von 2 Nummer (von 4 bis 31) - Kreise der Iteration arbeiten der Funktion erstellen Hash. bcrypt nehmen Sie das Salz, multiplizieren Sie 2 selbst Salz Zeiten. Und nimm diesen Wert, um die Dekodierfunktion zu unserer Zeichenkette die gesamte Anzahl mal zu implementieren. Es ist "Allrounder" Schleife in BCrypt-Funktion. Jedes Mal, wenn Sie das tun:

bcrypt.hashSync("my password", salt) 

bcrypt erstellen NEW „random“ string, jedes Mal Verwendung desselben Eingabestring und verwendet die gleichen salt nehmen wir den unterschiedlichen Ausgabestring, dann ist es Schlüsselidee der Arbeits bcrypt Funktion, und dieses Gesamtergebnis werden wir in unserer Basis speichern. Dann verwenden wir:

bcrypt.compareSync("my password", hash); 

Und compareSync berechnen, wenn Hash aus Zeichenfolge "Passwort" erstellt wurde. Und wenn wir in Funktion compareSync hinzufügen Salz zu unserer Zeichenfolge ("mein Passwort") werden wir die gestartete Zeichenfolge und nie nehmentrue auf diese Weise.Da bcrypt wird hash vergleichen, wie wenn das auf diese Weise erstellt wurde:

bcrypt.hashSync("my password"+salt, salt); 

Das ist, wie wir diese Konstruktion verwenden sollten:

  • Hash erstellen während der Benutzerdaten erstellen: var salt = bcrypt.genSaltSync(10); var hash = bcrypt.hashSync("my password", salt);
  • Spar hash db
  • nächster Schritt Authentifizierung Benutzer während der Anmeldung wie:

    bcrypt.compareSync("my password", hash);

ohne salt oder Parameter.