Php Yii 2替换CSecurityManager类
我在数据库中有一些数据是使用CSecurityManager类中的Yii::app()->securityManager->encrypt方法加密的 现在我有了Yii2应用程序,而这个类在Yii2中并不存在。yii\base\Security类具有encryptByKey/decryptByKey方法,但我不确定如何使用它正确解密现有数据 有什么建议吗 谢谢。在设计Yii 2时,向后兼容性是次要考虑因素。yii2是一个完全不同的代码库,从头开始重新设计。开发人员的目标是创建最好的框架,而不是保持最大的向后兼容性。在这些更改中,Yii 1和Yii 2中的加密/解密方法不兼容 这不是因为在Yii 2.0.3(,)中删除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是一个完全不同的代码库,从头开始重新设计。开发人员的目标是创建最好的框架,而不是保持
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的解决方案被认为是优越的,因为它更容易检测数据是否被篡改
如果您想要向后兼容,您有两种解决方案:
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类加密的数据。算法是完全不同的。