Добавление соли в регистрацию
Итак, вы уже знаете, что хеширование через
md5
- необратимый процесс и хакер,
получивший доступ к хешу, не сможет получить
по этому хешу пароль.
На самом деле это утверждение не совсем верное - в настоящее время злые хакеры составили библиотеки хешей популярных и не очень паролей и любой дурак может разгадать пароль, просто загуглив его хеш.
Речь идет о достаточно простых, популярных паролях.
Загуглите, например, хеш 827ccb0eea8a706c4c34a16891f84e7b
и сразу в поиске гугла вы увидите, что это
пароль '12345'
.
Хеши достаточно сложных паролей таким образом не разгадать (попробуйте).
Вы можете спросить, в чем тогда проблема - давайте все мы будем регистрироваться со сложными паролями. Есть, однако, проблема - большинство пользователей не задумываются о безопасности своих данных и могут вводить достаточно простые пароли.
Мы можем при регистрации заставлять придумывать
более длинные пароли, ограничивая, к примеру,
минимальное количество символов 6
-ю
или 8
-ю, однако, все равно будут появляться
пароли вида '123456'
или '12345678'
.
Можно, конечно, придумать более умный алгоритм проверки пароля на сложность, но есть другое решение.
Суть этого решения такая: пароли надо посолить. Соль - это специальная случайная строка, которая будет добавляться к паролю при регистрации и хеш уже будет вычисляться не от простого пароля типа, а от строки соль+пароль, то есть от соленого пароля.
То есть при регистрации вы будете делать что-то типа такого:
<?php
$salt = '1sJg3hfdf'; // соль - сложная случайная строка
$password = md5($salt . $_POST['password']); // преобразуем пароль в соленый хеш
?>
При этом соль будет разная для каждого пользователя, ее нужно будет генерировать случайным образом в момент регистрации.
Вот готовая функция, которая сделает это:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // длина соли
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // символ из ASCII-table
}
return $salt;
}
?>
С помощью этой функции можно переписать наш код вот так:
<?php
$salt = generateSalt(); // соль
$password = md5($salt . $_POST['password']); // соленый пароль
?>
Еще раз повторю, что это были изменения при регистрации - в БД сохраняем не просто хеш пароля, а хеш соленого пароля.
Это еще не все: в таблице с юзерами кроме
поля login
и password
нужно
сделать еще и поле salt
, в котором
мы будем хранить соль каждого пользователя.
Реализуйте описанную выше регистрацию с соленым паролем.