crypt

(PHP 4, PHP 5, PHP 7, PHP 8)

cryptХеширует строку необратимым способом

Внимание

Функция пока небезопасна для обработки данных в двоичной форме!

Описание

crypt(#[\SensitiveParameter] string $string, string $salt): string

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

До версии PHP 8.0.0 параметр salt был необязательным. Однако функция crypt() без параметра salt создаёт слабый хеш, а без него выдаёт ошибку уровня E_NOTICE. Разработчики задают сложную соль, чтобы улучшить безопасность.

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

Вид хеширования определяется переданным аргументом salt (соль). Если соль не указали, функция автоматически сгенерирует стандартную случайную двухсимвольную (DES) или двенадцатисимвольную (MD5) соль, в зависимости от доступности алгоритма MD5 в функции crypt(). Предопределённая константа CRYPT_SALT_LENGTH помогает определить максимально доступную длину соли в соответствии с алгоритмами.

Стандартная функция crypt() на основе алгоритма DES возвращает соль как первые два символа возвращаемой строки. Кроме того, функция использует только первые восемь символов строки string, поэтому более длинные строки, которые начинаются с тех же восьми символов, сгенерируют один и тот же результат (при одинаковой соли).

Поддерживаются следующие типы хешей:

  • CRYPT_STD_DES — Стандартное DES-шифрование с двухсимвольной солью из алфавита «./0-9A-Za-z». Другие символы в соли повлекут за собой отказ работы функции crypt().
  • CRYPT_EXT_DES — Расширенное DES-шифрование. «Соль» — 9-символьная строкой, которая состоит из символа подчёркивания, за которым следуют 4 символа счётчика итерации и 4 символа соли. Каждая из этих 4-символьных строк кодирует 24 бита, наименьший символ первым. Значения от 0 до 63 кодируются как ./0-9A-Za-z. Недопустимые символы в соли приведут к ошибке функции crypt().
  • CRYPT_MD5 — MD5-шифрование с 12-символьной солью, которая начинается с последовательности символов $1$.
  • CRYPT_BLOWFISH — Blowfish-шифрование со следующей солью: «$2a$», «$2x$» или «$2y$», весовой параметр из двух цифр, «$» и 22 цифры из алфавита «./0-9A-Za-z». Другие символы в соли повлекут за собой возврат пустой строки. Весовой параметр из двух цифр — двоичный логарифм счётчика итераций нижележащего хеширующего алгоритма, который основан на криптографическом алгоритме Blowfish, и должен находиться в диапазоне 04-31, значения вне этого диапазона вызовут отказ функции crypt(). Хеши «$2x$» потенциально слабые; Хэши «$2a$» совместимы и смягчают эту слабость. Для новых хэшей лучше использовать «$2y$».
  • CRYPT_SHA256 — хеш SHA-256 с шестнадцатисимвольной солью, которая начинается с последовательности символов $5$. Если строка с солью начинается с 'rounds=<N>$', функция использует число N для обозначения количества раундов хеширования, по аналогии с весовым параметром в алгоритме Blowfish. По умолчанию количество раундов равно 5000, минимально доступно 1000 и максимально 999 999 999. Любое значение вне этого диапазона функция усечёт до ближайшего лимита.
  • CRYPT_SHA512 — хеш SHA-512 с шестнадцатисимвольной солью, которая начинается с последовательности символов $6$. Если строка с солью начинается с 'rounds=<N>$', функция использует число N для обозначения количества раундов хеширования, по аналогии с весовым параметром в алгоритме Blowfish. По умолчанию количество раундов равно 5000, минимально доступно 1000 и максимально 999 999 999. Любое значение вне этого диапазона функция усечёт до ближайшего лимита.

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

string

Хешируемая строка.

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

С алгоритмом CRYPT_BLOWFISH, параметр string обрезается до 72 байт.

salt

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

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

Функция возвращает хешированную строку или строку короче 13 символов, которая гарантированно отличается от соли, если возникла ошибка.

Внимание

При проверке паролей следует использовать функцию сравнения строк, устойчивую к атаке по времени, для сравнения вывода функции crypt() с известным хешом. Для этих целей в PHP предусмотрели функцию hash_equals().

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

Версия Описание
8.0.0 Параметр salt больше необязателен.

Примеры

Пример #1 Пример использования функции crypt()

<?php

$user_input
= 'rasmuslerdorf';
$hashed_password = '$6$rounds=1000000$NJy4rIPjpOaU$0ACEYGg/aKCY3v8O8AfyiO7CTfZQ8/W231Qfh2tRLmfdvFD6XfHk12u6hMr9cYIA4hnpjLNSTRtUwYr9km9Ij/';

// Проверка существующего хеша функции crypt() на совместимость с программным обеспечением, отличным от PHP
if (hash_equals($hashed_password, crypt($user_input, $hashed_password))) {
echo
"Password verified!";
}

?>

Примечания

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

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

  • hash_equals() - Сравнивает строки без риска атаки по времени
  • password_hash() - Создаёт хеш пароля
  • Страница руководства Unix по вашей функции crypt