La fonction de crypte dans PHP est utilisée pour crypter les chaînes. Il génère des résultats de chiffrement basés sur différents algorithmes de chiffrement (tels que DES, Blowfish, MD5, etc.). La fonction Crypt est souvent utilisée pour traiter les données de mot de passe, car elle peut améliorer la sécurité du chiffrement du mot de passe avec une valeur de sel, empêchant ainsi certaines méthodes d'attaque courantes telles que les attaques de table arc-en-ciel.
<span><span><span class="hljs-title function_ invoke__">crypt</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$str</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$salt</span></span><span>): </span><span><span class="hljs-keyword">string</span></span><span>
</span></span>
$ str est la chaîne en texte clair que vous souhaitez crypter (comme le mot de passe entré par l'utilisateur).
$ Salt est une chaîne aléatoire utilisée pour augmenter la sécurité des mots de passe. Différents algorithmes de chiffrement nécessitent différents formats de sel.
La valeur de retour est une chaîne cryptée.
Tout d'abord, examinons un exemple simple pour montrer comment crypter le mot de passe entré par l'utilisateur à l'aide de la fonction crypte :
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Mot de passe entré par l'utilisateur</span></span><span>
</span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">"userpassword"</span></span><span>;
</span><span><span class="hljs-comment">// utiliser DES Algorithme de chiffrement,et spécifiez la valeur de sel</span></span><span>
</span><span><span class="hljs-variable">$salt</span></span><span> = </span><span><span class="hljs-string">"<span class="hljs-subst">$1</span></span></span><span>$".</span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-title function_ invoke__">md5</span></span><span>(</span><span><span class="hljs-title function_ invoke__">mt_rand</span></span><span>()), </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">8</span></span><span>); </span><span><span class="hljs-comment">// utiliser MD5 Générer des valeurs de sel aléatoires</span></span><span>
</span><span><span class="hljs-variable">$encrypted_password</span></span><span> = </span><span><span class="hljs-title function_ invoke__">crypt</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$salt</span></span><span>);
</span><span><span class="hljs-comment">// Résultats de chiffrement de sortie</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Encrypted Password: "</span></span><span> . </span><span><span class="hljs-variable">$encrypted_password</span></span><span>;
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
Dans cet exemple, nous utilisons 1 $ pour représenter l'algorithme de cryptage MD5 (c'est le format standard pour la crypte ). La complexité du chiffrement est ajoutée en ajoutant la valeur de sel au mot de passe.
La valeur du sel est une partie très importante du processus de chiffrement. Il peut effectivement empêcher le même mot de passe de générer deux fois le même résultat de chiffrement. En utilisant des valeurs de sel différentes à chaque fois, même si les mots de passe de deux utilisateurs sont les mêmes, leurs résultats de cryptage seront différents, augmentant considérablement la difficulté de casser les mots de passe.
Dans les fonctions de la crypte , la valeur de sel doit être soigneusement conçue pour s'assurer qu'elle a suffisamment de hasard. La valeur de sel ne doit pas être trop simple, comme l'utilisation d'un nom d'utilisateur ou d'une chaîne fixe comme valeur de sel.
La fonction PHP Crypt prend en charge une variété d'algorithmes de chiffrement, les algorithmes communs incluent:
DES ( 1 $ Signifie le cryptage MD5)
Blowfish ( 2A $ signifie cryptage Blowfish)
SHA-256 ( 5 $ Signifie le cryptage SHA-256)
SHA-512 ( 6 $ Signifie le cryptage SHA-512)
Parmi eux, SHA-256 et SHA-512 fournissent une force de chiffrement élevée, ce qui convient au chiffrement à haute résistance des mots de passe. Pour garantir la sécurité du chiffrement, il est recommandé de choisir l'un de ces deux algorithmes autant que possible.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">"userpassword"</span></span><span>;
</span><span><span class="hljs-variable">$salt</span></span><span> = </span><span><span class="hljs-string">"<span class="hljs-subst">$2y</span></span></span><span><span class="hljs-subst">$10</span></span><span>$".</span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-title function_ invoke__">md5</span></span><span>(</span><span><span class="hljs-title function_ invoke__">mt_rand</span></span><span>()), </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">22</span></span><span>); </span><span><span class="hljs-comment">// générer Blowfish Valeur de sel</span></span><span>
</span><span><span class="hljs-variable">$encrypted_password</span></span><span> = </span><span><span class="hljs-title function_ invoke__">crypt</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$salt</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Encrypted Password (Blowfish): "</span></span><span> . </span><span><span class="hljs-variable">$encrypted_password</span></span><span>;
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
Après avoir chiffré le mot de passe, comment vérifier le mot de passe lorsque l'utilisateur se connecte? Vous pouvez stocker le mot de passe crypté dans la base de données, et lorsque l'utilisateur se connecte, crypter le mot de passe entré par l'utilisateur via la fonction Crypt pour vérifier si les résultats de cryptage correspondent.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Supposons que le mot de passe crypté obtenu à partir de la base de données</span></span><span>
</span><span><span class="hljs-variable">$stored_encrypted_password</span></span><span> = </span><span><span class="hljs-string">"<span class="hljs-subst">$2y</span></span></span><span><span class="hljs-subst">$10</span></span><span><span class="hljs-subst">$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</span></span><span>"; </span><span><span class="hljs-comment">// Mot de passe de cryptage pré-économisé</span></span><span>
</span><span><span class="hljs-comment">// Le mot de passe en texte brut saisi par l'utilisateur</span></span><span>
</span><span><span class="hljs-variable">$user_input_password</span></span><span> = </span><span><span class="hljs-string">"userpassword"</span></span><span>;
</span><span><span class="hljs-comment">// utiliser相同的Valeur de sel对Mot de passe entré par l'utilisateur进行加密</span></span><span>
</span><span><span class="hljs-variable">$encrypted_input_password</span></span><span> = </span><span><span class="hljs-title function_ invoke__">crypt</span></span><span>(</span><span><span class="hljs-variable">$user_input_password</span></span><span>, </span><span><span class="hljs-variable">$stored_encrypted_password</span></span><span>);
</span><span><span class="hljs-comment">// Comparez si le mot de passe crypté correspond</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$encrypted_input_password</span></span><span> === </span><span><span class="hljs-variable">$stored_encrypted_password</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Password is correct!"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Password is incorrect!"</span></span><span>;
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
Afin d'assurer la sécurité du processus de chiffrement, en plus de l'utilisation rationnelle des fonctions de crypte , les meilleures pratiques suivantes doivent être suivies:
Utilisez une forte valeur de sel : la valeur de sel doit être suffisamment aléatoire et suffisamment longue (par exemple, 22 bits). Évitez d'utiliser des chaînes simples telles que le nom d'utilisateur ou l'adresse e-mail.
Utilisez des algorithmes de chiffrement appropriés : les algorithmes de chiffrement modernes tels que SHA-256 ou SHA-512 sont recommandés. Évitez le cryptage DES faible.
Évitez de réutiliser les valeurs de sel : chaque mot de passe doit utiliser une valeur de sel unique, ce qui peut éviter les attaques de table arc-en-ciel.
Stockez le mot de passe chiffré : ne stockez pas de mots de passe en texte brut dans la base de données. Le mot de passe crypté doit être enregistré et le mot de passe entré doit être comparé à la même valeur de sel cryptée lors de la vérification.
Mise à jour régulière des méthodes de chiffrement : à mesure que la puissance de calcul augmente, certains algorithmes de chiffrement peuvent devenir vulnérables, de sorte que la méthode de cryptage doit être évaluée et mise à jour régulièrement.