Функции хеширования паролей
PHP Manual

password_hash

(PHP 5 >= 5.5.0, PHP 7)

password_hashСоздает хеш пароля

Описание

string password_hash ( string $password , integer $algo [, array $options ] )

password_hash() создает хеш пароля используя сильный, необратимый алгоритм хеширования. Функция password_hash() совместима с функцией crypt(). Следовательно, хеши паролей, созданные crypt() можно использовать с password_hash().

В данный момент поддерживаются следующие алгоритмы:

Поддерживаемые опции для PASSWORD_BCRYPT:

Поддерживаемые опции для PASSWORD_ARGON2I:

Список параметров

password

Пользовательский пароль.

Предостережение

Использование алгоритма PASSWORD_BCRYPT приведёт к обрезанию поля password до максимальной длины в 72 символа.

algo

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

options

Ассоциативный массив с опциями. За документацией по поддерживаемым опциям для каждого алгоритма обратитесь к разделу "Константы алгоритмов хеширования паролей".

Если не задано, то будет использована стандартная стоимость и соль будет генерироваться автоматически.

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

Возвращает хешированный пароль, или FALSE в случае возникновения ошибки.

Использованный алгоритм, стоимость и соль будут возвращены как часть хеша. Таким образом, информация необходимая для проверки хеша будет в него включена. Это позволит функции password_verify() проверять хеш без необходимости отдельного хранения информации о соли и алгоритме.

Примеры

Пример #1 Пример использования password_hash()

<?php
/**
 * Мы просто хотим захешировать свой пароль используя настройки по умолчанию.
 * Значит будет использован BCRYPT и результат будет 60 символов длиной.
 *
 * Помните, что алгоритм по умолчанию может измениться в будущем, так что
 * имеет смысл заранее позаботиться о том, чтобы система хранения хешей
 * смогла хранить более 60 символов (255 в самый раз)
 */
echo password_hash("rasmuslerdorf"PASSWORD_DEFAULT);
?>

Результатом выполнения данного примера будет что-то подобное:

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

Пример #2 Пример использования password_hash() с ручным заданием стоимости

<?php
/**
 * Тут мы увеличиваем алгоритмическую стоимость BCRYPT до 12.
 * Но это никак не скажется на длине полученного результата, она останется 60 символов
 */
$options = [
    
'cost' => 12,
];
echo 
password_hash("rasmuslerdorf"PASSWORD_BCRYPT$options);
?>

Результатом выполнения данного примера будет что-то подобное:

$2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K

Пример #3 Пример использования password_hash() с ручным заданием соли

<?php
/**
 * Обратите внимание, что мы все равно генерируем соль автоматически.
 * Никогда не используйте для соли заранее заданное статическое значение.
 *
 * Самым лучшим выбором будет позволить password_hash создавать соль автоматически
 */
$options = [
    
'cost' => 11,
    
'salt' => mcrypt_create_iv(22MCRYPT_DEV_URANDOM),
];
echo 
password_hash("rasmuslerdorf"PASSWORD_BCRYPT$options);
?>

Результатом выполнения данного примера будет что-то подобное:

$2y$11$q5MkhSBtlsJcNEVsYh64a.aCluzHnGog7TQAKVmQwO9C8xb.t89F.

Пример #4 Пример поиска хорошего значения стоимости для password_hash()

<?php
/**
 * Данный код замерит скорость выполнения операции хеширования для вашего сервера
 * с разными значениями алгоритмической сложности для определения максимального
 * его значения, не приводящего к деградации производительности. Хорошее базовое 
 * значение лежит в диапазоне 8-10, но если ваш сервер достаточно мощный, то можно 
 * задать и больше. Данный скрипт ищет максимальное значение, при котором 
 * хеширование уложится в 50 миллисекунд.
 */
$timeTarget 0.05// 50 миллисекунд.

$cost 8;
do {
    
$cost++;
    
$start microtime(true);
    
password_hash("test"PASSWORD_BCRYPT, ["cost" => $cost]);
    
$end microtime(true);
} while ((
$end $start) < $timeTarget);

echo 
"Оптимальная стоимость: " $cost;
?>

Результатом выполнения данного примера будет что-то подобное:

Оптимальная стоимость: 10

Пример #5 Пример использования password_hash() с Argon2

<?php
echo 'Argon2 hash: ' password_hash('rasmuslerdorf'PASSWORD_ARGON2I);
?>

Результатом выполнения данного примера будет что-то подобное:

Argon2 hash: $argon2i$v=19$m=1024,t=2,p=2$YzJBSzV4TUhkMzc3d3laeg$zqU/1IN0/AogfP4cmSJI1vc8lpXRW9/S0sYY2i2jHT0

Примечания

Предостережение

Настоятельно рекомендуется использовать автоматическую генерацию соли. Данная функция самостоятельно создаст хорошую соль, если вы не будете ей мешать подсовывая свою.

Как было замечено выше, опция salt была объявлена устаревшей в PHP 7.0 и будет вызывать соответствующее предупреждение. Поддержка ручного задания соли может быть удалена в более новых версиях.

Замечание:

Рекомендуется протестировать данную функцию на вашем железе для определения оптимального значения алгоритмической сложности. Убедитесь, что с выбранной сложностью функция выполняется быстрее 100 миллисекунд для интерактивных систем. Скрипт показанный выше поможет вам выбрать подходящее значение.

Замечание: Обновление поддерживаемых алгоритмов для этой функции (или изменение значения по умолчанию) обязаны следовать правилам:

  • Любой новый алгоритм должен присутствовать в ядре как минимум 1 полный релиз PHP для того, чтобы его можно было установить по умолчанию. Таким образом если, к примеру, новый алгоритм был добавлен в 7.5.5, то задать по умолчанию его можно будет только в 7.7 (7.6 будет тем самым полным релизом, в течение которого он должен присутствовать, от 7.6.0 до 7.7.0). Но если новый алгоритм добавлен в 7.6.0, то его также можно будет задать по умолчанию в 7.7.0.
  • Алгоритм по умолчанию может быть изменен только в полном релизе (7.3.0, 8.0.0, и т.д.), но не в промежуточных. Единственное исключение - это если в текущем алгоритме найдена критическая уязвимость.

Список изменений

Версия Описание
7.2.0 Добавлена поддержка хеширующего алгоритма Argon2 с помощью PASSWORD_ARGON2I.

Смотрите также


Функции хеширования паролей
PHP Manual