Как сделать проверку пароля с помощью хэша? - PullRequest
0 голосов
/ 30 октября 2018

Я изучаю Flask с помощью Miguel Grinberg удивительного урока. В этой главе он предлагает хранить хэш пароля пользователя, а не сам пароль по соображениям безопасности. Были использованы следующие функции: generate_password_hash, check_password_hash. Но даже если вы вызываете generate_password_hash с одной и той же строкой, вы можете получить разные значения хеша:

enter image description here

Тогда как check_password_hash будет работать, если в одной и той же строке может быть столько хеш-значений, сколько нужно?

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Тогда как работает 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) Сравните хеш данного пароля с хешем из базы данных. Если они совпадают, пароль правильный. В противном случае пароль неверен.

0 голосов
/ 30 октября 2018

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

Это сделано для того, чтобы хакеры не могли просто угадать хеш общих паролей. Например, хеш 'pass1234' сам по себе всегда будет одинаковым. Тем не менее, хэш 'pass1234 + salt будет отличаться каждый раз. Ваша база данных должна хранить хэш, а также соль (главное, не пароль в виде открытого текста). Это сводит к минимуму ущерб, вызванный утечкой информации об учетных записях пользователей.

В случае Flask и werkzeug возвращаемое значение generate_password_hash() имеет вид: method$salt$hash (вы можете увидеть два символа $ на предоставленном вами скриншоте). Поэтому в следующий раз, когда вы проверяете открытый текст по хешу, вы получите его со значением соли от generate_password_hash() и посмотрите, соответствует ли оно хеш-значению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...