MD5 хэширование в PHP
В этой статье я решил затронуть тему MD5 хэширования, так как тема эта очень простая, интересная и очень-очень важная. Самый простой пример использования MD5 хэша - это шифрование паролей пользователей. Ведь не секрет, что если хранить пароли в открытом виде в базе данных, то при её утере, все пароли пользователей будут украдены, чего не имеет никакого морального права допустить администратор. И вот тут на помощь приходит функция хэширования в PHP.
Функция MD5 хэширования в PHP называется md5(). Принимает функция одну строку, которую необходимо зашифровать. Функция возвращает MD5 хэш:
<?php
$str = "MyPassword";
echo md5($str);
?>
Запустив данный скрипт, Вы увидите MD5-хэш, соответствующий строке "MyPassword".
То есть простейший скрипт проверки логина и пароля:
<?php
$login = "Admin";
$password = "48503dfd58720bd5ff35c102065a52d7"; //В реальности считывается из БД
if (($_GET['login'] == $login) && (md5($_GET['password']) == $password)) echo "Welcome!";
else echo "Access denied";
?>
Теперь если Вы пройдёте по ссылке: "http://путь_к_скрипту.php?login=Admin&password=MyPassword", то увидите: "Welcome!".
Теперь поговорим о свойствах MD5-хэширования.
- MD5-хэш содержит 32 символа
- MD5-хэш уникален для каждой строки
- Процесс MD5-хэширования необратим
- Процесс MD5-хэширования достаточно медлителен
Третий пункт, пожалуй, самый важный, потому что если бы он был обратим, то смысл хэширования практически бы отсутствовал. Глупо шифровать, например, пароли, если их можно легко потом расшифровать.
Четвёртый пункт, как бы это парадоксально не звучало, также является очень большим плюсом. Почему? Очень просто: человек, который будет вынужден подождать этот процесс 0.001 секунды, сильно не пострадает. А вот злоумышленник, который будет перебирать пароли пострадает резко, так как медлительность алгоритма уже задаёт предел - 1000 паролей в секунду. Хотя, безусловно, скорость зависит от быстродействия сервера. Но тем не менее, для злоумышленника низкая скорость получения MD5-хэша - это очень большая проблема.
На будущее: никогда не храните пароли в открытом виде, забудьте об этом раз и навсегда. Поэтому всегда отправляйте пароли в базу данных в виде MD5-хэша, и, соответственно, сравнивайте хэши паролей, а не сами пароли.
-
- Михаил Русаков
Комментарии (6):
А у меня такой вопрос: не могу сообразить как сделать напоминание пароля, если он хранится в md5. То есть я понимаю что нужно сделать как у вас на сайте, чтобы выдавалась одноразовая ссылка на изменение пароля, но как ее сгенерировать?
Ответить
Можно просто генерировать новый пароль и его присылать. А что касается ссылки, то это тоже несложно. Достаточно сгенерировать какой-нибудь ключ на основании, например, бывшего пароля и затем проверить этот ключ. Если верный, то предложить сменить пароль.
Ответить
Хорошо, спасибо.
Ответить
Михаил, а ведь сейчас можно расшифровать md5 !
Ответить
Нет, Антон. Расшифровать невозможно. Возможно только сбрутить хэш.
Ответить
Михаил, у меня возникла вот такая проблема: у меня регистрация пользователей проходит в одном файле, вход в другом. при регистрации пользовательский пароль уходит к примеру в текстовый файл в виде хэша, то есть в md5, потом пользователь хочет войти на сайт и естественно вводит пароль и логин, но при обработке полученных данных, если я сравниваю md5 хэш введённого пользователем пароля и тот пароль, что хранится в файле, то они не равны. И я уже это проверил. зарегистрировал пользователя, затем посмотрел в файле его пароль в виде хэша, далее сделал такой скрипт, чтобы пользователь вводил пароль, и чтобы этот пароль вывелся в браузер в виде хэша, так вот они разные. в чём может быть проблема?
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.