PHP crypt()Функции


PHP String 参考手册Справочное руководство по строкам PHP

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

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

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

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

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

Константы:

  • [CRYPT_SALT_LENGTH] - Длина шифрования по умолчанию. При стандартном шифровании DES длина составляет 2.
  • [CRYPT_STD_DES] - Стандартное шифрование на основе DES имеет 2-символьную соль из алфавита "./0-9A-Za-z". Использование недопустимых символов в соли приведёт к сбою функции.
  • [CRYPT_EXT_DES] - Расширенное шифрование на основе DES имеет 9-символьную соль, состоящую из 1 символа подчёркивания, за которым следуют 4 байта счётчика итераций и 4 байта соли. Они кодируются как печатные символы, по 6 бит на символ, наименее значимый символ идёт первым. Значения от 0 до 63 кодируются как "./0-9A-Za-z". Использование недопустимых символов в соли приведёт к сбою функции.
  • [CRYPT_MD5] - Шифрование MD5 имеет 12-символьную соль, начинающуюся с $1$.
  • [CRYPT_BLOWFISH] - Шифрование Blowfish имеет соль, начинающуюся с $2a$, $2x$ или $2y$, двухзначный параметр стоимости "$", и 22 символа из алфавита "./0-9A-Za-z". Использование символов вне алфавита приведёт к тому, что функция вернёт строку длиной 0. Параметр "$" — это логарифм по основанию 2 от счётчика итераций для алгоритма хеширования на основе Blowfish, и он должен находиться в диапазоне 04-31. Значения вне этого диапазона приведут к сбою функции.
  • [CRYPT_SHA_256] — шифрование SHA-256 имеет 16-символьную соль, начинающуюся с $5$.Если строка соли начинается с "rounds=<N>$", то числовое значение N используется для указания числа выполнений цикла хеширования, аналогично параметру cost в Blowfish. По умолчанию число раундов — 5000, минимум — 1000, максимум — 999,999,999. Любое значение N вне этого диапазона будет приведено к ближайшему граничному значению.
  • [CRYPT_SHA_512] — шифрование SHA-512 имеет 16-символьную соль, начинающуюся с $6$.Если строка соли начинается с "rounds=<N>$", то числовое значение N используется для указания числа выполнений цикла хеширования, аналогично параметру cost в Blowfish. По умолчанию число раундов — 5000, минимум — 1000, максимум — 999,999,999. Любое значение N вне этого диапазона будет приведено к ближайшему граничному значению.

В системах, где эта функция поддерживает несколько алгоритмов, вышеуказанные константы устанавливаются в "1", если поддерживаются, иначе — в "0".

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


Синтаксис

crypt(str,salt)

Parameters Описание
str Обязательный. Указывает строку для кодирования.
salt Необязательный. Строка, используемая для увеличения количества кодируемых символов, что делает кодирование более безопасным. Если параметр salt не указан, случайная соль генерируется при каждом вызове функции.

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

Возвращаемое значение: Возвращает зашифрованную строку или, в случае неудачи, возвращает строку длиной менее 13 символов, которая гарантированно отличается от соли.
Версия PHP: 4+
Список изменений: В PHP 5.3.7 были добавлены режимы Blowfish $2x$ и $2y$ для обработки потенциальных атак на старшие биты.

В PHP 5.3.2 были добавлены константы SHA-256 и SHA-512.

Начиная с PHP 5.3.2, Blowfish возвращает строку сбоя ("*0" или "*1") при недопустимом количестве раундов, а не выполняет откат к DES.

Начиная с PHP 5.3.0, PHP включает собственную реализацию шифрования MD5, стандартную реализацию DES, расширенную реализацию DES и алгоритм Blowfish. Если система не поддерживает вышеуказанные алгоритмы, будет использоваться встроенная реализация алгоритмов PHP.


Примеры

Пример 1

<?php $hashed_password = crypt('mypassword'); //Автоматически сгенерировать соль /*Вы должны использовать полный результат, возвращаемый crypt(), в качестве соли для проверки пароля, чтобы избежать проблем, вызванных использованием разных алгоритмов хеширования. (Как упоминалось выше, хеши паролей на основе стандартного алгоритма DES используют 2-символьную соль, а хеши на основе алгоритма MD5 используют 12-символьную соль.)*/ if (hash_equals($hashed_password, crypt($user_input, $hashed_password))) { echo "Пароль подтверждён!"; } ?>

Пример 2

Использование htpasswd для шифрования crypt():

<?php //Установка пароля $password = 'mypassword'; //Получите хеш-значение с использованием автоматической соли $hash = crypt($password); ?>

Пример 1

В этом примере мы используем разные типы хешей:

<?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"; } ?>

Приведённый выше код выводит следующее (в зависимости от операционной системы):

Standard DES: rl.3StKT.4T8M
Extended 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



PHP String 参考手册Справочное руководство по строкам PHP Другие расширения