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
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 :-) –
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