Le salage : pourquoi deux mots de passe identiques donnent des empreintes différentes
10 min · Intermédiaire · 7 août 2026
Le prix du déterminisme
Le chapitre 2 présentait le déterminisme comme une propriété nécessaire d’une fonction de hachage : la même entrée doit toujours produire la même empreinte. Appliqué tel quel à des mots de passe, ce déterminisme devient un problème : deux utilisateurs qui choisissent le même mot de passe se retrouvent avec exactement la même empreinte en base.
Danger
Un attaquant qui repère deux empreintes identiques dans une base de données sait immédiatement que ces deux comptes partagent le même mot de passe, sans même avoir besoin de le casser. Une seule rainbow table, calculée une fois, compromet alors tous les comptes partageant un mot de passe courant.
Le sel : une valeur aléatoire, unique, mais pas secrète
Un sel est une valeur aléatoire générée pour chaque utilisateur, combinée au mot de passe avant hachage, puis stockée en clair à côté de l’empreinte (elle n’a rien de secret : son seul rôle est de rendre chaque empreinte unique).
import hashlib, secrets
mot_de_passe = "soleil123"
# Sans sel : deux comptes avec le meme mot de passe ont la meme empreinte
empreinte1 = hashlib.sha256(mot_de_passe.encode()).hexdigest()
empreinte2 = hashlib.sha256(mot_de_passe.encode()).hexdigest()
print("Sans sel, memes empreintes ?", empreinte1 == empreinte2)
# Avec un sel different, genere aleatoirement pour chaque utilisateur
sel_alice = secrets.token_hex(8)
sel_bob = secrets.token_hex(8)
empreinte_alice = hashlib.sha256((sel_alice + mot_de_passe).encode()).hexdigest()
empreinte_bob = hashlib.sha256((sel_bob + mot_de_passe).encode()).hexdigest()
print("Avec sel, memes empreintes ?", empreinte_alice == empreinte_bob)
print("Sel d'Alice :", sel_alice, "-> empreinte :", empreinte_alice)
print("Sel de Bob :", sel_bob, "-> empreinte :", empreinte_bob) Même mot de passe, sels différents, empreintes totalement différentes. Une rainbow table précalculée pour l’algorithme seul devient inutile : il faudrait en recalculer une par sel, ce qui annule l’intérêt même de la précalculation.
Ce que le salage ne règle pas
Le salage empêche la réutilisation d’une même rainbow table entre comptes, mais ne ralentit en rien une attaque par force brute ciblée sur un compte précis : SHA-256 reste une fonction volontairement rapide, calculable des milliards de fois par seconde sur du matériel dédié. C’est pour cette raison que le stockage de mots de passe en production utilise des fonctions délibérément lentes et coûteuses (bcrypt, scrypt, Argon2), hors du cadre de ce cours mais construites sur les mêmes principes de sel et d’empreinte.