PHP и mySQL. Зачем хранить соль, если crypt() может быть использован для проверки пароля?
Большое количество сообщений, которые я видел, относительно хеширования паролей, говорит что-то вроде:
- Используйте уникальную соль для каждого пароля
- Хранить соли в БД вместе с хешированным паролем
Смею ли я даже сказать, что это самый распространенный подход, изложенный?
Все это имеет смысл - если вам нужно каждый раз перефразировать входной пароль - но в PHP вы можете использовать crypt
проверить пароль, даже не используя соль. Согласно этому посту, это "как это должно быть сделано".
Например:
$pass = 'YoiI8SjPAlFj';
$salt = '$2y$09$959d78f2f983628c711c7d';
echo $hashed = crypt($pass, $salt);
// $2y$09$959d78f2f983628c711c7O3YM7Xdl8Gdnh.S0C.ak41wA8RI1/3ga
А потом проверить (используя те же самые переменные)...
if(crypt($pass, $hashed) === $hashed) {
// Success
}else {
// Fail
}
Который пройдет, просто отлично.
Если это так, то зачем мне хранить соль с моим паролем? Если пользователь изменит свой пароль, я все равно сгенерирую новую соль. Мне кажется, что соль - это лишняя информация для хранения и просто занимающая память.
Есть ли аргументы за его хранение? Потому что я не могу думать ни о чем.