Pourquoi pas simplement SHA-256 ?

Un hachage cryptographique ordinaire comme est le bon outil pour l'intégrité, mais le mauvais outil pour stocker des mots de passe, et la raison est justement la propriété qui le rend bon ailleurs : il est rapide. Un attaquant qui vole une base de données de hachages SHA-256 de mots de passe peut tenter des milliards d'essais par seconde sur du matériel grand public, car chaque essai n'est qu'un hachage rapide. Les mots de passe courants tombent presque instantanément. La vitesse, la vertu d'un hachage à usage général, est ici un handicap.

Le stockage des mots de passe exige un hachage délibérément lent et résistant au matériel spécialisé. Trois briques le rendent possible : le salage, un facteur de travail réglable et la dureté mémoire.

Salage : déjouer le précalcul

Un sel (salt) est une valeur aléatoire unique stockée à côté de chaque hachage de mot de passe et mélangée au hachage. Sans sels, des mots de passe identiques produisent des hachages identiques, donc un attaquant peut précalculer une table géante de hachages de mots de passe courants une seule fois (une « rainbow table ») et chercher chaque correspondance instantanément. Un sel unique par mot de passe rend ce précalcul inutile : l'attaquant doit attaquer chaque hachage individuellement, et le même mot de passe se hache différemment pour chaque utilisateur. Les fonctions modernes de hachage de mots de passe génèrent et stockent le sel pour vous.

Facteur de travail : rendre chaque essai coûteux

Un facteur de travail (ou paramètre de coût) contrôle la quantité de calcul que chaque hachage exige. Réglez-le de sorte qu'un seul hachage soit assez lent pour être imperceptible lors d'une connexion légitime (quelques centaines de millisecondes), mais punitif à grande échelle. Comme c'est un paramètre, vous pouvez l'augmenter au fil des ans à mesure que le matériel s'accélère, gardant le coût des essais à peu près constant. C'est le réglage qu'un hachage à usage général n'a tout simplement pas.

Les trois choix standard

  • bcrypt est l'option éprouvée et bien comprise, bâtie sur le chiffrement Blowfish avec un facteur de coût configurable. Une valeur par défaut sûre là où elle est disponible.
  • scrypt ajoute la dureté mémoire : il consomme délibérément une quantité réglable de mémoire, ce qui freine les attaquants utilisant des GPU et des puces sur mesure, puisque ceux-ci font évoluer le calcul bien moins cher que la mémoire.
  • Argon2 a remporté la Password Hashing Competition en 2015 et constitue la recommandation actuelle pour les nouveaux systèmes. Il est à mémoire dure, avec des réglages séparés pour la mémoire, le temps et le parallélisme ; la variante Argon2id est le choix habituel.

L'une quelconque de ces options est un choix raisonnable ; la règle cardinale est d'en utiliser une, jamais un simple hachage rapide, et de ne jamais inventer votre propre schéma.

À retenir

Utilisez SHA-256 (dans l'outil de hachage) pour les sommes de contrôle et l'intégrité, où la vitesse est un atout. Pour les mots de passe, tournez-vous vers bcrypt, scrypt ou Argon2, où la lenteur et le coût mémoire sont tout l'enjeu. Les deux tâches se ressemblent et exigent des outils opposés.