Вы находитесь на странице: 1из 3

Лекции курса PHP7 + MySQL с нуля

(краткое содержание)

ЛЕКЦИЯ 30. СТАНДАРТНЫЕ ФУНКЦИИ. СТРОКИ. ХЕШ-ФУНКЦИИ.

При работе web-приложений очень часто приходится прибегать к кодированию


информации, например, паролей пользователей.
Одной из возможностей кодирования информации является преобразование
строк в хеш-код. Фактически, это преобразование строки в набор символов,
построенных по определенному алгоритму, хотя внешне этот набор может казаться
случайным. Для хеш-кодирования существует множество как стандартных
функций, так и дополнений к PHP.
Рассмотрим несколько самых популярных решений.

Функция md5()
У данной функции следующий синтаксис:
string md5(string $str [, bool $raw_output = false])
Функция имеет всего два параметра:
- $str – строка, которая преобразуется в хеш-код;
- $raw_output – тип возвращаемого значения (false – 32 символа, true – 16
символов).
Работу таких функций проще всего рассматривать на примерах:
Листинг 30.1. Пример работы функции md5()

$pass1 = "fklweSNFkjbsdf";
$pass2 = "fsdbkFDSAbkDKLJF";
$pass3 = "fklweSNFkjbsdf";

//Получим хеш-коды переменных


$md5pass1 = md5($pass1);
$md5pass2 = md5($pass2);
$md5pass3 = md5($pass3);

//Выведем хеш-коды переменных на экран


echo "<p>Хэш-код пароля pass1: $md5pass1</p>";
echo "<p>Хэш-код пароля pass2: $md5pass2</p>";
echo "<p>Хэш-код пароля pass3: $md5pass3</p>";

//Сравним хеш-коды переменных pass1 и pass2


if ($md5pass1 === $md5pass2)
echo "<p>Пароли pass1 и pass2 соответствуют друг другу</p>";
else
echo "<p>Пароли pass1 и pass2 не соответствуют друг другу</p>";

//Сравним хеш-коды переменных pass1 и pass3


if (md5($pass1) === md5($pass3))
echo "<p>Пароли pass1 и pass3 соответствуют друг другу</p>";
else
echo "<p>Пароли pass1 и pass3 не соответствуют друг другу</p>";

1
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

Таким образом, при работе с PHP, Вы получаете замечательную возможность


использовать защищенные данные, не прибегая к их прямым значениям. Так, хеш-
коды паролей могут использоваться при проверке пароля пользователя при входе
на сайт. При сравнении используются именно хеш-коды вводимого пароля и
пароля, хранящегося в базе данных.

Функция hash()
Данная функция является универсальным способом хеширования
информации и дает возможность использовать более 20 различных алгоритмов. У
функции следующий синтаксис:
hash(string $alg, string $str [, bool $raw_output = false])
Данная функция отличается от md5() только наличием дополнительного
параметра $alg, который представляет собой имя алгоритма хеширования,
например, md5, sha256, haval160,4 и др. Полный список алгоритмов Вы можете
найти в документации.

Хеширование паролей
Начиная с версии 5.5.0 в PHP для хеширования паролей рекомендуется
использовать специальные алгоритмы.
Для этого создан специальный набор функций password. Для хеширования и
проверки хеша пароля предназначены следующие из них:
А) Функция string password_hash(string $pass, int $algo [, array $options]) – создает
хеш пароля с использованием таких параметров, как стоимость и соль, создающих
дополнительный уровень защиты данных от взлома и кражи.
Содержит следующие параметры:
- $pass – переменная, содержащая введенный пароль в строковом типе;
- $algo – алгоритм хеширования и предлагает следующие варианты:
- PASSWORD_DEFAULT – используется алгоритм хеширования,
установленный по умолчанию и может меняться на более сильный
алгоритм в зависимости от версии PHP. Так, в версии 5.5.0 используется
алгоритм bcrypt. По причине того, что в большинстве случаев, пароли
хранятся либо в базах данных, либо в закрытых файлах, рекомендуется
задавать длину поля пароля не менее 60 символов, а рекомендуется 255.
- PASSWORD_BCRYPT – использует алгоритм CRYPT_BLOWFISH. В результате
работы данного алгоритма формируется строка длиной 60 символов,
либо false, в случае возникновения ошибки.
- PASSWORD_ARGON2I и PASSWORD_ARGON2ID – используют алгоритмы
Argon2i и Argon2id. Использование этих алгоритмов возможно, если в
настройках PHP включена поддержка Argon2.
$options – массив с опциями хеширования. Если не задан, то используется
стандартная соль и стоимость. Полный список опций хеширования можно найти в
перечне констант алгоритмов хеширования паролей.
Б) Функция bool password_verify(string $pass, string $hash)
Проверяет соответствие пароля $pass хешу $hash.
Стоит отметить, что функция работает в паре с password_hash(). Так, хеш,
создаваемый указанной функцией уже содержит в себе нужную соль и стоимость и,
соответственно, для работы password_verify() уже нет необходимости
дополнительно их указывать.
Рассмотрим работу этих функций в паре в листинге 30.2.

2
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

Листинг 30.2. Работа функций password_hash() и password_verify()

//Создадим пароль, который будет храниться в виде хеша


$pass = "fjkbSDbkjlSDF<>O";

//Создаем пароль, аналог вводимого пароля пользователем


$inp_pass = "fjkbSDbkjlSDF<>O";

//Хешируем пароль с помощью функции password_hash()


$pass = password_hash($pass, PASSWORD_DEFAULT);

//Выводим хеш пароля на экран


echo "<p>Хеш-код пароля pass: $pass</p>";

//Выводим на экран пароль, который "вводит" пользователь


echo "<p>Пользователь ввел пароль: $inp_pass</p>";

//Проверяем соответствие паролей


if(password_verify($inp_pass, $pass))
echo "<p>Пароль введен верно!</p>";
else
echo "<p>Пароль введен неверно...</p>";

В результате Вы получаете соответствие введенных данных и можете


пропускать пользователя на страницу авторизованного пользователя.