Pourquoi les hachages de mots de passe cèdent
Tu le lis régulièrement : « base de données du site X volée, des millions de mots de passe divulgués ». Mais un bon site ne garde pas ton mot de passe — seulement son hash. Et à partir d'un hash, tu ne peux pas recalculer le mot de passe, tu le sais depuis le chapitre précédent. Alors… y a-t-il un problème ? Oui. Et dans ce chapitre, c'est toi qui joues le hacker pour voir pourquoi.
Les mots dont tu as besoin
- Base de données
- La grande table dans laquelle un site web garde tous ses utilisateurs : nom, adresse e-mail, et (si tout va bien) le hash du mot de passe.
- Table de correspondance (ou « table arc-en-ciel »)
- Une liste que quelqu'un a préparée à l'avance : à gauche des milliards de mots de passe courants, à droite leur hash. Qui tombe sur un hash le cherche à droite et lit le mot de passe à gauche. Pas de calcul, juste une recherche.
- Salt (sel)
- Littéralement « sel » : un petit bout de texte aléatoire que le site colle à ton mot de passe avant de le hasher. Différent pour chaque utilisateur. Ce n'est pas secret — il est simplement à côté du hash — mais ça rend toute table de correspondance inutile.
- PBKDF2
- Une fonction de hachage volontairement lente : elle répète le calcul des centaines de milliers de fois. Pour toi, une demi-seconde à la connexion. Pour un hacker qui veut essayer des milliards de mots de passe, un mur.
Comment un hash « incassable » se fait quand même casser
Le hacker ne calcule pas à l'envers. Il calcule en avant. Il
prend une liste du milliard de mots de passe les plus utilisés —
123456, azerty, bienvenue, les noms
de tous les clubs de foot — et calcule le hash de chacun. Ça prend du
temps, mais il ne doit le faire qu'une seule fois. Ensuite, il compare les
hashs volés à sa liste. Chaque hash qui correspond est un mot de passe
cassé. Pas de maths, juste de la patience et un gros disque dur.
Joue le hacker
Tout se passe dans ton navigateur. Rien n'est envoyé au serveur. Ne tape quand même jamais ici un mot de passe que tu utilises vraiment — c'est une bonne habitude.
- Clique sur Hasher et chercher. La démo hashe ton mot de passe et cherche le hash dans un petit tableau de quelques douzaines de mots de passe courants. Trouvé ? Alors tu es « cassé ».
- Essaie
azerty,football,docteur. Essaie ensuite quelque chose que tu inventes toi-même. - Clique sur Même mot de passe, avec salt. Même mot de passe, hashé deux fois — et pourtant deux hashs complètement différents. Cherche-les : rien.
- Clique sur Avec PBKDF2 (lent) et regarde le temps. Calcule ce que ça signifie pour quelqu'un qui doit essayer dix millions de fois.
Le salt : à chacun son propre problème
Un hash est simplement une fonction, et tu peux l'écrire comme n'importe quelle autre. Appelle ton mot de passe x et le hash y :
y = SHA256(x)
C'est là que se cache le problème. Le même x donne toujours le même
y — c'est la première règle du chapitre 2. Tous ceux qui, dans le
monde entier, choisissent bienvenue se retrouvent donc dans la
base de données avec exactement les mêmes 64 caractères :
| Utilisateur | Mot de passe | Hash dans la base de données |
|---|---|---|
| Sam | bienvenue | 403bb5c89a7e… |
| Noor | bienvenue | 403bb5c89a7e… |
| Jules | bienvenue | 403bb5c89a7e… |
Trois fois la même ligne. Le hacker cherche 403bb5c89a7e… une
seule fois dans sa table et les a tous les trois d'un coup. Avec dix millions
de comptes, ça marche exactement aussi bien.
Ce que le salt y change
Le salt résout ça en collant une seule chose devant le mot de passe :
y = SHA256(salt + x)
Exactement comme tu l'écrirais toi-même. Attention au + : ici il
ne veut pas dire additionner, mais mettre bout à bout. Le
salt et le mot de passe deviennent un seul long texte, et c'est ça
que porte le hash. Un salt a3f9c2e1… avec le mot de passe
bienvenue hashe donc le texte
a3f9c2e1…bienvenue.
Et voici le point : chaque utilisateur reçoit un salt différent, que le site tire au hasard au moment où tu t'inscris. Même tableau, même mot de passe :
| Utilisateur | Salt | Ce qui est hashé | Hash dans la base de données |
|---|---|---|---|
| Sam | a3f9c2e1… | a3f9c2e1…bienvenue | 367f25620689… |
| Noor | 7c21e04a… | 7c21e04a…bienvenue | a923b7d5e604… |
| Jules | f40d8b37… | f40d8b37…bienvenue | 91bd4e3d8975… |
Trois fois le même mot de passe, trois hashs qui n'ont rien à voir entre eux. C'est l'effet d'avalanche du chapitre 2 : l'entrée diffère, donc la sortie diffère complètement. Dans la base de données, on ne peut plus voir qui a le même mot de passe.
Mais le salt est juste à côté
Regarde encore ce tableau. Le salt est dans sa propre colonne, lisible, dans la même base de données qui a été volée. Le hacker l'a donc aussi. Et ça marche quand même — c'est ça qui est malin.
Sa table précalculée contient les hashs de SHA256(x). Ce dont il a
besoin, ce sont les hashs de SHA256(a3f9c2e1… + x).
Ce sont des nombres complètement différents. Sa table est d'un coup sans
valeur : il doit tout recalculer — un milliard de mots de passe × un hash —
et il n'a alors que Sam. Pour Noor il repart de zéro, car son salt est
différent. Et pour Jules encore une fois.
Voilà ce que fait le salt. Ça ne rend ton mot de passe pas plus solide d'un poil. Ça transforme une grande tâche — casser dix millions de comptes — en dix millions de tâches séparées. Clique dans la démo ci-dessus sur Même mot de passe, avec salt et tu le vois arriver deux fois avec de vrais nombres.
La lenteur : la seule arme qui compte vraiment
SHA-256 est ultra-rapide — une bonne carte graphique calcule des milliards de hashs par seconde. C'est pratique pour les fichiers et catastrophique pour les mots de passe. C'est pourquoi les bons sites utilisent une fonction volontairement lente. Clique sur PBKDF2 dans la démo et observe le temps. Quelques centaines de millisecondes, tu les sens à peine en te connectant. Mais pour le hacker, chaque tentative est multipliée par ce nombre — et il en a des milliards.
Ce que ça signifie pour toi
- La longueur bat l'originalité.
velo-bleu-il-pleut-mardiest bien plus fort queP@ss1!, car il ne figure dans aucune liste. - Jamais le même mot de passe sur deux sites. Si le site le plus faible fuit, les hackers essaient aussitôt ce mot de passe sur ton e-mail et tes jeux.
- Un gestionnaire de mots de passe le retient pour toi. Chaque mot de passe peut alors comporter trente caractères aléatoires — toi, tu n'as besoin d'en connaître qu'un seul.
Pour quand tu construiras toi-même un site plus tard :
n'écris jamais ça toi-même. Chaque langage de programmation a une
fonction intégrée qui gère bien le salt et la lenteur (en PHP, elle
s'appelle password_hash()). Bricoler soi-même un hash et un
salt est l'erreur classique du débutant — et la cause de la moitié des
fuites dans l'actualité.
Voici les maths : à quel point « grand » est grand ?
Un mot de passe de 8 lettres minuscules a 268 ≈ 200 milliards de possibilités. Ça semble beaucoup — une carte graphique en vient à bout en une minute. Quatre mots aléatoires tirés d'un dictionnaire de 5000 mots : 50004 = 625 billions, et ça, c'est encore sans majuscules ni chiffres. C'est la différence entre élever à la puissance avec une grande base et un grand exposant. Qui a le sens des grands nombres conçoit de meilleurs cadenas que qui ne l'a pas.