Tutoriels gratuits et ouverts à toutes et à tous · mis à jour régulièrementÀ propos

Série « Animations » · partie 8 / 8

Le hachage des mots de passe : empreinte, sel et bcrypt

Pourquoi on ne stocke jamais un mot de passe, comment une empreinte permet de le vérifier, et à quoi servent le sel et la lenteur de bcrypt. Les empreintes affichées ont été réellement calculées.

Développement✎ B. Jousseaume📅 21 octobre 2026⏱ 1 min 30📶 Intermédiaire
0:00 / 0:00
Appuyez sur « Lire » pour lancer l’animation. Les sous-titres s’affichent ici.

    Questions pour vérifier la compréhension

    Quelle différence entre chiffrer et hacher un mot de passe ?

    Le chiffrement est réversible avec la clé ; le hachage est à sens unique. Pour un mot de passe, on hache.

    Comment l’application vérifie-t-elle un mot de passe qu’elle ne connaît pas ?

    Elle recalcule l’empreinte de la saisie et la compare à l’empreinte stockée.

    À quoi sert le sel ?

    À rendre chaque empreinte unique : deux utilisateurs ayant le même mot de passe n’ont pas la même empreinte, et les tables précalculées deviennent inutiles.

    Pourquoi préférer bcrypt à SHA-256 pour les mots de passe ?

    SHA-256 est très rapide, ce qui facilite les essais en masse. bcrypt est volontairement lent et intègre un sel.

    Que contient la chaîne renvoyée par password_hash() ?

    L’identifiant de l’algorithme ($2y$), le coût (12), le sel (22 caractères) et l’empreinte (31 caractères).

    Transcription de l’animation

    1. Le problème

    Une application doit vérifier les mots de passe de ses utilisateurs. Première idée : les ranger tels quels dans la base. Mauvaise idée : si la base fuit (sauvegarde égarée, faille, accès interne), tous les mots de passe sont lisibles, et souvent réutilisés ailleurs.

    2. Le hachage

    La solution : ne stocker qu’une empreinte, calculée par une fonction de hachage. Ici, SHA-256 produit toujours 64 caractères hexadécimaux. La même entrée donne toujours la même empreinte. Une seule lettre change, et l’empreinte n’a plus rien à voir. Surtout, le calcul est à sens unique : à partir de l’empreinte, on ne peut pas retrouver le mot de passe.

    3. Vérifier sans connaître

    À l’inscription, l’application calcule l’empreinte du mot de passe et ne stocke que celle-ci. À la connexion, elle calcule l’empreinte de ce qui vient d’être saisi… …et la compare à celle de la base. Si elles sont égales, le mot de passe est le bon. Le serveur n’a jamais eu besoin de le conserver.

    4. Le sel

    Un problème demeure : alice et chloe ont choisi le même mot de passe, donc leurs empreintes sont identiques. La base le révèle à qui la lit. Et une empreinte connue peut se retrouver dans des tables précalculées : le hachage seul ne suffit pas. La parade : un sel, une valeur aléatoire différente pour chaque utilisateur, mêlée au mot de passe avant le hachage. Même mot de passe, sels différents : empreintes différentes. Avec bcrypt, le sel est rangé dans la chaîne stockée elle-même.

    5. Lent, volontairement

    Dernier ingrédient : la lenteur. Les fonctions comme MD5 ou SHA-256 sont conçues pour être très rapides, ce qui facilite les essais en masse. bcrypt et Argon2 sont lents à dessein, selon un facteur de coût réglable : environ un quart de seconde par calcul avec bcrypt au coût 12, selon la machine. Pour l’utilisateur, c’est imperceptible : un seul calcul à la connexion. Pour qui voudrait tester des millions de mots de passe, chaque essai devient coûteux.

    6. En PHP

    En PHP, deux fonctions suffisent. password_hash() choisit un algorithme lent (bcrypt par défaut), génère le sel et calcule l’empreinte. La chaîne obtenue contient tout ce qu’il faut pour vérifier : l’algorithme, le coût, le sel et l’empreinte. password_verify() relit ces informations, refait le calcul sur la saisie et compare. On ne compare jamais les chaînes soi-même.

    7. Vigilance sécurité

    Vigilance : un mot de passe ne doit jamais pouvoir être relu, même par l’administrateur de l’application. On ne stocke jamais un mot de passe en clair, ni chiffré : chiffrer est réversible, hacher ne l’est pas. MD5 et SHA-1 sont à bannir pour les mots de passe. On augmente le coût avec le temps, et password_needs_rehash() aide à mettre à jour les anciennes empreintes. Côté connexion, on limite le nombre d’essais et on propose une double authentification. Et côté utilisateur : un mot de passe différent par site, gardé dans un gestionnaire de mots de passe.

    8. À retenir

    En résumé : on hache, on sale, on ralentit. En PHP, password_hash() et password_verify() font tout cela pour vous. Un mot de passe bien stocké reste protégé, même si la base de données venait à fuir.

    © 2026 Bruno Jousseaume. Ce cours est publié sous licence CC BY-NC-SA 4.0 : vous pouvez le partager et l’adapter en citant l’auteur et un lien vers cette page, sans usage commercial, et en partageant vos adaptations sous la même licence.

    Pour aller plus loin

    Python niveau 1 — Premiers pas

    Afficher, calculer, mémoriser dans des variables et dialoguer avec l’utilisateur : niveau 1 du parcours Python, avec exercices corrigés et QCM.

    Débutant⏱ 4 à 5 h · 17 octobre 2026