Cet article présente principalement les problèmes liés au cryptage et au décryptage dans yii2. Il a une certaine valeur de référence. Maintenant, je le partage avec tout le monde. Les amis dans le besoin peuvent s'y référer
Avant-propos<.>
Yii fournit des fonctions d'assistance pratiques qui vous permettent de crypter et déchiffrer des données à l'aide d'une clé de sécurité. Les données sont transmises via une fonction de cryptage afin que seule une personne disposant de la clé de sécurité puisse les déchiffrer. Par exemple, nous devons stocker certaines informations dans notre base de données, mais nous devons nous assurer que seule une personne disposant d'une clé de sécurité peut les voir (même en cas de fuite de la base de données de l'application). Tout le monde sait que lorsque nous créons des programmes, le cryptage et le décryptage sont des sujets incontournables. Lorsque nous utilisons yii2 pour développer des applications, quelle prise en charge pratique du cryptage et du décryptage (sécurité) est intégrée ? Cet article vous le révélera.Environnement associé
L'emplacement du code source du composant de sécurité est le suivant
vendor/yiisoft/yii2/base/Security.phpLe composant Sécurité dispose d'un total de 15 méthodes publiques liées au cryptage et au déchiffrement (&encodage).
generateRandomString
public function generateRandomString($length = 32){...}
generatePasswordHash & validatePassword
// 使用generatePasswordHash为用户的密码加密,$hash存储到库中 $hash = Yii::$app->getSecurity()->generatePasswordHash($password); // 使用validatePassword对密码进行验证 if(Yii::$app->getSecurity()->validatePassword($password, $hash)){ // 密码正确 }else{ // 密码错误 }
generateRandomKey
encryptByPassword et decryptByPassword
$dat = Yii::$app->security->encryptByPassword("hello","3166886"); echo Yii::$app->security->encryptByPassword($dat,"3166886");// hello
Veuillez noter que est codé via ce qui précède Les données n'est pas ASCII et peut être passé sous un wrapper externe via base64_encode et base64_decode.
encryptByKey & decryptByKey
public function encryptByKey($data, $inputKey, $info = null){} public function decryptByKey($data, $inputKey, $info = null){}
hkdf
pbkdf2
hashData et validateData
$result = Yii::$app->security->hashData("hello",'123456',false); // ac28d602c767424d0c809edebf73828bed5ce99ce1556f4df8e223faeec60eddhello
你看到了在hello的前面多了一组字符,这组字符会随着原始数据的不同而变化。这样我们就对数据进行了特殊的防止篡改标记,接下来是validateData上场了。
注意:hashData的第三个参数代表生成的哈希值是否为原始二进制格式. 如果为false, 则会生成小写十六进制数字.
validateData 对已经加了数据前缀的数据进行检测,如下代码
$result = Yii::$app->security->validateData("ac28d602c767424d0c809edebf73828bed5ce99ce1556f4df8e223faeec60eddhello",'123456',false); // hello
如果返回了原始的字符串则表示验证通过,否则会返回假。
validateData 函数的第三个参数应该与使用 hashData() 生成数据时的值相同. 它指示数据中的散列值是否是二进制格式. 如果为false, 则表示散列值仅由小写十六进制数字组成. 将生成十六进制数字.
compareString
可防止时序攻击的字符串比较,用法非常简单。
Yii::$app->security->compareString("abc",'abc');
结果为真则相等,否则不相等。
那么什么是时序攻击那?我来举一个简单的例子。
if($code == Yii::$app->request->get('code')){ }
上面的比较逻辑,两个字符串是从第一位开始逐一进行比较的,发现不同就立即返回 false,那么通过计算返回的速度就知道了大概是哪一位开始不同的,这样就实现了电影中经常出现的按位破解密码的场景。
而使用 compareString 比较两个字符串,无论字符串是否相等,函数的时间消耗是恒定的,这样可以有效的防止时序攻击。
maskToken && unmaskToken
maskToken用于掩盖真实token且不可以压缩,同一个token最后生成了不同的随机令牌,在yii2的csrf功能上就使用了maskToken,原理并不复杂,我们看下源码。
public function maskToken($token){ $mask = $this->generateRandomKey(StringHelper::byteLength($token)); return StringHelper::base64UrlEncode($mask . ($mask ^ $token)); }
而unmaskToken目的也很明确,用于得到被maskToken掩盖的token。
接下来我们看一个例子代码
$token = Yii::$app->security->maskToken("123456"); echo Yii::$app->security->unmaskToken($token);// 结果为 123456
最后我们总结下
加密/解密: encryptByKey()、decryptByKey()、 encryptByPassword() 和 decryptByPassword();
使用标准算法的密钥推导: pbkdf2() 和 hkdf();
防止数据篡改: hashData() 和 validateData();
密码验证: generatePasswordHash() 和 validatePassword()
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!