PHP hash: хэширование паролей в PHP | OTUS
⚡ Открываем подписку на курсы!
Проходите параллельно 3 онлайн-курса в месяц по цене одного.
Подробнее

Курсы

Программирование
Flutter Mobile Developer Подготовка к сертификации Oracle Java Programmer (OCAJP)
-8%
Алгоритмы и структуры данных
-12%
Web-разработчик на Python
-11%
Архитектура и шаблоны проектирования
-14%
JavaScript Developer. Basic Супер-интенсив «СУБД в высоконагруженных системах»
-18%
iOS-разработчик. Базовый курс
-23%
Разработчик на Spring Framework
-23%
Python Developer. Basic
-16%
C# ASP.NET Core разработчик
-18%
Разработчик программных роботов (RPA) на базе UiPath и PIX
-6%
Android Developer. Basic
-10%
C++ Developer. Professional Разработчик C# AWS для разработчиков Software Architect Unity Game Developer. Basic Разработчик голосовых ассистентов и чат-ботов Backend-разработка на Kotlin React.js Developer Разработчик Node.js Нереляционные базы данных Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Advanced Fullstack JavaScript developer
Инфраструктура
PostgreSQL
-10%
IoT-разработчик
-12%
Administrator Linux. Professional
-11%
Базы данных
-19%
Administrator Linux.Basic
-18%
Супер-интенсив «СУБД в высоконагруженных системах»
-18%
Разработчик программных роботов (RPA) на базе UiPath и PIX
-6%
Сетевой инженер AWS для разработчиков Software Architect Reverse-Engineering. Professional CI/CD VOIP инженер Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

PHP hash: хэширование паролей в PHP

Хранить пароли пользователей в открытом виде в БД — не самый лучший вариант, особенно когда к этой базе данных могут получить доступ другие. И, правда, при взломе базы пароли пользователей, хранящиеся в открытом виде, будут банально украдены, а это уже чревато серьёзными репутационными и финансовыми потерями, чего не может допустить никакой системный администратор. В этой статье будет рассмотрен процесс хэширования паролей (hashing) — процесс несложный, но, к сожалению, порой игнорируемый веб-программистами.

Да, хэширование панацеей не является, но всё же при краже данных оно может существенно снизить ущерб. Ведь что собой представляет хэш-функция (hash, хэш, хеш)? Речь идёт о функции, которая обладает бесконечной областью определения, имея при этом конечную область значения. А ещё функции типа hash присуща одна интересная особенность: даже в случае небольшого изменения входного значения у хэш-функции, итоговое значение изменится просто радикально. Если говорить языком криптографию, стоит отметить главное назначение хэш-функций — генерация ключей на основе запоминаемых и коротких паролей (лично вам, легко ли было бы запомнить 16 шестнадцатеричных разрядов?) То-то же.

Подытожив первую часть статьи, скажем, что hash генерирует хэш-код.

Описание hash в PHP

Описать хэш (хеш) в PHP можно следующим образом:

hash ( string $algo , string $data [, bool $raw_output = FALSE ] ) : string

Теперь стоит рассказать про список параметров функций типа hash (хеш, хэш): • algo. Тут прописывается название алгоритма, выбранного для хэширования (тот же md5 или SHA-1). Существует целый список поддерживаемых алгоритмов, найти который не составляет труда; • data. Сообщение для хэширования. Без комментариев;
raw_output. Если этот параметр установлен в режим TRUE, то осуществляется вывод необработанных двоичных данных. Если же выставить его в FALSE, производится вывод данных в шестнадцатеричной кодировке (плюс это осуществляется в нижнем регистре).

Возвращаемые значения

При работе функции hash выполняется возврат строки, содержащей вычисленный код в нижнем регистре и в шестнадцатеричной кодировке. Но если raw_output будет задан как TRUE, произойдёт возврат кода в виде бинарных данных.

PHP хэш: хэширование MD5

В качестве продолжения статьи, стоит отдельно поговорить про хэширование по алгоритму MD5. Это будет неплохой пример, да и тема эта в целом весьма важна, а чтение не займёт у вас много времени. Но для начала скажем пару слов о самом алгоритме. MD5 (Message Digest 5) представляет собой 128-битный алгоритм хеширования, который был разработан Рональдом Ривестом в далёком 1991 г. Описан он в RFC 1321 (RFC, если не знаете, — это «Request for Comments» — техническая спецификация и стандарт, широко применяемый в глобальной сети).

Простейший пример практического применения хэша MD5 — шифрование пользовательских паролей. Как уже было сказано, хранить пароли в БД в открытом виде не просто моветон, а в принципе недопустимо. И вот здесь как раз и может прийти на помощь функция хэширования в PHP и соответствующий алгоритм.

В языке программирования PHP функция хэширования MD5 называется md5(). Она принимает одну строку, которую надо зашифровать. Возвращает же MD5-хэш (hash). На практике это может выглядеть следующим образом:

<?php
  $str = "Password";
  echo md5($str);
?>

Если вы запустите этот скрипт, увидите MD5-хэш, который будет соответствовать строке "Password".

Теперь простейший скрипт для проверки пароля и логина:

<?php
  $login = "Admin";
  $password = "dc647eb65e6711e155375218212b3964"; //Именно это значение в реальности считывается из базы данных
  if (($_GET['login'] == $login) && (md5($_GET['password']) == $password)) echo "Добро пожаловать!";
  else echo "Доступ запрещён";
?>

Если вы теперь перейдёте по ссылке "http://путь_к_скрипту.php?login=Admin&password=Password", вы увидите: "Добро пожаловать!".

Свойства MD5

У вышерассмотренного алгоритма есть следующие свойства: • hash содержит 32 символа; • hash уникален для каждой строки; • сам процесс MD5-хэширования является необратимым; • этот процесс отличается достаточной медлительностью.

Что касается третьего пункта, то он весьма важен, ведь какой был бы смысл в хэшировании, если бы оно было обратимым? И, действительно, не глупо ли шифровать пасворды, которые потом легко и просто можно расшифровать? Вопрос риторический.

Но если мы пойдём дальше, то увидим, что пункт номер 4 в нашем списке — это тоже плюс, как бы это не звучало парадоксально. Дело в том, что если человек, набирающий пароль, вынужден подождать 0,001 секунды (именно столько и длится процесс), то для него это не проблема — он от этого не пострадает и даже не заметит этой самой медлительности. Если же мы говорим про хакера, которому надо перебрать множество вариантов, то медлительность алгоритма придётся ему очень не кстати, ведь алгоритм задаёт предел — 1000 паролей в секунду. Да, многое зависит и от быстродействия сервера, но несмотря на это, низкая скорость при получении хеша MD5 — это всё-таки проблема для злоумышленника.

На этом закончим и в очередной раз напомним: никогда не храните ваши пароли и пароли ваших пользователей в открытом виде — просто забудьте, что так можно делать, даже (и тем более) если вы обычный веб-мастер. Всегда отправляйте ваши пароли в БД в виде hash (алгоритм выбирайте на своё усмотрение) и сравнивайте не сами пасворды, а их хэши.

Интересует PHP? Добро пожаловать на курс:

PHP_970x90-20219-10b307.jpg

Источники: • https://www.php.net/manual/ru/function.hash.php; • https://www.internet-technologies.ru/articles/heshirovanie-paroley-v-php.html; • https://myrusakov.ru/md5-php.html; • https://snipp.ru/php/hash-php#link-md5.

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться