(PHP 4, PHP 5, PHP 7, PHP 8)
crypt — Хеширует строку необратимым способом
Функция пока небезопасна для обработки данных в двоичной форме!
Функция 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».
Другие символы в соли повлекут за собой отказ работы функции 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 "Password verified!";
}
?>
Замечание: Функция расшифровки отсутствует, поскольку функция crypt() использует необратимый алгоритм хеширования.