|
|
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()
использует необратимый алгоритм шифрования.
Пример 1. Пример использования crypt() |
<?php
$password = crypt('My1sTpassword'); if (crypt($user_input, $password) == $password) {
echo "Пароль верен !";
}
?>
|
|
Пример 2. Использование crypt() с файлом .htpasswd
При создании пароля для использования в файле .htpasswd Apache, нужно
использовать 2 первых символа пароля в качестве salt.
|
<?php
$password = 'mypassword';
$hash = crypt($password, substr($password, 0, 2));
?>
|
|
См. также описание функции
md5() и
модуля Mcrypt.
whatnet at NOSPAM dot gmail dot com
20-Aug-2007 02:40
You should be careful when using "random" or "time specific" information to effect the outcome of the encryption. Keep in mind that if it's used for, say a user's password, that you will need to generate the same outcome in order to compare the user's input, to whatever you have in the database.
It might be a suggestion to store your "unique key", with the user's information inside the database.
sdc
17-Jul-2007 08:49
ECB is one of the least secure block cipher modes (Wikipedia has some good information about these: http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation) because it is the only mode, out of the one's available for use with MCRYPT, that does not actually use the IV provided. Note: PHP will emit an E_WARNING if the IV is missing or if its length is not equal to the size mandated by mcrypt_get_iv_size().
In response to <addiakogiannis at isds dot gr>, even though the IV is randomly generated in the encryption and decryption functions, the output remains the same given the same plaintext and key because the mode is ECB. If a different mode is used, the IV must be preserved (say, by concatenation with the ciphertext) in order for the ciphertext to be decrypted properly. That is:
<?php
function RIJNDAEL_encrypt($text){
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key = "This is a very secret key";
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CFB, $iv));
}
function RIJNDAEL_decrypt($text){
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key = "This is a very secret key";
return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($text), MCRYPT_MODE_CFB, $iv));
}
echo RIJNDAEL_decrypt(RIJNDAEL_encrypt('Her name was lola!'));
?>
...will output a random, 18-character string. Thus, the length of the plaintext is preserved, but the data is completely corrupted.
addiakogiannis at isds dot gr
13-Jul-2007 03:46
Two siple functions for encrypting and decrypting with RIJNDAEL 256
function RIJNDAEL_encrypt($text){
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key = "This is a very secret key";
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, $iv));
}
function RIJNDAEL_decrypt($text){
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key = "This is a very secret key";
//I used trim to remove trailing spaces
return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($text), MCRYPT_MODE_ECB, $iv));
}
//example
echo RIJNDAEL_decrypt(RIJNDAEL_encrypt('Her name was lola!'));
leth at nowhere dot not
06-Apr-2007 07:51
for me(on OpenBSD4.0+Apache 1.3(standard)+php4.3.10) blowfish seems to work if you do something like this:
if (CRYPT_BLOWFISH == 1)
{
$salt="this should really be a long line of salt";
$blowfish_salt = "\$2a\$07\$".substr($salt, 0, CRYPT_SALT_LENGTH);
echo crypt($pass, $blowfish_salt);
}
of course with $salt set as a good long salt.
Jou
06-Apr-2007 01:52
I found out that you can use php:s crypt function to change the user/root password in Linux distributions (at least in Slackware).
You just have to change the encrypted password for the user in the /etc/shadow file with the output from crypt("newpassword");
|