Когда Yii 2 был разработан, обратная совместимость была вторичным соображением. Yii 2 - совершенно другая база кода, переработанная с нуля. Разработчики стремились создать наилучшую структуру, которая может помочь, а не поддерживать максимальную обратную совместимость. Среди этих изменений метод шифрования/дешифрования в Yii 1 и Yii 2 несовместимы.
Это не был вызван тем, что в значительной степени различной Codeset вызванной сбросив mcrypt
в пользу openssl
в Yii 2.0.3 (release notes, discussion), так как это изменение было обратной совместимостью. Вместо Yii 2.0.0 не совместим с Yii 1.1.x хотя оба используют mcrypt
, из-за различного вывода методов шифрования:
- Yii 1:
[IV][ciphertext]
- Yii 2 :
[keySalt][MAC][IV][ciphertext]
где [keySalt]
является случайным ключом, [MAC]
является а.е. сообщений код затемнения, [IV]
- это вектор инициализации, а [ciphertext]
- это настоящие зашифрованные данные. Поскольку алгоритм дешифрования в Yii 2 не готов для ввода, генерируемого Yii 1, они несовместимы. Решение Yii 2 считается превосходным, поскольку оно обнаруживает более легко, если данные были подделаны.
Обобщенная, если вы хотите обратную совместимость, то есть 2 решения:
- Использование Yii 1 и Yii 2 вместе, как описано в official guide.
- Используйте только соответствующий метод дешифрования от Yii 1. Для этого, конечно, требуются некоторые изменения (а не только копирование), поскольку исходный код зависит от структуры Yii 1.
Вот это должно работать:
use yii\helpers\StringHelper;
function yii_legacy_decrypt($data,$key=null)
{
[email protected]_module_open('des','', MCRYPT_MODE_CBC,'');
$key=StringHelper::byteSubstr($key===null ? md5(Yii::$app->security->getRandomString(32)) : $key,0,mcrypt_enc_get_key_size($module));
$ivSize=mcrypt_enc_get_iv_size($module);
$iv=StringHelper::byteSubstr($data,0,$ivSize);
mcrypt_generic_init($module,$key,$iv);
$decrypted=mdecrypt_generic($module,StringHelper::byteSubstr($data,$ivSize,StringHelper::byteLength($data)));
mcrypt_generic_deinit($module);
mcrypt_module_close($module);
return rtrim($decrypted,"\0");
}
Использование Yii :: $ app-> безопасности-> encryptByKey - http://www.yiiframework.com/doc-2.0/yii-base-security ,html – crafter
Я знаю об этом классе, написал его под вопросом, но не смог расшифровать данные, уже зашифрованные с помощью класса securityManager. Алгоритмы совершенно разные. – Minja