Mots de passe : hacher, jamais stocker
bcrypt, sel unique, vérification sans lecture.
Objectifs
À la fin de cette leçon, vous saurez :
- expliquer pourquoi un mot de passe ne se stocke jamais en clair ni chiffré ;
- utiliser sel et algorithme lent (bcrypt) ;
- vérifier une connexion sans connaître le mot de passe.
🔗 Pour vous rafraîchir la mémoire : modules : import/export · encodage, hachage, chiffrement
Les trois mauvaises idées et la bonne
1. Stocker en clair → toute fuite = tous les comptes compromis
2. Stocker chiffré → la clé finira par fuiter aussi
3. Hacher SHA-256 simple → dictionnaires et rainbow tables cassent tout
4. ✅ bcrypt/argon2 + sel unique
Le hash du chapitre 12 est trop rapide : un GPU teste des milliards de combinaisons à la seconde. Les algorithmes de hachage de mots de passe sont volontairement lents (facteur de coût) : 100 ms par tentative, invisible pour l'utilisateur, rédhibitoire pour l'attaquant.
Sel : une même phrase, des empreintes différentes
import bcrypt from "bcrypt";
// À l'inscription :
const hash = await bcrypt.hash("motDePasse123", 10); // 10 = facteur de coût
// $2b$10$Kix8... ← le sel est INCLUS dans la chaîne stockée
Chaque inscription génère un sel aléatoire intégré au résultat : deux utilisateurs au mot de passe identique ont des empreintes différentes — les tables précalculées deviennent inutiles.
Vérifier sans connaître
// À la connexion :
const ok = await bcrypt.compare("essaiUtilisateur", hashStocke);
if (!ok) throw new UnauthorizedException();
compare extrait le sel, recalcule lentement, compare. La base ne contient jamais le secret ; même l'administrateur ne peut pas lire les mots de passe. Schéma complet :
inscription : mot de passe ──bcrypt(sel)──→ hash stocké
connexion : essai ──bcrypt(sel du hash)──→ égal ? → session ouverte
Ce que Devmind n'a PAS besoin de faire
Devmind utilise Google comme fournisseur d'identité : aucun mot de passe ne transite jamais. Mais vous savez désormais évaluer tout système d'inscription classique — et comprendre pourquoi « mot de passe oublié » réinitialise au lieu de renvoyer l'ancien : il est mathématiquement irrécupérable.
Exercice
- Hashiez "abc" avec bcrypt deux fois : pourquoi les résultats diffèrent-ils ?
- Pourquoi le facteur de coût est-il stocké dans le hash ?
- Un site vous renvoie votre mot de passe par email : que concluez-vous ?
Résumé
- bcrypt/argon2 : lents par conception ; sel intégré et unique.
- compare() vérifie sans déchiffrer — c'est le principe.
- Renvoyer le mot de passe = preuve de stockage réversible = faute grave.
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
Réponses détaillées
Question 2. Pour que la vérification utilise le MÊME coût que le hachage initial — et pour permettre de monter le facteur global dans le temps (les machines s'accélèrent) utilisateur par utilisateur à la connexion.
Question 3. Fuyez : soit stockage en clair, soit chiffrement réversible. Aucun système sérieux ne peut « retrouver » un mot de passe, seulement le remplacer.