Вы должны сохранить соль, прежде чем добавлять ее к паролю и хешировать.
Таким образом, когда кто-то пытается войти в систему, вы объединяете пароль с сохраненной солью, а затем можете хэшировать его и сравнивать с существующим хешем в базе.
Итак, ваша пользовательская таблица должна иметь как минимум эти 3 столбца:
имя пользователя, хеш-пароль, соль
более подробное объяснение:
Функция хеширования является детерминированной, но не обратимой, поэтому, когда пользователь впервые создает свой пароль:
- вы генерируете соль
- вы соединяете пароль и соль
- Вы хэшируете полученную строку конкатенации пароля и соли
- Вы экономите и хеш, и соль
так что у вас есть: hashedpassword = хеш-функция (пароль + соль)
При попытке авторизации:
- вы получаете логин и пароль в качестве ввода
- с помощью логина вы можете получить хеш и соль в базе
- у вас уже есть функция хеширования
- чтобы вы могли обработать хеш-функцию (password_entered_by_user + salt)
- вы сравниваете результат с hashedpassword и регистрируете пользователя, если он совпадает
Наличие соли рядом с хешированным паролем не делает его менее безопасным: цель соли - предотвратить использование rainbowtable
Если кто-то проникнет в вашу базу данных, он, вероятно, будет стремиться получить адрес электронной почты + пароль ваших пользователей, поскольку большинство людей используют один и тот же пароль и адрес электронной почты в разных местах.
Теперь, поскольку хеш-функция необратима, злоумышленник может лишь попытаться угадать пароль и создать словарь с:
guessed_password => hash(guessed_password)
например:
pet345 => 23FD7890F0F3FA3AE468F37CB900402A1F1977CF926F3452CA519056E16985AB
lola78 => 876B42DC10A0822CC52B894DC7517C784A542B43FB033B4A93635ADA67946B2E
lola79 => A7DCAF5195463FA367CDEA6F23688C1280EC98F4AF2B08BC3469D2496537D48D
lola80 => 8D8E1CF212F5DDC3CA1D510900382DF945625A9AE1584CE0D539B2C4D73717CB
если в вашей базе данных есть хеш (guessed_password), он знает, что пароль для этого (этих) пользователей - guessed_password.
Он может создать словарь с миллиардами guessed_passwords, и, поскольку многие пользователи не используют действительно надежный пароль, очень вероятно, что он сможет найти в своем словаре большое количество хешей ваших пользователей. Поэтому, если он генерирует хеши для «lola80» и «lola79», и это пароли 2 ваших пользователей, он знает, что это знает.
Теперь, если вы добавите случайную соль для каждого введенного пароля, для каждой соли он должен создать полный словарь, так как он должен сделать:
guessed_password + salt = hash(guessed_password + salt)
Для пользователя A с солью '09 ç @ p $ 'он должен создать полный словарь, где каждое слово заканчивается на '09 ç @ p $'
Теперь, если он хочет угадать пароль пользователя B, связанный с солью 'Yuè45gh', он должен создать еще один словарь, в котором каждое слово оканчивается на 'Yuè45gh'
По сути, это замедляет процесс угадывания ваших пользовательских паролей по коэффициенту your_number_of_users.