Maison  >  Article  >  développement back-end  >  Lorsque l'on compare les hachages de mots de passe avec password_hash() et password_verify(), quel mot de passe doit venir en premier ?

Lorsque l'on compare les hachages de mots de passe avec password_hash() et password_verify(), quel mot de passe doit venir en premier ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-21 07:05:30271parcourir

When Comparing Password Hashes with password_hash() and password_verify(), Which Password Should Come First?

PHP password_hash(), password_verify() [dupliquer]

Comprendre la comparaison des mots de passe

Lors de l'utilisation de la fonction password_hash() de PHP pour hacher les mots de passe pour le stockage dans une base de données, il est essentiel de comprendre comment le mot de passe haché est vérifié lors de la connexion à l'aide de password_verify().

Analyse du code

Dans votre code, la fonction password_hash() hache le mot de passe avant de le stocker dans la base de données. Cependant, dans le script de connexion, vous comparez directement le mot de passe non haché saisi par l'utilisateur avec le mot de passe haché stocké dans la base de données à l'aide de password_verify(). Cette comparaison échouera toujours.

Utilisation correcte

La bonne façon de vérifier un mot de passe à l'aide de password_verify() est de transmettre le mot de passe non haché saisi par l'utilisateur comme premier argument et le mot de passe haché mot de passe stocké dans la base de données comme deuxième argument. Cela permettra à password_verify() de comparer correctement les deux mots de passe.

Exemple

Voici une version modifiée de votre script de connexion avec la vérification du mot de passe corrigée :

<code class="php">if($_SERVER["REQUEST_METHOD"] == "POST"){
    $p_num = $_POST["username"];
    $pwd = $_POST["password"];

    $query = "SELECT * FROM `$user_table` WHERE `user_id` = '$p_num'";
    $result = mysqli_query($connect, $query);
    while($row = mysqli_fetch_assoc($result)){
        $user_id = $row['user_id'];
        $first_name = $row['first_name'];
        $last_name = $row['last_name'];
        $user_name = $first_name ." " .$last_name;
        $password = $row['password'];
        $image = $row['image'];
        $email = $row['email'];
        $program = $row['program'];
        $role = $row['role'];
        $status = $row['logged_in'];
        $registered = $row['registered'];

        // Verify the password using password_verify()
        if(($user_id == $p_num) && (password_verify($pwd, $password))){
            $_SESSION["id"] = $user_id;
            $_SESSION["user"] = $user_name;
            $_SESSION["program"] = $program;
            $_SESSION["pass"] = $password;
            $_SESSION["image"] = $image;
            $_SESSION["email"] = $email;
            $_SESSION["role"] = $role;
            $_SESSION["status"] = $status;
            $_SESSION["registered"] = $registered;
            $loggedin = "UPDATE `$user_table` SET `logged_in` = 1 WHERE `user_id` = '$user_id'";
        }
    var_dump($pwd);
    var_dump($password);
}
}</code>

Conclusion

En utilisant correctement password_verify(), vous pouvez valider avec précision les mots de passe des utilisateurs lors de la connexion, garantissant ainsi la sécurité et l'intégrité de votre système.

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