2014-05-02 7 views
14

In Flask,Flask - generate_password_hash nicht konstanter Ausgang

Wenn ich versuche generate_password_hash("Same password") mehrere Male die ouput anders laufen soll jedes Mal?

Was mache ich falsch. Warum ist es nicht konstant?

Ich vermute es hat etwas mit dem Einstellen des Salzes zu tun?

+1

sehen Es stellte sich heraus, dass ich es abgeschnitten habe, als ich es in meinen Datenbanken gespeichert habe e. Als Ergebnis konnte ich es nicht richtig vergleichen :-) –

+1

Danke, dass Sie diese Frage gestellt haben - ich rehashing, um den Vergleich zu machen, anstatt die check_password_hash() Methode zu verwenden. Wäre es nicht anders gewusst als für die Antwort auf die Frage. Upvote für euch beide. – JakeJ

Antwort

29

Das Passwort ist gesalzen, ja. Das Salz wird dem Kennwort vor dem Hash hinzugefügt, um sicherzustellen, dass der Hash in einem rainbow table attack nicht verwendbar ist.

Da das Salz bei jedem Aufruf der Funktion zufällig generiert wird, ist auch der resultierende Kennwort-Hashwert unterschiedlich. Der zurückgegebene Hash enthält das generierte Salz, so dass das Passwort immer noch korrekt überprüft werden kann.

Demo:

>>> from werkzeug.security import generate_password_hash 
>>> generate_password_hash('foobar') 
'pbkdf2:sha1:1000$tYqN0VeL$2ee2568465fa30c1e6680196f8bb9eb0d2ca072d' 
>>> generate_password_hash('foobar') 
'pbkdf2:sha1:1000$XHj5nlLU$bb9a81bc54e7d6e11d9ab212cd143e768ea6225d' 

Diese beiden Saiten unterscheiden; aber enthalten genügend Informationen, um das Passwort zu überprüfen, weil das erzeugte Salz in jedem enthalten ist:

# pbkdf2:sha1:1000$tYqN0VeL$2ee2568465fa30c1e6680196f8bb9eb0d2ca072d 
    ^^^^^^^^^^^^^^^^ salt ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
     algo info ^^^^^^^^  actual hash of the password 
    (PBKDF2 applied SHA1 1000 times) 

Da das zufällige Salz tYqN0VeL für einen und XHj5nlLU ist, ist die resultierende Hash ist auch anders.

Das foobar Passwort kann nach wie vor gegen die beiden Hash überprüft werden:

>>> from werkzeug.security import check_password_hash 
>>> check_password_hash('pbkdf2:sha1:1000$tYqN0VeL$2ee2568465fa30c1e6680196f8bb9eb0d2ca072d', 'foobar') 
True 
>>> check_password_hash('pbkdf2:sha1:1000$XHj5nlLU$bb9a81bc54e7d6e11d9ab212cd143e768ea6225d', 'foobar') 
True 

Auch