(PHP 4, PHP 5)
crypt — Необратимое хэширование строки
$str
[, string $salt
] )crypt() возвращает хэшированную строку, полученную с помощью стандартного алгоритма UNIX, основанного на DES, или другого алгоритма, имеющегося в системе.
Некоторые операционные системы поддерживают несколько алгоритмов
хэширования. Иногда стандартный алгоритм, основанный на 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$", весовой параметр из двух цифр, "$" и
22 цифры из алфавита "./0-9A-Za-z". Использование других
символов в соли повлечет за собой возвращение пустой строки.
Весовой параметр из двух цифр является двоичным логарифмом
счетчика итераций низлежащего хэширующего алгоритма, основанного
на Blowfish, и должен быть в диапазоне 04-31, значения вне
данного диапазона вызовут отказ crypt().
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
Хэшируемая строка.
salt
Необязательный параметр с солью, на которой будет основано хэширование. Если не указан, поведение определяется по наличию реализованных алгоритмов в системе и может привести к неожиданным результатам.
Возвращает хэшированную строку или строку короче 13 символов, гарантированно отличающуюся от соли в случае ошибки.
Версия | Описание |
---|---|
5.3.2 | Добавлено хэширование алгоритмами SHA-256 и SHA-512, основанное на » реализации Ulrich Drepper. |
5.3.2 | Исправлено поведение Blowfish при некорректных раундах: теперь возвращается "ошибочная" строка ("*0" или "*1") вместо отката к использованию DES. |
5.3.0 | PHP теперь использует собственную реализацию MD5, стандартного DES, расширенного DES и Blowfish алгоритмов, которые будут использованы в случае отсутствия их поддержки в системе. |
Пример #1 Пример использования crypt()
<?php
$password = crypt('mypassword'); // соль будет сгенерирована автоматически
/* Для проверки пароля в качестве параметра salt следует передавать результат работы
crypt() целиком во избежание проблем при использовании различных
алгоритмов (как уже было отмечено выше, стандартный DES-алгоритм
использует 2-символьную соль, а MD5 - 12-символьную. */
if (crypt($user_input, $password) == $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() использует необратимый алгоритм хэширования.