Dans PHP, Password_Hash () et Password_verify () sont des fonctions pour le cryptage et la vérification du mot de passe. Leur combinaison peut efficacement améliorer la sécurité du stockage du mot de passe et empêcher la fuite et la fissuration du mot de passe. Cependant, de nombreux développeurs ont encore des questions sur les algorithmes de chiffrement qu'ils utilisent et leurs relations. Cet article explorera leurs algorithmes de chiffrement et la relation entre eux.
La fonction Password_Hash () a été introduite dans PHP 5.5 et plus et est utilisée pour convertir le mot de passe en texte clair de l'utilisateur en un mot de passe crypté. Il utilise des algorithmes de hachage modernes (comme Bcrypt ) et est capable de générer automatiquement un "sel". Le sel est une donnée aléatoire supplémentaire qui est utilisée pour garantir que le même mot de passe en texte clair génère une valeur de hachage différente à chaque fois qu'elle est cryptée.
Par défaut, Password_Hash () utilise l'algorithme BCrypt , et la valeur de hachage qu'il génère contient le contenu du sel, donc aucun sel supplémentaire n'est requis lors du stockage de mots de passe. L'algorithme BCrypt lui-même est également adaptable, c'est-à-dire qu'il peut améliorer l'intensité informatique en augmentant le facteur de coût pour résister à la fissuration par force brute.
Exemple de code:
<span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">'my_secure_password'</span></span><span>;
</span><span><span class="hljs-variable">$hashedPassword</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, PASSWORD_BCRYPT);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$hashedPassword</span></span><span>;
</span></span>La fonction Password_verify () est utilisée pour vérifier que le mot de passe entré correspond à la valeur de hachage stockée. Sa fonction consiste à comparer le mot de passe en texte clair saisi par l'utilisateur avec le mot de passe crypté stocké dans la base de données lorsque l'utilisateur se connecte. Password_verify () extraire automatiquement le sel dans la valeur de hachage stockée, et utilise le même algorithme pour crypter le mot de passe entré par l'utilisateur, puis la comparer avec la valeur de hachage storée.
Il convient de noter que Password_verify () sera calculé sur la base de l'algorithme spécifié dans la valeur de hachage. Par conséquent, les développeurs n'ont pas besoin de passer manuellement l'algorithme de sel ou de chiffrement pour Mord_verify () , qui sélectionnera automatiquement la manière appropriée de vérifier en fonction de la valeur de hachage entrante.
Exemple de code:
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">password_verify</span></span><span>(</span><span><span class="hljs-variable">$userInputPassword</span></span><span>, </span><span><span class="hljs-variable">$storedHash</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">"Invalid password!"</span></span><span>;
}
</span></span>La relation étroite entre Password_Hash () et Password_verify () est qu'ils utilisent le même algorithme de cryptage pour le traitement et la vérification du mot de passe. Spécifiquement:
Encryption de mot de passe: Password_Hash () convertira le mot de passe en clair en valeur de hachage chiffrée en fonction de l'algorithme spécifié (par défaut, BCrypt ). La valeur de hachage contient du sel et d'autres paramètres de l'algorithme (comme les facteurs de travail).
Vérification du mot de passe: Password_verify () utilise le même algorithme (tel que BCrypt ) pour crypter le mot de passe entré par l'utilisateur en lisant les informations et le sel de l'algorithme dans la valeur de hachage, puis la compare à la valeur de hachage stockée.
Par conséquent, Password_verify () doit être vérifié en utilisant exactement le même algorithme et les paramètres que Password_Hash () . Si la valeur de hachage utilise BCrypt , Password_verify () utilisera également Bcrypt pour la vérification.
Bien que Password_Hash () soit par défaut Bcrypt , il prend également en charge d'autres algorithmes. Après PHP 7.2, Password_Hash () prend également en charge deux algorithmes plus puissants, Argon2i et Argon2id . Argon2 est un algorithme de hachage moderne qui offre une meilleure capacité à empêcher la fissuration de la puissance du GPU que Bcrypt .
Exemple de code à l'aide d'argon2i :
<span><span><span class="hljs-variable">$hashedPassword</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, PASSWORD_ARGON2I);
</span></span>Si le mot de passe est chiffré à l'aide de l'algorithme Argon2 , Password_verify () identifiera et utilisera automatiquement l'algorithme correspondant pour la vérification.
Password_Hash () et Password_verify () sont deux fonctions très importantes en PHP pour le cryptage et la vérification de mot de passe. Leurs algorithmes de chiffrement sont étroitement liés, Password_Hash () est utilisé pour crypter et générer des valeurs de hachage, tandis que Password_verify () est utilisé pour vérifier l'exactitude du mot de passe en fonction des valeurs de hachage. Les deux sont généralement utilisés ensemble pour assurer la sécurité du stockage de mot de passe. Bien que l'algorithme BCRYPT soit utilisé par défaut, PHP prend également en charge des algorithmes plus forts tels que Argon2 , qui peuvent être sélectionnés en cas de besoin.
En comprenant la relation algorithme de chiffrement utilisée par Password_Hash () et Password_verify () , les développeurs peuvent mieux concevoir des mécanismes de stockage et de vérification de mot de passe sécurisés pour améliorer la sécurité des applications.