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.