Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Yii 2替换CSecurityManager类_Php_Encryption_Yii_Yii2 - Fatal编程技术网

Php Yii 2替换CSecurityManager类

Php Yii 2替换CSecurityManager类,php,encryption,yii,yii2,Php,Encryption,Yii,Yii2,我在数据库中有一些数据是使用CSecurityManager类中的Yii::app()->securityManager->encrypt方法加密的 现在我有了Yii2应用程序,而这个类在Yii2中并不存在。yii\base\Security类具有encryptByKey/decryptByKey方法,但我不确定如何使用它正确解密现有数据 有什么建议吗 谢谢。在设计Yii 2时,向后兼容性是次要考虑因素。yii2是一个完全不同的代码库,从头开始重新设计。开发人员的目标是创建最好的框架,而不是保持

我在数据库中有一些数据是使用CSecurityManager类中的Yii::app()->securityManager->encrypt方法加密的

现在我有了Yii2应用程序,而这个类在Yii2中并不存在。yii\base\Security类具有encryptByKey/decryptByKey方法,但我不确定如何使用它正确解密现有数据

有什么建议吗

谢谢。

在设计Yii 2时,向后兼容性是次要考虑因素。yii2是一个完全不同的代码库,从头开始重新设计。开发人员的目标是创建最好的框架,而不是保持最大的向后兼容性。在这些更改中,Yii 1和Yii 2中的加密/解密方法不兼容

这不是因为在Yii 2.0.3(,)中删除
mcrypt
以支持
openssl
而触发的代码集差异很大,因为该更改是向后兼容的。相反,Yii 2.0.0与Yii 1.1.x不兼容,尽管两者都使用了
mcrypt
,因为加密方法的输出不同:

  • Yii 1:
    [IV][ciphertext]
  • Yii 2:
    [keySalt][MAC][IV][ciphertext]
其中,
[keySalt]
是随机密钥,
[MAC]
是消息身份验证码,
[IV]
是初始化向量,
[ciphertext]
是真正的加密数据本身。由于yii2中的解密算法没有为yii1生成的输入做好准备,因此它们不兼容。Yii 2的解决方案被认为是优越的,因为它更容易检测数据是否被篡改

如果您想要向后兼容,您有两种解决方案:

  • 如中所述,同时使用Yii 1和Yii 2
  • 仅使用Yii 1中的相关解密方法。这当然需要一些更改(不仅仅是复制粘贴),因为原始代码依赖于yii1框架
  • 在这方面,这应该是可行的:

    use yii\helpers\StringHelper;
    
    function yii_legacy_decrypt($data,$key=null)
    {
        $module=@mcrypt_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->security->encryptByKey-我知道这个类,并编写了它,但无法解密已经用securityManager类加密的数据。算法是完全不同的。