werkzeug.security.generate_password_hash("Same password")
( docs )を複数回実行すると、出力が毎回異なります。
私は何が間違っているのですか?なぜ一定ではないのですか?
パスワードはsalted、はい。 レインボーテーブル攻撃 でハッシュが使用できないようにするために、ハッシュの前にソルトがパスワードに追加されます。
関数を呼び出すたびにソルトがランダムに生成されるため、結果のパスワードハッシュも異なります。返されるハッシュには生成されたソルトが含まれているため、パスワードを正しく確認できます。
デモ:
>>> 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'
これらの2つの文字列は異なります。ただし、生成されたソルトはそれぞれに含まれているため、パスワードを確認するのに十分な情報が含まれています。
# pbkdf2:sha1:1000$tYqN0VeL$2ee2568465fa30c1e6680196f8bb9eb0d2ca072d
^^^^^^^^^^^^^^^^ salt ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
algo info ^^^^^^^^ actual hash of the password
(PBKDF2 applied SHA1 1000 times)
ランダムソルトはtYqN0VeL
1つとXHj5nlLU
、結果のハッシュも異なります。
foobar
パスワードは、次のいずれかのハッシュに対して引き続き検証できます。
>>> 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
こちらもご覧ください