L'un des moyens recommandés et les plus sûrs de vérifier que le mot de passe de l'utilisateur est correct dans PHP est d'utiliser la fonction Password_verify () . Cette fonction a été introduite dans PHP 5.5 et est conçue pour gérer les mots de passe cryptés par mot de passe_hash () . Password_verify () est plus sûr que les premières comparaisons en texte en clair ou l'utilisation de hachage MD5 / SHA1 car il prend en charge BCrypt et d'autres algorithmes de hachage plus puissants.
Un scénario typique où mot de passe_verify () consiste à comparer le mot de passe entré par l'utilisateur avec le hachage de mot de passe stocké dans la base de données lors de la connexion. Voici un exemple de base:
<code> <? php // Le mot de passe entré par l'utilisateur $ inputpassword = $ _post ['mot de passe']; // Mot de passe de hachage obtenu à partir de la base de données (par exemple, généré par Password_Hash () lors de l'enregistrement)
$ StoredHash = '2 $ 10 $ $ Nouis5Kj7NATUTFKBY1VEUEVS1ZRWGFZKTFZ7VF6HG8NQZ5U2YFHY';
if (password_verify ($ inputpassword, $ storedhash)) {
écho "Le mot de passe est correct, permettez la connexion";
} autre {
Echo "Erreur de mot de passe";
}
?>
</code>
Dans les applications pratiques, le hachage du mot de passe est généralement stocké dans une base de données. Pendant la vérification, vous devez lire le hachage correspondant de l'utilisateur à partir de la base de données, puis le comparer avec le mot de passe de l'utilisateur:
<code> <? Php // Supposons que le nom d'utilisateur et le mot de passe sont passés via Post $ username = $ _post ['username']; $ mot de passe = $ _post ['mot de passe']; // Connexion de la base de données (l'exemple utilise l'APD)
$ PDO = new PDO ('mysql: host = localhost; dbname = myApp', 'dbuser', 'dbpass');
// interroger le hachage du mot de passe utilisateur
$ stmt = $ PDO-> Préparer ("Sélectionnez Password_hash dans les utilisateurs où username =?");
$ stmt-> Execute ([$ username]);
$ hash = $ stmt-> fetchColumn ();
if ($ hash && password_verify ($ password, $ hash)) {
faire écho à "connecter avec succès";
} autre {
Echo "Erreur dans le nom d'utilisateur ou le mot de passe";
}
?>
</code>
Lorsque vous utilisez Password_verify () , si vous constatez que l'ancien algorithme de hachage n'est plus recommandé (par exemple, les paramètres expirent), vous pouvez mettre à niveau automatiquement le hachage de mot de passe avec Password_Needs_Hehash () :
<code> <? php $ options = ['Cost' => 12]; if (password_verify ($ mot de passe, $ hash)) {if (mot de passe_needs_rehash ($ hash, mot de passe_default, $ options)) {$ newhash = mot de passe_hash ($ mot de passe, mot de passe_default, $ options); // Mette à jour le hachage de l'utilisateur dans la base de données $ stmt = $ pDo-> Préparer ("Mettre à jour les utilisateurs set password_hash =? Where username =?"); $ stmt-> exécuter ([$ newhash, $ username]); } Echo "Connexion avec succès, le hash de mot de passe a été mis à jour"; } else {echo "Erreur de mot de passe"; }?> </code>Pour la maintenabilité du projet, il est recommandé d'encapsuler la logique de vérification du mot de passe dans une méthode ou une classe distincte pour gérer centralement les politiques de traitement des mots de passe. Par exemple:
<code> <? php class auth {public static function VerifyPassword ($ inputpassword, $ storedhash): bool {return password_verify ($ inputpassword, $ storedhash); }}?> </code>Méthode d'appel:
<code> <? php if (auth :: VerifyPassword ($ _ poster ['mot de passe'], $ storedhash)) {echo "vérification passée"; } else {echo "Vérification a échoué"; }?> </code>Ne faites pas le mot de passe entré manuellement par l'utilisateur, puis comparez-le avec la base de données. L'algorithme de valeur de sel et de hachage sera géré en interne par mot de passe_verify () .
Évitez d'utiliser de vieilles fonctions de hachage telles que md5 () ou sha1 () , qui ne sont plus sûres face aux méthodes d'attaque modernes.
La chaîne de hachage est irréversible et ne peut pas être utilisée pour restaurer le mot de passe d'origine.
Le hachage généré à l'aide de mot de passe_hash () est différent à chaque fois, mais il peut être vérifié par mot de passe_verify () .
L'utilisation de Password_verify () est l'un des liens clés de la mise en œuvre de l'authentification utilisateur sécurisée. Il utilise non seulement des algorithmes de hachage modernes, mais simplifie également la logique de vérification du développeur et facilite les mises à niveau de hachage de mot de passe. Dans les projets réels, il est recommandé de créer un système de vérification de mot de passe solide en combinaison avec les opérations de base de données, la logique d'encapsulation et le mécanisme de reconstruction automatique.
Pour plus de meilleures pratiques sur Password_verify () et le traitement du mot de passe, veuillez consulter la documentation officielle ou visiter https://gitbox.net/docs/php-password-security .