Хеширует строку необратимым способом

# crypt

(PHP 4, PHP 5, PHP 7, PHP 8)

crypt — Хеширует строку необратимым способом

Внимание

Функция пока небезопасна для обработки данных в двоичной форме!

### Описание

function crypt(#[\SensitiveParameter]string `$string`, string `$salt`): string

Функция 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() использует необратимый алгоритм хеширования.

### Смотрите также

- hash_equals() - Сравнивает строки без риска атаки по времени
- password_hash() - Создаёт хеш пароля
- Страница руководства Unix по вашей функции crypt

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open