Что такое хеширование?

Хеширование (hashing) — это алгоритм, который вычисляет уникальное значение, характеризующее какой-либо объект. Различные объекты должны иметь различные значения хеша. Наиболее популярными являются два алгоритма хеширования: MD5 (Message Digest 5 — дайджест сообщения 5, http://ru.wikipedia.org/wiki/MD5) и SHA (Secure Hash Algorithm — защищенный алгоритм хеширования, http://ru.wikipedia.org/ wiki/SHA-1).
Значение хеша вычисляется с помощью математической функции (алгоритм хеширования), применяемой к входным данным. Ценность алгоритмов хеширования в вопросах безопасности состоит в том, что нет легкого способа получить первоначальные данные из их хешированной версии (т.е. это односторонний алгоритм).
В приведенном выше примере хеширование строки "662" дает "be3159ad04564bfb90db9e 32851ebf9c", но из этого значения невозможно снова получить "662". Данное свойство особенно полезно для хранения паролей в базе данных. При попытке аутентификации введенный пользователем пароль хешируется, и полученное значение сравнивается с хешем исходного (корректного) пароля, который был сохранен при первоначальном создании пользователем пароля. Если оба эти значения совпадают, введенный пароль считается правильным. Таким образом, для аутентификации пользователей не нужно
хранить исходные пароли.
После отправки данных из заполненной формы введенный пользователем ответ
вместе с его IP-адресом хешируется, и значение хеша сравнивается с известным хешем правильного ответа. При отправке данных формы через GET-запрос передается и введенный ответ, и хеш-значение правильного ответа:
http://localhost/seophp/comments.php?response=662&hash=
be3159ad04564bfb90db9e32851ebf9c
Сочетание ответа и полученного с помощью выражения $_SERVER [ SERVER_ADDR] IP-адреса применяется для того, чтобы хакер не смог взять известный "хороший" URL и известный для него хеш и использовать их для отправки своей информации.
В сценарии comments .php для проверки, совпадают ли введенный ответ ихешированная версия известного правильного ответа, вызывается метод checkanswer () из библиотеки SimpleCAPTCHA:
// вывод ответа
if (isset($_GET['response']) && isset($_GET['hash']))
(
if(SimpleCAPTCHA::check_answer($_GET['response'], $_GET['hash']))
(
echo 'Правильно!';
}
else '
{
echo 'Ответ неверен!';
}
}

Код самой функции совсем не сложен. Она возвращает true, если результат хеширования ответа плюс IP-адрес посетителя равен известному хешу правильного ответа:
// библиотека SimpleCAPTCHA
class SimpleCAPTCHA
// проверка ответа
function check_answer($answer, $hash)
{
return (md5(trim($answer) . $_SERVER['SERVER_ADDR']) == $hash);
}
Здесь используется алгоритм хеширования MD5, который наиболее распространен
среди всех подобных алгоритмов. Еще одним популярным алгоритмом, который считается более защищенным (хотя и несколько более медленным), является алгоритм SHA.