Leçon 10 / 15

Hacher et vérifier le mot de passe

20 min PHP 8 — structurer une application (PDO, POO, sessions) Gratuit

Objectif : Enregistrer un mot de passe sous forme de hachage et vérifier une tentative de connexion.

Un mot de passe ne doit pas être enregistré tel quel : si la base ou un fichier de configuration est exposé, sa valeur en clair devient immédiatement utilisable. Dans cette leçon, vous allez créer le service qui transforme un mot de passe en hachage et vérifie une tentative de connexion sans jamais comparer deux chaînes en clair.

Le service prépare une opération nécessaire au carnet privé, mais il ne démarre pas de session et ne décide pas si une page est accessible. La gestion de l’état authentifié viendra dans la leçon consacrée aux sessions.

Pourquoi un hachage plutôt qu’un mot de passe ?

Un hachage est une représentation calculée à partir du mot de passe. Avec les fonctions adaptées, vous pouvez vérifier une valeur saisie à partir du hachage enregistré, sans avoir besoin de retrouver le mot de passe d’origine. C’est différent d’un chiffrement réversible : l’application n’a pas vocation à déchiffrer le mot de passe.

En PHP, `password_hash()` calcule le hachage et `password_verify()` vérifie une tentative. Utilisez `PASSWORD_DEFAULT` pour laisser PHP choisir l’algorithme recommandé par défaut. Ne construisez pas vous-même un hachage avec une fonction générale comme `md5()` ou `sha1()` : ces fonctions ne sont pas prévues pour le stockage sécurisé de mots de passe.

Créer le service d’authentification

Le fichier contractuel `src/Service/Authentification.php` porte ces deux opérations. Le constructeur reçoit le hachage attendu ; la création du hachage est une méthode statique, car elle ne dépend d’aucune tentative de connexion. La méthode `verifier()` utilise le hachage reçu par l’objet et renvoie un booléen.

PHP
<?php

declare(strict_types=1);

namespace Carnet\Service;

final class Authentification
{
    public function __construct(
        private readonly string $hachageAttendu
    ) {
    }

    public static function hacher(string $motDePasse): string
    {
        return password_hash($motDePasse, PASSWORD_DEFAULT);
    }

    public function verifier(string $motDePasseSaisi): bool
    {
        return password_verify($motDePasseSaisi, $this->hachageAttendu);
    }
}

La propriété `hachageAttendu` est privée et en lecture seule après la construction de l’objet. Elle contient le hachage configuré, jamais le mot de passe lui-même. Le service ne fait ni lecture de formulaire ni affichage : il reçoit une valeur et renvoie un résultat, ce qui le rend utilisable depuis le traitement de connexion qui sera assemblé plus tard.

Produire puis vérifier un hachage

Pour initialiser le carnet, calculez une fois le hachage du mot de passe choisi, puis conservez le résultat à la place du mot de passe en clair, par exemple dans une variable d’environnement réservée à la configuration. Vous pouvez obtenir ce résultat depuis un environnement PHP en appelant `Authentification::hacher($motDePasse)`. Ne recopiez pas le mot de passe dans le code source et ne le transmettez pas dans une commande conservée dans l’historique du terminal.

Au moment d’une tentative, le traitement lira le hachage de configuration et le passera au constructeur, puis transmettra la valeur reçue du formulaire à `verifier()`. Le résultat vaut `true` si la tentative correspond au hachage et `false` dans le cas contraire. Le traitement décidera quoi faire de ce résultat ; ici, vous ne créez pas encore de session ni de redirection.

Le hachage généré est une chaîne que vous devez conserver intégralement, sans la tronquer. La longueur peut varier selon l’algorithme utilisé par PHP ; prévoyez donc un stockage capable de recevoir la chaîne complète si vous la placez en base. Dans le carnet fil rouge, le service reçoit ce hachage depuis la configuration, tandis que les contacts restent gérés par `ContactDepot` et PDO.

À retenir

  • Utilisez `password_hash($motDePasse, PASSWORD_DEFAULT)` pour produire un hachage adapté au stockage.
  • Conservez le hachage complet, jamais le mot de passe en clair.
  • Utilisez `password_verify($motDePasseSaisi, $hachageAttendu)` pour vérifier une tentative.
  • Le service renvoie un booléen et ne gère ni session, ni affichage, ni redirection.

Dans la prochaine leçon, vous utiliserez le résultat de cette vérification pour gérer une session et protéger l’accès aux pages du carnet.

Envie d'aller plus loin ?

Les cours Enovatic sont gratuits et le resteront. Si vous cherchez un accompagnement encadré, nos formations professionnelles sont animées par les mêmes formateurs.