2016-02-22 3 views
2

У меня есть некоторые данные в БД, которые зашифрованы с помощью метода Yii :: app() -> securityManager-> encrypt из класса CSecurityManager.Yii 2 замена класса CSecurityManager

Теперь у меня есть приложение Yii 2, и этот класс не существует в Yii2. Существует класс yii \ base \ Security с методами encryptByKey/decryptByKey, но я не уверен, как его использовать для правильного дешифрования существующих данных.

Любое предложение?

Спасибо.

+0

Использование Yii :: $ app-> безопасности-> encryptByKey - http://www.yiiframework.com/doc-2.0/yii-base-security ,html – crafter

+1

Я знаю об этом классе, написал его под вопросом, но не смог расшифровать данные, уже зашифрованные с помощью класса securityManager. Алгоритмы совершенно разные. – Minja

ответ

2

Когда 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 решения:

  1. Использование Yii 1 и Yii 2 вместе, как описано в official guide.
  2. Используйте только соответствующий метод дешифрования от 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"); 
} 
+0

Да, это был бы путь ... спасибо – Minja