(PHP 4, PHP 5, PHP 7, PHP 8)
crypt — Необратимое хеширование строки
Эта функция (пока) небезопасна для обработки данных в двоичной форме!
$string
, string $salt
): stringcrypt() возвращает хешированную строку, полученную с помощью стандартного алгоритма 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
// соль будет сгенерирована автоматически; не рекомендуется
$hashed_password = crypt('mypassword');
/* Для проверки пароля в качестве параметра salt следует передавать результат работы
crypt() целиком во избежание проблем при использовании различных
алгоритмов (как уже было отмечено выше, стандартный DES-алгоритм
использует 2-символьную соль, а MD5 - 12-символьную. */
if (hash_equals($hashed_password, crypt($user_input, $hashed_password))) {
echo "Пароль верен!";
}
?>
Пример #2 Использование crypt() и htpasswd
<?php
// пароль
$password = 'mypassword';
// получение хеша, соль генерируется автоматически; не рекомендуется
$hash = crypt($password);
?>
Пример #3 Использование 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() использует необратимый алгоритм хеширования.