Что такое хэш-функция (md5, sha) и как ее вычислить

20.05.2007

Сам по себе хэш (любой из перечисленных в заголовке) это функция. Большая, серьезная математическая функция, придуманная учеными. Например, хэш функцией будет молоток, который превращает новый монитор в кучу железа. И по виду этой кучи не всегда можно понять – а какая же модель монитора была поломана :)

Вообще говоря, основное применение эти функции получили в криптографии, именно там между умными людьми и идет борьба за самую-самую хорошую функцию. Сама по себе “хорошесть” функции определяется тем – а можно ли из результата получить исходное значение (читай, из груды пластмассы узнать – а что же это был за монитор).

Например, возьмем функцию взятия остатка от деления нацело. Это, видимо, самая простая из хэш функций. Предположим, что мы делим число 25 на 6. Мы знаем, что 6х4 = 24, и 1 – это остаток от деления. Фокус это дела в том, что такое преобразование не обратимо, если мы знаем только результат. Действительно, такой же остаток получится от деления 10 на 3 или 43 на 7. Везде в ответе будет цифра 1. Т.е. при всем желании, мы никогда в жизни не узнаем откуда эта цифра 1 получилась.

Самой часто применяемой в web-программировании является функция md5. Ну во-первых она встроена в язык php, а во-вторых – для веба более сильной функции такой как, например, SHA вовсе и не требуется. Достаточно старой и простенькой md5. И применяется она прежде всего для создания системы пользователей и их паролей.

Хэши позволяют содержать пользователей, на сохраняя в базу их пароли, а сохраняя туда лишь хэш пароля, т.е. его однозначное превращение в некую другую строку. Т.е фактически, конечно же, можно держать в базе пароли и в открытом виде, и для не web приложений это иногда бывает гораздо удобнее и лучше, но уже давно сложилось мнение, что web-скрипты часто ломают, и хранить пароли в открытом виде не очень-то и хорошо. А вдруг этот пароль совпадет с каким-нибудь другим паролем к другому ресурсу (а что, много людей используют и могут помнить десяток паролей к разным сайтам, я думаю нет).

Т.е. пользователь, когда входит на сайт, вводит свой пароль, а скрипт рассчитывает его хэш и проверяет на то – совпадает ли он с хранимым в базе или нет: md5(пароль) = хэш в базе. Если да, то все в порядке, пользователь прошел проверку, если нет – значит он пароль или забыл или потерял. Фактически с реальными паролями никто не имеет дела, они не фигурируют ни в каких таблицах, хранящих данные.

Так же существует такое понятие, как “коллизия хэш функции”. Т.е. остаток числа 25 поделенного на 6 и числа 43 поделенное на 6 – один и тот же – это 1. Но дали его совершенно два разных числа. С точки зрения криптографии это не есть гут, потому что не хорошо, когда одно и то же можно получить разными исходными данными. Для тех же паролей web-систем это плохо, потому что человек может ввести левый пароль, а его хэш совпадет с хранимым в базе и в результате он пройдет проверку, не зная настоящего пароля.

Например, точно известно, что md5 подверженна коллизиям и не так уж и давно было исследовано то, что в принципе зная хэш и некоторые вещи, за неделю на персональном компьютере можно методом подбора подобрать некую строку, которая даст такой же хэш, как и другая. Хотя теоретически, для того, что бы подобрать нужный хэш требуется очень-очень-очень много тыщ лет, просто лазейку нашли в алгоритме. А подбор – дело действительно очень долгое, никакой мощности современных супер-компьютеров не хватит что бы к вашей старости подобрать коллизию для вашего хэша (при условии, что исходная строка по-настоящему была не тревиальной и хоть какой-то не простой, как та же “123”).


Комментирование этой статьи закрыто

Комментарии

Комментирование этой статьи закрыто

Кто я


Возраст: 23
Профессия: заяц


Категории


Полезные ссылки


Стишок

Зайчик-зайчик, скок-поскок!
Н-нна тебе дробину в бок!
Не с капустой же мы будем
Жрать на Новый год пирог...

eu-shestakov.livejournal.com