crypt

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

cryptНеобратимое хеширование строки

Внимание

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

Описание

crypt(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""./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
"Пароль верен!";
}
?>

Пример #2 Использование crypt() с различными видами хешей

<?php
/* Приведённая соль является только примером. Не используйте эту же соль в вашем коде.
Вы должны сгенерировать уникальную и правильную соль для каждого пароля.
*/
echo 'Стандартный DES: ',
crypt('rasmuslerdorf', 'rl'),
"\n";
echo
'Расширенный DES: ',
crypt('rasmuslerdorf', '_J9..rasm'),
"\n";
echo
'MD5: ',
crypt('rasmuslerdorf', '$1$rasmusle$'),
"\n";
echo
'Blowfish: ',
crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$'),
"\n";
echo
'SHA-256: ',
crypt('rasmuslerdorf', '$5$rounds=5000$usesomesillystringforsalt$'),
"\n";
echo
'SHA-512: ',
crypt('rasmuslerdorf', '$6$rounds=5000$usesomesillystringforsalt$'),
"\n";
?>

Вывод приведённого примера будет похож на:

Стандартный DES: rl.3StKT.4T8M
Расширенный DES: _J9..rasmBYk8r9AiWNc
MD5:          $1$rasmusle$rISCgZzpwk3UhDidwXvin0
Blowfish:     $2y$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi
SHA-256:      $5$rounds=5000$usesomesillystri$KqJWpanXZHKq2BOB43TSaYhEWsQ1Lr5QNyPCDH/Tp.6
SHA-512:      $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21

Примечания

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

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

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