Я много лет использую mcrypt в своем приложении php, как на win / IIS, так и на linux. Хотя я запускаю PHP 5.4.28 на моем Linux-сервере, я только что обновил до PHP 5.6.11 в моем окне 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-сервере, но возвращает пустое поле в моем локальном окне. Из того, что я прочитал, mcrypt встроен в php 5.6 для окон, поэтому не должно быть никаких попыток расширения или 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.
… где «xx» – длина вашей соли. Таким образом, значение соли должно быть ровно 16, 24 или 32 символа.
У меня нет ответа, но это довольно длинный комментарий.
Он не бросает никаких ошибок, которые я вижу
Проверили ли вы свою конфигурацию, чтобы убедиться, что вы видите ошибки, когда они происходят?
но возвращает пустое поле в моем локальном окне окна
Если он возвращается, то это не приводит к фатальной ошибке. Следовательно, определены функции 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)