Flask - generate_password_hash не постоянный вывод

В колбе

Когда я пытаюсь запустить generate_password_hash("Same password") несколько раз каждый выход отличается каждый раз?

Что я делаю неправильно. Почему это не постоянно?

Я предполагаю, что это что-то связано с установкой соли?

Ответы

Ответ 1

Пароль солен, да. Соль добавляется к паролю перед хэшированием, чтобы гарантировать, что хеш не используется в атаке радужного стола.

Поскольку соль генерируется случайным образом каждый раз, когда вы вызываете функцию, результирующий хеш пароля также отличается. Возвращенный хеш включает сгенерированную соль, чтобы все еще можно было правильно проверить пароль.

Демо:

>>> 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'

Эти две строки отличаются друг от друга; но содержат достаточно информации для проверки пароля, потому что сгенерированная соль включена в каждый:

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

Поскольку случайная соль tYqN0VeL для одного и 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

Также см.