Функция crypt() в PHP

Определение и использование

Функция crypt() возвращает строку, зашифрованную с использованием алгоритмов DES, Blowfish или MD5.

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

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

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

Константы:

[CRYPT_SALT_LENGTH] Удаленная длина шифрования. Используется стандартное шифрование DES, длина 2.
[CRYPT_STD_DES] Хэш-функция на основе стандартного алгоритма DES использует два символа из набора символов "./0-9A-Za-z" в качестве соли. Использование недопустимых символов в соли приведет к сбою crypt().
[CRYPT_EXT_DES] Расширенная хэш-функция на основе алгоритма DES. Солью является строка из 9 символов, состоящая из одного подчеркивания, за которым следуют 4 байта количества итераций и 4 байта соли. Они кодируются в printable characters, каждый символ из 6 бит, приоритет у символов с минимальным количеством эффективных бит. Символы от 0 до 63 кодируются как "./0-9A-Za-z". Использование недопустимых символов в соли приведет к сбою crypt().
[CRYPT_MD5] хеширование MD5 использует 12-символьную строку соли, начинающуюся с $1$.
[CRYPT_BLOWFISH] алгоритм Blowfish использует соль в виде "$2a$", двухзначный параметр cost, "$" и 64-битной строки, состоящей из символов combinations из "./0-9A-Za-z". Использование символов за пределами этого диапазона приведет к тому, что crypt() вернет пустую строку. Двухзначный параметр cost является логарифмом количества циклов по основанию 2, его диапазон составляет от 04 до 31. Значения за пределами этого диапазона приведут к сбою crypt().
CRYPT_SHA256 алгоритм SHA-256 использует 16-символьную строку соли, начинающуюся с $5$, для хеширования. Если строка соли начинается с "rounds=<N>$", числовое значение N будет использоваться для указания количества выполняемых хеширования циклов, что очень похоже на параметр cost алгоритма Blowfish. По умолчанию количество циклов составляет 5000, минимально 1000, максимально 999,999,999. Значения N за пределами этого диапазона будут преобразованы в ближайшее значение.
CRYPT_SHA512 алгоритм SHA-512 использует 16-символьную строку соли, начинающуюся с $6$, для хеширования. Если строка соли начинается с "rounds=<N>$", числовое значение N будет использоваться для указания количества выполняемых хеширования циклов, что очень похоже на параметр cost алгоритма Blowfish. По умолчанию количество циклов составляет 5000, минимально 1000, максимально 999,999,999. Значения N за пределами этого диапазона будут преобразованы в ближайшее значение.

на системах, поддерживающих различные алгоритмы, если поддерживаются указанные константы, установите их в "1", в противном случае установите в "0".

备注:нет соответствующей функции для дешифрования. Функция crypt() использует однонаправленный алгоритм.

синтаксис

crypt(строка,соль)
параметры описание
строка обязателен. Определяет строку, которую нужно закодировать.
соль опционально. Используется для的增加 количества закодированных символов, чтобы сделать кодирование более безопасным. Если параметр соли не предоставлен, PHP будет генерировать случайную соль каждый раз при вызове функции.

технические детали

возвратное значение: возвращает зашифрованную строку или строку короче 13 символов, чтобы отличить её от соли в случае ошибки.
версия PHP: 4+

журнал обновлений

Версия Описание
5.3.2 На основе реализации Ulrich Drepper, добавлена поддержка crypt с алгоритмами SHA-256 и SHA-512.
5.3.2 Исправлена проблема с алгоритмом Blowfish, возникающая из-за незаконного цикла, которая возвращает строку "неудача" ("*0" или "*1"), вместо того чтобы перейти на DES алгоритм.
5.3.0 PHP теперь включает в себя свою реализацию MD5 Crypt, включая стандартный DES алгоритм, расширенный DES алгоритм и Blowfish алгоритм. Если в системе отсутствует соответствующая реализация, PHP будет использовать свою собственную.

Пример

Пример 1

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

<?php
// Двухсимвольный salt
if (CRYPT_STD_DES == 1)
{
echo "Standard DES: ".crypt('something','st')."\n<br>";
}
else
{
echo "Standard DES not supported.\n<br>";
}
// 4 символа salt
if (CRYPT_EXT_DES == 1)
{
echo "Extended DES: ".crypt('something','_S4..some')."\n<br>";
}
else
{
echo "Extended DES not supported.\n<br>";
}
// Начинающийся с $1$ 12 символов
if (CRYPT_MD5 == 1)
{
echo "MD5: ".crypt('something','$1$somethin$')."\n<br>";
}
else
{
echo "MD5 not supported.\n<br>";
}
// Начинающийся с $2a$ Salt. Двузначный параметр cost: 09. 22 символа
if (CRYPT_BLOWFISH == 1)
{
echo "Blowfish: ".crypt('something','$2a$09$anexamplestringforsalt$')."\n<br>";
}
else
{
echo "Blowfish DES not supported.\n<br>";
}
// Соль начинается с $5$, длина 16 символов. По умолчанию количество итераций 5000.
if (CRYPT_SHA256 == 1)
{
echo "SHA-256: ".crypt('something','$5$rounds=5000$anexamplestringforsalt$')."\n<br>";
else
{
echo "SHA-256 not supported.\n<br>";
}
// Соль начинается с $5$, длина 16 символов. По умолчанию количество итераций 5000.
if (CRYPT_SHA512 == 1)
{
echo "SHA-512: ".crypt('something','$6$rounds=5000$anexamplestringforsalt$');
}
else
{
echo "SHA-512 not supported.";
}
?>

Вывод кода выше (в зависимости от операционной системы):

Standard DES: stqAdD7zlbByI
Extended DES: _S4..someQXidlBpTUu6
MD5: $1$somethin$4NZKrUlY6r7K7.rdEOZ0w.
Blowfish: $2a$09$anexamplestringforsaleLouKejcjRlExmf1671qw3Khl49R3dfu
SHA-256: $5$rounds=5000$anexamplestringf$KIrctqsxo2wrPg5Ag/hs4jTi4PmoNKQUGWFXlVy9vu9
SHA-512: $6$rounds=5000$anexamplestringf$Oo0skOAdUFXkQxJpwzO05wgRHG0dhuaPBaOU/
oNbGpCEKlf/7oVM5wn6AN0w2vwUgA0O24oLzGQpp1XKI6LLQ0.