crypt

(PHP 3, PHP 4, PHP 5)

crypt - Необратимое шифрование (хэширование)

Описание

string crypt ( string str [, string salt] )

crypt() возвращает строку, зашифрованную по стандартному алгоритму UNIX, основанному на DES, или другому алгоритму, имеющемуся в системе. Аргументами являются строка, которую требуется зашифровать, и необязательная salt-последовательность, на которой основывается шифрование. Для получения дополнительной информации обратитесь к руководству UNIX по функции crypt.

Если аргумент salt не передан, он будет выбран случайным образом.

Некоторые операционные системы поддерживают несколько алгоритмов шифрования. Иногда стандартный алгоритм, основанный на DES, заменяется алгоритмом на основе MD5. Вид шифрования определяется salt-последовательностью. При инсталляции PHP определяет, какие алгоритмы шифрования поддерживает crypt. Если salt-последовательность не передана, будет автоматически сгенерирована стандартная случайная двухсимвольная salt-последовательность, если только в системе по умолчанию не используется MD5, в этом случае будет создана случайная salt-последовательность, совместимая с MD5. Предопределенная константа CRYPT_SALT_LENGTH позволяет определить, используется ли в системе стандартная двухсимвольная salt, или 12-символьная.

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

Стандартная функция crypt() на основе DES копирует salt в начало возвращаемой строки. Кроме того, она использует только первые восемь символов строки str, поэтому для различных строк, первые восемь символов в которых совпадают, будет возвращаться один и тот же результат (при использовании одинаковых salt-последовательностей).

На системах, где функция crypt() поддерживает несколько алгоритмов шифрования, следующие константы устанавливаются в 0 или 1 в зависимости от доступности соответствующего алгоритма:

  • CRYPT_STD_DES - Стандартное DES-шифрование с двухсимвольной salt

  • CRYPT_EXT_DES - Расширенное DES-шифрование с девятисимвольной salt

  • CRYPT_MD5 - MD5-шифрование с 12-символьной salt, начинающейся с $1$

  • CRYPT_BLOWFISH - Blowfish-шифрование с 16-символьной salt, начинающейся с $2$

  • CRYPT_SHA256 - SHA-256 hash with a sixteen character salt prefixed with $5$. If the salt string starts with 'rounds='N'$', the numeric value of N is used to indicate how many times the hashing loop should be executed, much like the cost parameter on Blowfish. The default number of rounds is 5000, there is a minimum of 1000 and a maximum of 999,999,999. Any selection of N outside this range will be truncated to the nearest limit.

  • CRYPT_SHA512 - SHA-512 hash with a sixteen character salt prefixed with $6$. If the salt string starts with 'rounds='N'$', the numeric value of N is used to indicate how many times the hashing loop should be executed, much like the cost parameter on Blowfish. The default number of rounds is 5000, there is a minimum of 1000 and a maximum of 999,999,999. Any selection of N outside this range will be truncated to the nearest limit.

Замечание: Функция расшифровки отсутствует, так как crypt() использует необратимый алгоритм шифрования.

Пример 1. Пример использования crypt()
// salt будет сгенерирована автоматически
$password = crypt('My1sTpassword');

// Для проверки пароля в качестве salt следует передавать результат 
// работы crypt() целиком во избежание проблем при использовании
// различных алгоритмов (как уже было отмечено выше, стандартный
// DES-алгоритм использует 2-символьную salt, а MD5 - 12-символьную.

if (crypt($user_input, $password) == $password) {
   echo "Пароль верен !";
}
Пример 2. Использование crypt() с файлом .htpasswd

При создании пароля для использования в файле .htpasswd Apache, нужно использовать 2 первых символа пароля в качестве salt.

// пароль 
$password = 'mypassword';

// получение хэша
$hash = crypt($password, substr($password,0,2));
Пример 3. Пример использования crypt()
Если Вы используете ли вы Apache2 на WinXP и хотите создать. htpasswd файлы с помощью PHP, тогда вам нужно использовать марки APR1-MD5 метод шифрования. Вот функция для этого:
function crypt_apr1_md5($plainpasswd) {
    $salt = substr(str_shuffle("abcdefghijklmnopqrstuvwxyz0123456789"), 0, 8);
    $len = strlen($plainpasswd);
    $text = $plainpasswd.'$apr1$'.$salt;
    $bin = pack("H32", md5($plainpasswd.$salt.$plainpasswd));
    for($i = $len; $i > 0; $i -= 16) { $text .= substr($bin, 0, min(16, $i)); }
    for($i = $len; $i > 0; $i >>= 1) { $text .= ($i & 1) ? chr(0) : $plainpasswd{0}; }
    $bin = pack("H32", md5($text));
    for($i = 0; $i < 1000; $i++) {
        $new = ($i & 1) ? $plainpasswd : $bin;
        if ($i % 3) $new .= $salt;
        if ($i % 7) $new .= $plainpasswd;
        $new .= ($i & 1) ? $bin : $plainpasswd;
        $bin = pack("H32", md5($new));
    }
    for ($i = 0; $i < 5; $i++) {
        $k = $i + 6;
        $j = $i + 12;
        if ($j == 16) $j = 5;
        $tmp = $bin[$i].$bin[$k].$bin[$j].$tmp;
    }
    $tmp = chr(0).chr(0).$bin[11].$tmp;
    $tmp = strtr(strrev(substr(base64_encode($tmp), 2)),
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
    "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
    return "$"."apr1"."$".$salt."$".$tmp;
}

Смотрите также описание функции md5() и модуля Mcrypt.

Все функции строки
Все функции перекодирование
Описание на ru2.php.net
Описание на php.ru