crypt
(PHP 4, PHP 5, PHP 7, PHP 8)
crypt — Хеширует строку необратимым способом
Внимание
Функция пока небезопасна для обработки данных в двоичной форме!
Описание
До версии 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().
Примеры
Пример #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()
использует необратимый алгоритм хеширования.
Смотрите также
- hash_equals() - Сравнивает строки без риска атаки по времени
- password_hash() - Создаёт хеш пароля
- Страница руководства Unix по вашей функции crypt