Maison  >  Article  >  développement back-end  >  Concernant les problèmes de chiffrement et de déchiffrement dans yii2

Concernant les problèmes de chiffrement et de déchiffrement dans yii2

不言
不言original
2018-06-12 16:51:132265parcourir

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é

  • Système d'exploitation et IDE macOS 10.13.1 & PhpStorm2018.1.2

  • Version du logiciel PHP7.1.8 Yii2.0.14

Dans yii2, la bibliothèque qui gère le chiffrement et le déchiffrement s'appelle Security, qui existe en tant que composant yii2, vous pouvez donc l'obtenir et l'utiliser via Yii::$app->security.

L'emplacement du code source du composant de sécurité est le suivant

vendor/yiisoft/yii2/base/Security.php


Le composant Sécurité dispose d'un total de 15 méthodes publiques liées au cryptage et au déchiffrement (&encodage).

  • encryptByPassword

  • encryptByKey

  • decryptByPassword

  • decryptByKey

  • hkdf

  • pbkdf2

  • hashData

  • validateData

  • generateRandomKey

  • generateRandomString

  • generatePasswordHash

  • validatePassword

  • compareString

  • maskToken

  • unmaskToken

Je pense qu'il y en a que vous n'avez jamais vu auparavant. Cela n'a pas d'importance. Apprenons-les un par un.

generateRandomString

La raison pour laquelle je parle d'abord de generateRandomString est parce que c'est le plus couramment utilisé, du moins pour moi.

public function generateRandomString($length = 32){...}

Générer une chaîne aléatoire. Le paramètre $length représente la longueur de la chaîne, et la valeur par défaut est de 32 bits. Il convient d'expliquer que la plage de valeurs de cette chaîne est [A-Za-z0-9_-].

generatePasswordHash & validatePassword

generatePasswordHash & validatePassword sont souvent utilisés pour crypter les mots de passe des utilisateurs et vérifier si le mot de passe est correct, depuis MD5 Après une collision, lorsque nous utilisons yii2 pour développer des applications, la fonction generatePasswordHash devient le premier choix pour crypter les mots de passe et appelle la fonction crypt.

L'utilisation générale est la suivante

// 使用generatePasswordHash为用户的密码加密,$hash存储到库中
$hash = Yii::$app->getSecurity()->generatePasswordHash($password);

// 使用validatePassword对密码进行验证
if(Yii::$app->getSecurity()->validatePassword($password, $hash)){
 // 密码正确
}else{
 // 密码错误
}

generateRandomKey

Semblable à generateRandomString, il génère une chaîne aléatoire. Le paramètre est la longueur, qui est par défaut de 32 bits. La différence est que generateRandomKey ne génère pas d'ASCII.

Pour parler simplement, generateRandomString est approximativement égal à base64_encode(generateRandomKey).

encryptByPassword et decryptByPassword

Les fonctions d'encodage et de décodage utilisent une clé secrète pour encoder les données, puis utilisent cette clé secrète pour encoder les données. Décoder les données codées.

Exemple

$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

est également un ensemble de fonctions d'encodage et de décodage, ce qui est plus rapide que la transmission d'un mot de passe. La fonction est déclarée comme

public function encryptByKey($data, $inputKey, $info = null){}

public function decryptByKey($data, $inputKey, $info = null){}

encryptByKey & decryptByKey. Par exemple, nous pouvons transmettre l'ID du membre, etc., donc. que ces informations seront combinées avec $inputKey. Ensemble, ils servent de clés pour le cryptage et le déchiffrement.

hkdf

Dérivez une clé à partir de la clé d'entrée donnée en utilisant l'algorithme HKDF standard. En PHP7+, la méthode hash_hkdf est utilisée, et en PHP7 et versions antérieures, la méthode hash_hmac est utilisée.

pbkdf2

Dérivez une clé à partir du mot de passe donné en utilisant l'algorithme standard PBKDF2. Cette méthode peut être utilisée pour le cryptage des mots de passe, mais yii2 propose une meilleure solution de cryptage des mots de passe, generatePasswordHash.

hashData et validateData

Parfois, afin d'éviter que le contenu ne soit falsifié, nous devons marquer les données, hashData et validateData C'est la combinaison qui accomplit cette tâche.

hashData est utilisé pour ajouter un préfixe de données aux données d'origine, comme le code suivant

$result = Yii::$app->security->hashData("hello",&#39;123456&#39;,false);
// ac28d602c767424d0c809edebf73828bed5ce99ce1556f4df8e223faeec60eddhello

你看到了在hello的前面多了一组字符,这组字符会随着原始数据的不同而变化。这样我们就对数据进行了特殊的防止篡改标记,接下来是validateData上场了。

注意:hashData的第三个参数代表生成的哈希值是否为原始二进制格式. 如果为false, 则会生成小写十六进制数字.

validateData 对已经加了数据前缀的数据进行检测,如下代码

$result = Yii::$app->security->validateData("ac28d602c767424d0c809edebf73828bed5ce99ce1556f4df8e223faeec60eddhello",&#39;123456&#39;,false);
// hello

如果返回了原始的字符串则表示验证通过,否则会返回假。

validateData 函数的第三个参数应该与使用  hashData() 生成数据时的值相同. 它指示数据中的散列值是否是二进制格式. 如果为false, 则表示散列值仅由小写十六进制数字组成. 将生成十六进制数字.

compareString

可防止时序攻击的字符串比较,用法非常简单。

Yii::$app->security->compareString("abc",&#39;abc&#39;);

结果为真则相等,否则不相等。

那么什么是时序攻击那?我来举一个简单的例子。

if($code == Yii::$app->request->get(&#39;code&#39;)){
 
}

上面的比较逻辑,两个字符串是从第一位开始逐一进行比较的,发现不同就立即返回 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn