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? Добро пожаловать на курс:

Источники: • 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.