Функция password_hash() в PHP

PHP 密码散列算法Алгоритмы хеширования паролей в 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алгоритм для создания хеша. Это создаст хеш, совместимый с использованием префикса "$2y$".crypt()Результатом будет строка из 60 символов или FALSE при неудаче.FALSE。
  • PASSWORD_ARGON2I- Используйте алгоритм хеширования Argon2 для создания хеша.

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

  • salt (string) - Вручную предоставьте соль для хеширования пароля. Это позволяет избежать автоматической генерации соли.

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

    Примечание: Опция salt устарела начиная с PHP 7.0.0. Теперь лучше просто использовать соль, генерируемую по умолчанию.

  • cost (integer) - Представляет стоимость, используемую алгоритмом. Примеры значений cost можно найти на странице crypt().

    Если опущено, значение по умолчанию — 10. Эта стоимость является хорошей базовой величиной, но вы можете увеличить это значение в зависимости от вашего оборудования.

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

  • memory_cost (integer) - Максимальный объем памяти (в байтах), используемый при вычислении хеша 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().

    Если опущено, будут использоваться случайная соль и стоимость по умолчанию.

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

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

Примеры

Пример 1

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

Вывод:

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

Пример 2

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

Вывод:

$2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K

Пример 3

Пример ручной установки значения salt

<?php /** * Обратите внимание, что соль здесь генерируется случайным образом. * Никогда не используйте фиксированную соль или соль, которая не сгенерирована случайным образом. * * В большинстве случаев вы можете позволить password_hash автоматически сгенерировать случайную соль для вас.*/ $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() для поиска оптимального значения cost

<?php /** * В этом примере выполняется тестирование производительности сервера, чтобы проверить, насколько высокое значение cost сервер может выдержать. * Можно установить максимальное значение, которое не будет существенно замедлять работу сервера. * 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: " . $cost; ?>

Вывод:

Appropriate Cost Found: 10

Пример 5

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

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

Вывод:

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

PHP 密码散列算法Алгоритмы хеширования паролей в PHP

Другие расширения