web-dev-qa-db-ja.com

werkzeugsの `generate_password_hash`の出力が一定でないのはなぜですか?

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)

ランダムソルトはtYqN0VeL1つと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

こちらもご覧ください

41
Martijn Pieters