Hachage de mot de passe en PHP

Olorunfemi Akinlua 8 octobre 2023
  1. Hachage de mot de passe en PHP
  2. Utilisez password_hash() et password_verify() pour le hachage de mot de passe en PHP
Hachage de mot de passe en PHP

PHP est utilisé pour le développement côté serveur, et vous aurez besoin de mots de passe lors de la création des processus de connexion et d’enregistrement. Pour des raisons de sécurité et de confidentialité, nous devons hacher nos mots de passe afin que personne (y compris vous et votre administrateur de base de données) ne puisse connaître le mot de passe d’un utilisateur.

Cependant, lorsque nous hachons le mot de passe, nous devons le ressasser lorsque nous voulons connecter la personne. Cet article détaille ce qu’est le hachage du mot de passe et comment utiliser les fonctions intégrées de PHP, password_hash() et password_verify().

Hachage de mot de passe en PHP

Les données collectées auprès des utilisateurs sont stockées dans des bases de données, qui sont visibles par toute personne ayant accès à la base de données. Les noms d’utilisateur et les adresses sont souvent laissés tels quels ; ils ne sont pas aussi importants que la clé de vos comptes.

La chaîne de texte qui est le mot de passe de l’utilisateur est transmise par des algorithmes de hachage (bcrypt, md5, sha-1, sha-2) pour empêcher l’enregistrement des mots de passe tels quels et pour créer une représentation brouillée du texte. Cette représentation brouillée du mot de passe est stockée, et pendant les processus de connexion, la représentation brouillée est comparée.

La fonction intégrée password_hash() utilise l’algorithme bcrypt qui est ce que Auth0 recommande et utilise pour sa base de clients. De plus, la fonction password_verify() compare le texte du mot de passe au hachage et renvoie une valeur booléenne lorsque le mot de passe correspond à un hachage.

Utilisez password_hash() et password_verify() pour le hachage de mot de passe en PHP

Lorsqu’un utilisateur accède à votre site et crée un nouveau compte, vous, en tant que développeur PHP, vous assurez que votre application hache le mot de passe. Pour cela, nous appliquons la fonction password_hash().

<?php

$password = "24FE21121@1*?"; // password the user imputs.
echo password_hash($password, PASSWORD_DEFAULT); // outputs the hashed password

?>

La sortie de l’extrait de code est :

$2y$10$YRmyqWGiHbDSI31XbD2DuOzmTKSjYSSgR.2.3rYCmSSFS/xlAtb3.

L’extrait de code utilise l’algorithme de hachage par défaut, qui, selon la documentation PHP, utilise l’algorithme bcrypt. Si nous avons l’intention de changer l’algorithme de hachage, nous pouvons changer le deuxième argument de la fonction.

Il existe trois autres arguments possibles (algorithme de hachage) que nous pouvons utiliser. Le PASSWORD_BCRYPT, le PASSWORD_ARGON2I et le PASSWORD_ARGON2ID sont des arguments pris en charge.

Le PASSWORD_BCRYPT utilise l’algorithme CRYPT_BLOWFISH, le PASSWORD_ARGON2I utilise l’algorithme de hachage Argon2i et le PASSWORD_ARGON2ID utilise l’algorithme de hachage Argon2id. Pour mieux comprendre le fonctionnement de chaque algorithme, consultez la documentation de hachage de mot de passe PHP.

Essayons le paramètre PASSWORD_BCRYPT dans notre code.

<?php

$password = "24FE21121@1*?"; // password the user imputs.
echo password_hash($password, PASSWORD_DEFAULT); // outputs the hashed password

?>

La sortie de l’extrait de code est :

$2y$10$vNfovWay8hSq5ixa/lOPK.4YMVX1kgYCBPDEdvz3zM/EBUiBUukpO

Le PASSWORD_DEFAULT et le PASSWORD_BCRYPT utilisent tous deux l’identifiant $2y$ et produiront une chaîne de 60 caractères. Avec le processus ci-dessus, nous avons réussi à hacher le mot de passe de l’utilisateur.

Maintenant, si l’utilisateur veut se connecter à son compte, nous devons comparer le mot de passe qu’il a saisi au mot de passe haché. C’est là que password_verify() entre en jeu.

Nous pouvons comparer le mot de passe et le mot de passe haché stocké avec la fonction intégrée.

<?php

$password = "24FE21121@1*?";
$hashed_password ='$2y$10$YRmyqWGiHbDSI31XbD2DuOzmTKSjYSSgR.2.3rYCmSSFS/xlAtb3.';

print_r(password_verify($password, $hashed_password));

?>

La sortie de l’extrait de code est :

1

En PHP, 1 représente true et 0 représente “faux”.

Essayons la fonction password_verify() sur le mot de passe haché produit par le paramètre PASSWORD_BCRYPT.

<?php

$password = "24FE21121@1*?";
$hashed_password = '$2y$10$vNfovWay8hSq5ixa/lOPK.4YMVX1kgYCBPDEdvz3zM/EBUiBUukpO';

print_r(password_verify($password, $hashed_password));

?>

La sortie de l’extrait de code est :

1

La raison pour laquelle la fonction password_verify() peut fonctionner quel que soit le mot de passe haché que nous utilisons est que la fonction vérifie les correspondances de hachage données qui sont compatibles avec crypt(), qui est les deux. En outre, les fonctions renvoient l’algorithme, le coût et le sel dans le cadre du hachage renvoyé et sont à l’abri des attaques temporelles.

Pour améliorer votre résultat de hachage, spécifiez les options cost et salt dans la fonction password_hash(). Cependant, si vous ne comprenez pas comment l’utiliser, cela peut affecter considérablement votre sécurité.

Pour vérifier si la fonction password_verify() détectera un mot de passe erroné, plaçons un mot de passe incorrect (passez de 24FE21121@1*? à 24Fqqw1121@1*?).

<?php

$password = "24Fqqw1121@1*?";
$hashed_password = '$2y$10$vNfovWay8hSq5ixa/lOPK.4YMVX1kgYCBPDEdvz3zM/EBUiBUukpO';

if (password_verify($password, $hashed_password)) {
    echo "Password Matches!";
} else {
    echo "Wrong Password";
}

?>

La sortie de l’extrait de code est :

Wrong Password

Si nous l’utilisons dans le contexte d’un processus de connexion réel, le code pourrait ressembler à ceci :

<?php
$connect = mysqli_connect($localhost, $username, $password, $database);

if (isset($_POST['submit'])) {
    extract($_POST);

    // retrive stored hashed password
    $sqlQuery = mysqli_query($connect, "SELECT * FROM USERTABLE WHERE USER='$username'");
    $fetch = mysqli_fetch_array($sqlQuery);
    $currentPassword = $fetch['hashPassword'];

    if (password_verify($enteredPassword, $currentPassword)) {
        // password matches
        $_SESSION['id'] = $fetch['id'];
        header("location: home.php");
    } else {
        // password doesn't match
        $output = "Wrong Passworfd";
    }
}
Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn

Article connexe - PHP Password