Ответ 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
Также см.