Un sel de mot de passe doit-il être gardé secret ?
Réponse courte
Non. Un sel est une valeur aléatoire unique stockée juste à côté du hash ; son rôle est de faire en sorte que des mots de passe identiques produisent des hashes différents et de neutraliser les rainbow tables précalculées — pas de rester secret. Il est normal qu'un attaquant qui vole la base récupère aussi les sels. Ce qui protège réellement les mots de passe, c'est un hash lent et salé (bcrypt, scrypt, Argon2). Un « poivre » secret optionnel et séparé est un concept différent.
Les candidats supposent souvent qu'un sel est une sorte de clé secrète qu'il faut cacher. Ce n'est pas le cas, et le traiter ainsi trahit une mauvaise compréhension de ce que fait réellement le salage.
À quoi sert un sel
Un sel est une valeur aléatoire unique générée par mot de passe et stockée en clair juste à côté du hash obtenu. Son seul but est de garantir que deux utilisateurs avec le même mot de passe produisent des hashes différents, et de rendre inutiles les attaques précalculées — les rainbow tables. Une rainbow table est construite à l'avance contre des hashes non salés ; si chaque mot de passe a son propre sel aléatoire, l'attaquant aurait besoin d'une table distincte par sel, ce qui détruit l'intérêt économique du précalcul.
Pourquoi le secret n'est pas la question
Comme le sel vit à côté du hash, un attaquant qui vole votre base récupère aussi les sels. C'est attendu et sans danger. Le sel ne rend pas une seule tentative plus difficile à vérifier — il rend impraticables les attaques en masse sur de nombreux comptes, puisque chaque mot de passe candidat doit être re-haché avec le sel de chaque utilisateur plutôt que cherché une seule fois. Le secret n'a jamais été le mécanisme.
Ce qui protège réellement les mots de passe
La vraie protection vient d'un hash lent, salé et adaptatif : bcrypt, scrypt ou Argon2 (Argon2id est la recommandation moderne). Ils consomment volontairement CPU et mémoire pour rendre chaque tentative coûteuse, ralentissant le craquage hors ligne à l'extrême. Un hash rapide à usage général comme SHA-256, même salé, peut être essayé des milliards de fois par seconde sur un GPU.
Le poivre : un concept différent
Il existe bien un secret dans ce domaine — le poivre — mais il est distinct du sel. Un poivre est une unique valeur secrète à l'échelle du site, mélangée avant ou après le hachage, et stockée hors de la base (par ex. dans un HSM ou la config de l'app). Comme il n'est pas dans le dump volé, il ajoute une protection précisément quand la base fuit. Confondre sel et poivre est le cœur de ce piège : le sel est un aléa public par enregistrement ; le poivre est un secret global caché.
Questions de suivi probables
- Qu'est-ce qu'un poivre et en quoi diffère-t-il d'un sel ?
- Pourquoi un sel unique par utilisateur neutralise-t-il les rainbow tables précalculées ?
- Pourquoi un hash rapide comme SHA-256 ne suffit-il pas pour stocker des mots de passe ?