Tous trois s'appellent « hachages », mais ils résolvent des problèmes différents. MD5 est un hachage rapide dont la résistance aux collisions est cassée depuis 2004 ; gardez-le pour des sommes de contrôle sans adversaire. SHA-256 est le choix rapide et sûr pour l'intégrité des fichiers, les signatures et HMAC. bcrypt est une fonction de hachage de mots de passe lente par conception, qui sale automatiquement ; utilisez-la (ou Argon2 ou scrypt) pour les mots de passe, jamais MD5 ni SHA-256 seul.
En un coup d'œil
| Propriété | MD5 | SHA-256 | bcrypt |
|---|---|---|---|
| Conçu pour | Hachage général (1992) | Hachage général (famille SHA-2, 2001) | Stockage des mots de passe (1999) |
| Sortie | 128 bits, 32 caractères hexadécimaux | 256 bits, 64 caractères hexadécimaux | Chaîne de 60 caractères avec version, coût, sel et empreinte |
| Vitesse | Très rapide | Rapide | Lent par conception, réglable |
| Sel | Aucun (à ajouter vous-même) | Aucun (à ajouter vous-même) | Sel de 128 bits intégré |
| Facteur de travail | Aucun | Aucun | Paramètre de coût : 2^coût tours |
| Limite d'entrée | Pratiquement aucune | Pratiquement aucune | Seuls les 72 premiers octets sont utilisés |
| Résistance aux collisions | Cassée : une collision s'obtient en quelques secondes | Aucune attaque connue | Pas l'objectif |
| À utiliser pour | Sommes de contrôle hors sécurité uniquement | Intégrité de fichiers, signatures, HMAC, identifiants de contenu | Mots de passe |
La même entrée dans chaque fonction :
| Fonction | Entrée correct horse battery staple |
|---|---|
| MD5 | 9cc2ae8a1ba7a93da39b46fc1019c481 |
| SHA-256 | c4bbcb1fbec99d65bf59d85c8cb62ee2db963f0fe106f483d9afa73bd4e39a8a |
| bcrypt, coût 12 | $2a$12$dPxev78KNUQr7ZVJEsj1QuHnlgkTm.VnudJ/Cny1cr4OIlm0ogWU. |
MD5 et SHA-256 donnent toujours la même sortie pour la même entrée. bcrypt donne une chaîne différente à chaque fois, car il tire un nouveau sel aléatoire ; la chaîne contient la version (2a), le coût (12), le sel de 22 caractères et l'empreinte de 31 caractères, soit tout ce qu'il faut pour vérifier le mot de passe plus tard. Essayez les trois avec le générateur de hachage et le générateur bcrypt.
MD5
MD5 est rapide et omniprésent, mais des collisions pratiques (deux entrées différentes de même empreinte) ont été publiées en 2004, puis des collisions à préfixe choisi, utilisées pour forger un faux certificat d'autorité de certification en 2008 et pour signer le logiciel malveillant Flame en 2012. Un attaquant qui peut influer sur l'entrée peut faire partager une même empreinte MD5 à deux fichiers.
Choisissez MD5 uniquement quand vous détectez des dommages accidentels, comme un téléchargement abîmé en route, sans que personne n'ait intérêt à falsifier une correspondance, ou quand un ancien système ne publie rien d'autre. Même alors, SHA-256 ne coûte guère plus.
SHA-256
SHA-256 appartient à la famille SHA-2 normalisée par le NIST. Aucune attaque pratique par collision ou par préimage n'est connue, et les processeurs modernes disposent d'instructions dédiées. Les gestionnaires de paquets, le nouveau format d'objets de Git, les certificats TLS, la signature de code et Bitcoin reposent dessus.
Choisissez SHA-256 quand il vous faut l'empreinte de données : vérifier un téléchargement avec le calculateur de somme de contrôle de fichier, stockage adressé par contenu, signatures numériques ou code d'authentification de message. Dans ce dernier cas, utilisez HMAC-SHA-256 (essayez le générateur HMAC) plutôt que SHA-256(clé + message), vulnérable aux attaques par extension de longueur.
Ne le choisissez pas pour les mots de passe. Sa rapidité est exactement ce que veut un casseur de mots de passe.
bcrypt
bcrypt repose sur la coûteuse préparation de clé du chiffrement Blowfish, répétée 2^coût fois. Augmenter le coût de un double le travail : générer une empreinte en JavaScript a pris environ 55 ms au coût 10, 105 ms au coût 11 et 213 ms au coût 12 lors de notre test, et un attaquant paie le même prix pour chaque essai. Le sel est généré et stocké pour vous : deux utilisateurs ayant le même mot de passe obtiennent des empreintes différentes.
Choisissez bcrypt quand vous stockez des mots de passe. Il est pris en charge presque partout, y compris dans les fichiers de mots de passe des serveurs web (voir le générateur htpasswd). Attention à la limite de 72 octets : les phrases de passe plus longues sont tronquées sans avertissement. Argon2id, vainqueur de la Password Hashing Competition, est le choix moderne le plus solide quand il est disponible, car il exige aussi beaucoup de mémoire, ce qui freine les attaques sur GPU.
Lequel choisir ?
- Stocker les mots de passe des utilisateurs : bcrypt (coût 10 à 12 ou plus), ou Argon2id ou scrypt. Jamais MD5 ni SHA-256 seul, salé ou non.
- Vérifier un fichier ou un téléchargement : SHA-256. MD5 seulement si c'est la seule somme publiée.
- Signer ou authentifier des messages : HMAC-SHA-256 ou un vrai schéma de signature.
- Produire des identifiants ou clés de cache à partir du contenu : SHA-256 (tronqué s'il faut plus court).
- Tout ce qui touche à la sécurité dans du code neuf : pas MD5.
Pour le fonctionnement interne de ces fonctions, voyez Comment fonctionne le hachage.