# Добавление соли в регистрацию

Итак, вы уже знаете, что хеширование через `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`, в котором мы будем хранить соль каждого пользователя.

Реализуйте описанную выше регистрацию с соленым паролем.

← →
↑