crypt

(PHP 4, PHP 5, PHP 7)

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

Внимание

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

Описание

crypt ( string $str , string $salt = ? ) : string

crypt() возвращает хешированную строку, полученную с помощью стандартного алгоритма UNIX, основанного на DES или другого алгоритма, имеющегося в системе.

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

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

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

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

На системах, где функция crypt() поддерживает несколько алгоритмов хеширования, следующие константы устанавливаются в 0 или 1, в зависимости от доступности соответствующего алгоритма:

  • CRYPT_STD_DES - Стандартное DES-шифрование с двухсимвольной солью из алфавита "./0-9A-Za-z""./0-9A-Za-z". Использование других символов в соли повлечет за собой отказ работы crypt().
  • CRYPT_EXT_DES - Расширенное DES-шифрование. "Соль" является девятисимвольной строкой, состоящей из символа подчеркивания, за которым следуют 4 байта счетчика итерации и 4 байта соли. Эти данные будут закодированы в виде печатаемых символов, 6 бит на символ, с меньшим значащим символом указанным первым. Значения от 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(). Версии PHP до 5.3.7 поддерживали только префикс "$2a$" для соли: PHP 5.3.7 добавил новые префиксы для исправления уязвимостей в реализации Blowfish. Для полного понимания ознакомьтесь с » этим разделом, но если кратко, то разработчики должны использовать "$2y$" вместо "$2a$" начиная с PHP 5.3.7.
  • 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. Любое значение вне этого диапазона будет усечено до ближайшего лимита.

Замечание:

Начиная с версии PHP 5.3.0, PHP использует свою собственную реализацию, которая будет использована при отсутствии в системе какого-либо алгоритма.

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

str

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

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

При использовании алгоритма CRYPT_BLOWFISH, параметр str обрезается до 72 символов.

salt

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

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

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

Внимание

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

Примеры

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

<?php
$hashed_password 
crypt('mypassword'); // соль будет сгенерирована автоматически

/* Для проверки пароля в качестве параметра salt следует передавать результат работы
   crypt() целиком во избежание проблем при использовании различных
   алгоритмов (как уже было отмечено выше, стандартный DES-алгоритм
   использует 2-символьную соль, а MD5 - 12-символьную. */
if (hash_equals($hashed_passwordcrypt($user_input$hashed_password))) {
   echo 
"Пароль верен!";
}
?>

Пример #2 Использование crypt() и htpasswd

<?php
// пароль 
$password 'mypassword';

// получение хеша, соль генерируется автоматически
$hash crypt($password);
?>

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

<?php
/* Приведенная соль является только примером. Не используйте эту же соль в вашем коде.
   Вы должны сгенерировать уникальную и правильную соль для каждого пароля.
*/
if (CRYPT_STD_DES == 1) {
    echo 
'Стандартный DES: ' crypt('rasmuslerdorf''rl') . "\n";
}

if (
CRYPT_EXT_DES == 1) {
    echo 
'Расширенный DES: ' crypt('rasmuslerdorf''_J9..rasm') . "\n";
}

if (
CRYPT_MD5 == 1) {
    echo 
'MD5:             ' crypt('rasmuslerdorf''$1$rasmusle$') . "\n";
}

if (
CRYPT_BLOWFISH == 1) {
    echo 
'Blowfish:        ' crypt('rasmuslerdorf''$2a$07$usesomesillystringforsalt$') . "\n";
}

if (
CRYPT_SHA256 == 1) {
    echo 
'SHA-256:         ' crypt('rasmuslerdorf''$5$rounds=5000$usesomesillystringforsalt$') . "\n";
}

if (
CRYPT_SHA512 == 1) {
    echo 
'SHA-512:         ' crypt('rasmuslerdorf''$6$rounds=5000$usesomesillystringforsalt$') . "\n";
}
?>

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

Стандартный DES: rl.3StKT.4T8M
Расширенный DES: _J9..rasmBYk8r9AiWNc
MD5:             $1$rasmusle$rISCgZzpwk3UhDidwXvin0
Blowfish:        $2a$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() - Создает хеш пароля
  • md5() - Возвращает MD5-хеш строки
  • Расширение Mcrypt
  • Страница руководства Unix по вашей функции crypt