Тогда как работает check_password_hash, если в одной и той же строке может быть столько хеш-значений, сколько ей нужно?
Упрощенное решение может быть таким,
1) без соли
user_id| raw_password | hash_value
user1 | 'foo' | same_hashed_value
user2 | 'foo' | same_hashed_value
Как вы, возможно, знаете, здесь тот же пароль выдает то же хеш-значение, которое
уязвим для атаки по словарю. Таким образом, мы можем добавить некоторое случайное значение (salt
) к
Смягчить подобные атаки, как показано в следующем решении.
2) с солью
генерирует процесс хеширования:
user_id | raw_password | password_with_salt | hash_value
user1 | 'foo' | 'foo#salt123' | different_hash_1
user2 | 'foo' | 'foo#saltABC' | different_hash_2
В этом случае hash_value и связанный с ним salt_value могут храниться в базе данных. В противном случае, concat (hash_vaule
, salt_value
) как одна строка для хранения, что эквивалентно.
проверка процесса хеширования:
1) Получить пользовательские salt_value и hash_value из базы данных.
2) Добавьте значение salt_value к указанному паролю и хешируйте его, используя ту же хеш-функцию.
3) Сравните хеш данного пароля с хешем из базы данных. Если они совпадают, пароль правильный. В противном случае пароль неверен.