English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

PHP базовый урок

PHP продвинутые уроки

PHP & MySQL

PHP справочник

PHP password_hash() функция примеры и примеры

PHP хэш-алгоритм паролей

Функция password_hash() используется для создания хэша пароля.

Требования к версии PHP: PHP 5 >= 5.5.0, PHP 7

Синтаксис

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

password_hash() использует достаточную强度的 однонаправленный алгоритм хэширования для создания хэша пароля. password_hash() совместим с crypt(). Таким образом, хэш пароля, созданного crypt(), также можно использовать с password_hash().

Поддерживаемые алгоритмы:

  • PASSWORD_DEFAULT - Использование алгоритма bcrypt (по умолчанию с PHP 5.5.0).      Внимание, этот константы могут измениться по мере добавления PHP更新的 более сильных алгоритмов.      Таким образом, длина результата, генерируемого этим константами, может измениться в будущем.      Таким образом, столбец в базе данных, в котором хранятся результаты, может быть дольше 60 символов (最好是 255 символов).

  • PASSWORD_BCRYPT - Использование CRYPT_BLOWFISH алгоритм создает хэш.      Это создаст хэш, совместимый с crypt() использования "$2y$".      Результат будет строкой из 60 символов, или в случае неудачи вернется FALSE.

  • PASSWORD_ARGON2I - Создание хэша с использованием алгоритма хэширования Argon2.

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

  • salt (строка) - ручное предоставление соли для хэша пароля. Это предотвратит автоматическое генерирование соли.

    При отсутствии этого значения, password_hash() автоматически генерирует случайную соль для каждого хэша пароля. Это намеренная модель.

    Внимание: опция salt (соль) была弃用 (deprecated) с PHP 7.0.0. В настоящее время лучше всего использовать простую соль, генерируемую по умолчанию.

  • cost (целое число) - это значение cost, используемое алгоритмом. На странице crypt() есть примеры значений cost.

    При отсутствии значения, по умолчанию используется 10. Это значение cost является хорошим минимальным уровнем, но возможно, его можно увеличить в зависимости от характеристик вашего оборудования.

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

  • memory_cost (integer) - Максимальное количество памяти (в байтах byte) для вычисления хеша Argon2. Значение по умолчанию: PASSWORD_ARGON2_DEFAULT_MEMORY_COST.

  • time_cost (integer) - Максимальное время для вычисления хеша Argon2. Значение по умолчанию: PASSWORD_ARGON2_DEFAULT_TIME_COST.

  • threads (integer) - Максимальное количество потоков для вычисления хеша Argon2. Значение по умолчанию: PASSWORD_ARGON2_DEFAULT_THREADS.

Описание параметров:

  • password: Хешированное значение пароля, созданное password_hash().

  • algo: Переменная, указывающая алгоритм хеширования при хешировании пароля.

  • options: Ассоциативный массив, содержащий параметры. В настоящее время поддерживаются два параметра: salt, добавляемая соль при хешировании пароля (строка-интерференция), и cost, указывающий на количество уровней рекурсии алгоритма. Примеры этих значений можно найти на странице crypt().

    Пропущено, используется случайная соль и по умолчанию cost.

Возвратное значение

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

Онлайн пример

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

Результат вывода:

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
<?php
/**
 * В данном случае мы увеличили cost для BCRYPT до 12.
 * Обратите внимание, что мы перешли на генерацию всегда 60 символов.
 */
$options = [
    'cost' => 12,
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options);
?>

Результат вывода:

$2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K

Пример 3

Пример ручного установки соли

<?php
/**
 * Обратите внимание, что соль в данном случае генерируется случайным образом.
 * Никогда не используйте фиксированную соль или соль, которая не генерируется случайным образом.
 *
 * В绝大多数情况下, можно позволить password_hash generate автоматически генерировать случайную соль.
 */
$options = [
    'cost' => 11,
    'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM),
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options);
?>

Результат вывода:

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

Пример 4

Найти наилучшую стоимость с помощью password_hash() примера

<?php
/**
 * Этот пример выполняет базовые тесты производительности (benchmark) на сервере, чтобы определить, сколько может выдержать cost
 * можно установить максимальное значение, не замедляя сервер.
 * 8-10 - это неплохой базовый уровень, при быстром сервере лучше больше.
 * Написанный код рассчитан на <= 50 миллисекунд (milliseconds),
 * Подходящая стоимость для системы обработки входов.
 */
$timeTarget = 0.05; // 50 миллисекунд (milliseconds) 
 
$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

Использование примера Argon2:

<?php
echo 'Argon2 хэш: ' . password_hash('rasmuslerdorf', PASSWORD_ARGON2I);
?>

Результат вывода:

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

PHP хэш-алгоритм паролей