Я много лет использовал mcrypt в своем приложении php, как на win / IIS, так и на linux. Хотя я использую PHP 5.4.28 на своем сервере Linux, я только что обновился до PHP 5.6.11 на своем компьютере с Windows 8.1 IIS. И Mcrypt больше не работает. Это не выдает никаких ошибок, которые я вижу; это просто не работает. Вот моя функция шифрования:
function Encrypt($text){
global $salt;
if($text != "")
return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))));
else
return "";
}
Это прекрасно работает на моем сервере Linux, но возвращает пустым на моем локальном окне Windows. Из того, что я прочитал, mcrypt встроен в php 5.6 для Windows, поэтому не должно быть никаких проблем с расширениями или ini-файлами.
Что мне не хватает?
Давайте посмотрим на ваш код по частям. (В основном с косметическими / пробельными изменениями.)
function Encrypt($text)
{
global $salt; // Why not make this a second parameter?
if($text != "") { // An unusual check, for sure
return trim( // base64_encode doesn't leave whitespace
base64_encode(
mcrypt_encrypt(
MCRYPT_RIJNDAEL_256, // This is a non-standard variant of the
// Rijndael cipher. You want to use the
// MCRYPT_RIJNDAEL_128 constant if you
// wanted to use AES here.
$salt, // This is a key, not a salt!
$text,
MCRYPT_MODE_ECB, // ECB mode is the worst mode to use for
// cryptography. Among other reasons, it
// doesn't even use the IV. Search for
// ECB penguins for an idea of why ECB
// mode is such a bad idea.
mcrypt_create_iv(
mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB),
MCRYPT_RAND // You're using ECB mode so this is a waste
// anyway, but you should use
// MCRYPT_DEV_URANDOM instead of MCRYPT_RAND
)
)
)
);
}
return "";
}
Я настоятельно рекомендую вам не использовать эту функцию ни для чего. Это не безопасно. Не используйте режим ECB.
Более того, шифрование без аутентификации опасно а также libmcrypt является заброшенным.
PHP 5.6 имеет более строгие требования к шифрованию, чем 5.4. В 5.6 вы получите это предупреждение, которое на самом деле является ошибкой, поскольку фактически приводит к сбою шифрования и дешифрования:
Предупреждение: mcrypt_encrypt (): ключ размера xx не поддерживается этим алгоритмом. Поддерживаются только ключи размером 16, 24 или 32.
…где «хх» — это длина вашей соли. Таким образом, значение соли должно быть точно 16, 24 или 32 символа в длину.
У меня нет ответа, но это довольно длинный комментарий.
Он не выдает никаких ошибок, которые я вижу
Проверяли ли вы свою конфигурацию, чтобы убедиться, что вы видите ошибки, когда они возникают?
но возвращается пустым на моем локальном окне Windows
Если он возвращается, то это не вызывает фатальную ошибку. Следовательно, функции mcrypt определены. Вы проверили, что константы определены? Вы проверили, что версия libmcrypt соответствует требованию расширения PHP?
Вы проверили, что входные данные для функций mcrypt _ * () выглядят разумно?
return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))));
Даже если вышеупомянутое сработало, это ужасная часть кода. Причина написания кода и использования языков высокого уровня не в том, что ваш компьютер может их понимать, а в том, чтобы люди могли понимать код:
$iv=mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$encypted=mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB
, $iv, MCRYPT_RAND);
$encoded=base64_encode($encrypted);
return $encoded;
(раскладывание вашего кода таким образом также упрощает внедрение проверок, точек останова и других мер отладки).
Как указывалось выше в SweatCoder, ваш ключ для MCRYPT_RIJNDAEL_256 должен иметь длину 32. Чтобы продолжить работу, когда ваш старый ключ меньше 32 (здесь он называется $ oldkey), используйте
$key = str_pad($oldkey, 32, chr(0));
($ key — это то, что вы назвали $ salt)