MD5 vs SHA-256 — Pourquoi vous devriez arrêter d'utiliser MD5
MD5 est omniprésent. Il est intégré dans chaque langage de programmation, chaque base de données, chaque SDK de fournisseur cloud. Les développeurs y ont recours par habitude — il est rapide, produit une chaîne hexadécimale ordonnée de 32 caractères, et l'API tient en deux lignes de code. Le problème : MD5 est cryptographiquement compromis depuis 2004, et les attaques n'ont fait que s'accélérer et devenir moins coûteuses depuis lors.
Ce n'est pas théorique. Une cyberattaque de 2012 contre des infrastructures iraniennes — le malware Flame — a forgé un certificat de signature de code Microsoft en exploitant une collision MD5. La même technique que les cryptographes académiques avaient démontrée dans un article est devenue une arme utilisée dans l'espionnage géopolitique. MD5 n'est pas légèrement affaibli ; il est fondamentalement compromis pour toute application où un adversaire peut choisir les entrées.
SHA-256, qui fait partie de la famille SHA-2 standardisée par le NIST, ne présente aucune attaque par collision connue et reste la norme pour l'intégrité cryptographique en 2026. Cet article explique exactement ce que signifie cette différence, dans quels cas (rares) MD5 est encore acceptable, et comment migrer en toute sécurité. Vous pouvez calculer les deux hachages instantanément avec les outils MD5 Toova et SHA-256 Toova.
Comment fonctionnent les fonctions de hachage
Une fonction de hachage cryptographique prend une entrée de n'importe quelle longueur et produit une sortie de longueur fixe (le condensé) avec ces propriétés :
- Déterministe : la même entrée produit toujours la même sortie.
- Effet avalanche : un seul changement de bit dans l'entrée modifie complètement la sortie.
- Résistance à la préimage : étant donné un hachage, il est computationnellement infaisable de trouver l'entrée.
- Résistance aux collisions : il est computationnellement infaisable de trouver deux entrées différentes qui produisent le même hachage.
L'effet avalanche explique pourquoi MD5 et SHA-256 se ressemblent à première vue :
MD5("The quick brown fox jumps over the lazy dog")
= 9e107d9d372bb6826bd81d3542a419d6
MD5("The quick brown fox jumps over the lazy cog")
= 1055d3e698d289f2af8663725127bd4b SHA-256("The quick brown fox jumps over the lazy dog")
= d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592
SHA-256("The quick brown fox jumps over the lazy cog")
= e4c4d8f3bf76b692de791a173e05321150f7a345b46484fe427f6acc7ecc81be Un seul caractère a changé dans l'entrée (« dog » → « cog »), pourtant la sortie est complètement différente. Cette propriété vaut pour les deux algorithmes. La différence réside dans ce qui se passe lorsqu'un attaquant essaie de trouver intentionnellement une collision.
MD5 — Une chronologie d'échecs (1996–2025)
MD5 a été conçu par Ron Rivest en 1991 comme remplacement de MD4. En 1996, Hans Dobbertin avait trouvé des collisions dans la fonction de compression de MD5 — pas l'algorithme complet, mais un signal d'alarme que la conception était fragile. La communauté de sécurité a commencé à recommander la migration vers SHA-1. La plupart des systèmes ont ignoré cela.
2004 — Collisions complètes démontrées
En août 2004, Xiaoyun Wang et Hongbo Yu ont présenté une attaque par collision pratique sur MD5 à la conférence CRYPTO. Ils pouvaient générer deux messages différents de 1 024 bits avec le même hachage MD5 en moins d'une heure sur un cluster. La garantie fondamentale de MD5 — la résistance aux collisions — était brisée.
Le NIST a immédiatement commencé à déprécier MD5 pour l'usage fédéral. La plupart des recommandations du secteur ont suivi. Le déploiement réel de MD5 dans les systèmes de production a à peine changé.
2008 — Faux certificats d'autorité de certification
Un groupe de chercheurs (Sotirov, Stevens, et al.) a démontré qu'ils pouvaient créer un faux certificat d'autorité de certification qui serait approuvé par tous les principaux navigateurs. L'attaque exploitait le fait que plusieurs autorités de certification signaient encore des certificats avec MD5. Les chercheurs ont généré une collision entre une demande de certificat d'apparence légitime et un certificat CA auto-fabriqué — puis ont demandé à une vraie CA de signer le légitime, produisant une signature également valide pour le faux certificat CA.
Tous les principaux navigateurs ont immédiatement bloqué les certificats signés MD5. La plupart des autorités de certification ont cessé d'en émettre. Une leçon majeure : les faiblesses cryptographiques deviennent exploitables dès lors qu'un attaquant contrôle l'entrée de la fonction de hachage.
2012 — Le malware Flame
Le malware de cyber-espionnage Flame, découvert en 2012 et attribué à des acteurs étatiques, a forgé un certificat Windows Update Microsoft en utilisant une collision MD5 à préfixe choisi. L'attaque était plus sophistiquée que la démonstration de 2008 : les attaquants pouvaient créer une charge utile malveillante qui entrait en collision avec un certificat Microsoft légitime dans des conditions où l'infrastructure de signature de Microsoft coopérait à son insu.
Résultat : Flame pouvait se distribuer via Windows Update comme s'il s'agissait d'une mise à jour Microsoft légitime, avec une signature Microsoft valide. Des centaines de milliers de machines Windows en Iran, au Liban, en Syrie et au Soudan ont été infectées. C'était une exploitation réelle des attaques par collision MD5 à l'échelle d'un État. Voir l'article Wikipedia sur le malware Flame pour l'histoire complète.
2019–2025 — HashClash et collisions instantanées
Le projet HashClash (Marc Stevens, CWI Amsterdam) a continué à pousser la génération de collisions MD5 vers des limites pratiques. En 2019, les collisions MD5 à préfixe choisi — où un attaquant peut choisir des préfixes arbitraires pour les deux messages en collision — pouvaient être générées en jours sur du matériel grand public. En 2022, des implémentations optimisées ont réduit cela à des heures. En 2024, un article HashClash a démontré des collisions en moins d'une minute sur un seul GPU moderne.
La trajectoire est claire : les attaques par collision MD5 ne deviennent pas plus difficiles à mesure que le matériel s'améliore — elles deviennent plus faciles. Ce qui nécessitait un cluster en 2004 prend un ordinateur portable en 2026.
SHA-256 — Pourquoi il tient
SHA-256 fait partie de la famille SHA-2, conçue par la NSA et standardisée par le NIST en 2001. Il produit un condensé de 256 bits (32 octets). Aucune attaque par collision pratique contre SHA-256 n'est connue en 2026. Les meilleures attaques publiées réduisent le facteur de travail théorique pour trouver des collisions à environ 2^187 opérations — encore bien au-delà de toute ressource computationnelle qui existe ou est prévisible.
La marge de sécurité de SHA-256 est intentionnellement conservatrice. Même si le matériel s'améliore d'un facteur d'un milliard (environ 30 doublements en termes de loi de Moore), briser SHA-256 reste computationnellement infaisable. Le facteur de travail effectif de MD5 pour les collisions, de 2^18 à 2^23, était à la portée d'un matériel modeste en 2004.
SHA-256 est aussi plus rapide qu'on pourrait le penser : les CPU modernes incluent des instructions SHA dédiées (Intel SHA Extensions, ARM Cryptography Extensions) qui permettent aux logiciels de calculer des millions de hachages SHA-256 par seconde par cœur. Il n'est pas significativement plus lent que MD5 pour les cas d'usage typiques.
Quand MD5 est encore acceptable (rarement)
« Compromis » ne signifie pas « inutile pour tout usage ». MD5 reste acceptable dans les contextes où :
- Il n'y a pas d'adversaire : détecter une corruption accidentelle de fichiers dans un système interne de confiance — pas pour vérifier des téléchargements depuis Internet, mais pour vérifier si une copie de fichier s'est terminée correctement.
- La vitesse compte plus que la sécurité : calculer des clés de cache ou des identifiants de shard où une collision signifie simplement un défaut de cache, pas une brèche de sécurité. Le modèle d'attaquant est absent.
- Vous correspondez à un système externe existant : certaines API héritées envoient encore des ETags ou des sommes de contrôle MD5. Vous pouvez accepter et calculer MD5 pour interopérer, tant que vous ne l'utilisez pas pour des décisions de sécurité.
- Partitionnement de table de hachage : distribuer des données entre des buckets par MD5 d'une clé. Les collisions ici causent un déséquilibre, pas des échecs de sécurité.
Le fil conducteur : MD5 est acceptable lorsque l'application ne dépend pas de la résistance aux collisions et qu'il n'y a pas d'adversaire pouvant créer des entrées. Dès que l'une de ces conditions est rompue — attaquant présent, ou collision = échec de sécurité — passez à SHA-256.
Mythes courants sur MD5
« MD5 est acceptable si on ajoute un sel »
Le salage change l'entrée de sorte que deux utilisateurs avec le même mot de passe obtiennent des hachages différents — cela prévient les attaques par table arc-en-ciel. Mais il ne corrige pas le problème de collision. Un attaquant disposant du hachage MD5 salé peut encore le forcer brutalement de manière efficace car MD5 est rapide : les GPU modernes calculent environ 10 à 30 milliards de hachages MD5 par seconde. Un sel ajoute un travail proportionnel à l'espace de recherche, pas à la difficulté de l'algorithme.
Pour le hachage de mots de passe, ni MD5 ni SHA-256 ne sont appropriés, indépendamment du salage. Utilisez bcrypt, scrypt ou Argon2.
« MD5 est acceptable parce que nous ne l'utilisons qu'en interne »
Les systèmes internes sont compromis. Le modèle de menace « l'attaquant ne peut pas accéder à nos entrées » tend à tenir jusqu'à ce qu'une attaque de la chaîne d'approvisionnement, une menace interne ou une mauvaise configuration expose le système. L'attaque Flame s'est produite contre des systèmes qui avaient probablement une confiance similaire dans leurs contrôles internes.
« SHA-256 est excessif — MD5 est plus rapide »
Sur du matériel moderne avec des instructions d'accélération SHA, SHA-256 est environ 2 à 5 fois plus lent que MD5. Pour la plupart des applications — vérifications d'intégrité de fichiers, signatures d'API, clés de cache — la différence est de quelques microsecondes par opération, imperceptible en pratique. L'argument de performance pour MD5 par rapport à SHA-256 ne tient que dans des scénarios à très haut débit où même les microsecondes comptent, et même dans ce cas, il existe généralement de meilleures solutions que d'utiliser un algorithme compromis.
Guide de migration — MD5 vers SHA-256
Hachage de mots de passe
// INCORRECT : MD5 pour hacher des mots de passe
const crypto = require('crypto');
const hash = crypto.createHash('md5').update(password).digest('hex');
// Temps de craquage avec un GPU moderne : quelques secondes à quelques minutes // INCORRECT : SHA-256 pour hacher des mots de passe (encore trop rapide)
const crypto = require('crypto');
const hash = crypto.createHash('sha256').update(password).digest('hex');
// CORRECT : utilisez bcrypt, scrypt ou Argon2 pour les mots de passe
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash(password, 12); La migration des hachages de mots de passe stockés nécessite une approche progressive. À chaque connexion réussie : vérifiez le mot de passe par rapport au hachage MD5 existant, puis rehachoz immédiatement avec bcrypt et remplacez la valeur stockée. Marquez chaque compte comme migré. Après une période raisonnable (90 jours est typique), forcez une réinitialisation du mot de passe pour les comptes restants qui utilisent encore des hachages MD5.
Intégrité de fichiers / sommes de contrôle
# Linux : vérifier un fichier téléchargé
sha256sum -c ubuntu-24.04-desktop-amd64.iso.sha256
# macOS
shasum -a 256 ubuntu-24.04-desktop-amd64.iso
# Windows PowerShell
Get-FileHash ubuntu-24.04-desktop-amd64.iso -Algorithm SHA256 Passer les vérifications d'intégrité de fichiers de MD5 à SHA-256 est généralement un simple chercher-remplacer dans le code. Les deux points de vigilance : (1) les sommes de contrôle existantes stockées dans des bases de données ou des fichiers doivent être recalculées et mises à jour — il n'y a pas de raccourci ; (2) les API externes ou les systèmes de stockage qui fournissent des ETags MD5 (comme certaines configurations S3) nécessitent une coordination pour effectuer le changement.
HMAC pour l'authentification d'API
// HMAC-SHA-256 pour l'authentification de messages
const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', process.env.SECRET_KEY)
.update(message)
.digest('hex'); Si vous utilisez HMAC-MD5 pour la signature de requêtes API, passez à HMAC-SHA-256. La construction HMAC ajoute une clé secrète, ce qui limite certaines attaques MD5, mais HMAC-MD5 a des vulnérabilités d'extension de longueur et la primitive sous-jacente reste compromise. Les standards modernes (JWT, AWS SigV4, OAuth 2.0) spécifient tous HMAC-SHA-256. Le générateur HMAC de Toova prend en charge HMAC-SHA-256 et HMAC-SHA-512 pour les tests.
Signatures numériques et certificats
Tout certificat signé avec MD5 doit être réémettre immédiatement — la plupart des autorités de certification ont cessé d'émettre des certificats signés MD5 après 2008, et tous les principaux navigateurs et systèmes d'exploitation les rejettent. Pour les PKI internes, auditez votre configuration CA et assurez-vous que SHA-256 est l'algorithme de signature minimum autorisé. RSA-SHA256 ou ECDSA-SHA256 sont les standards actuels.
MD5 vs SHA-256 — Référence rapide
| Propriété | MD5 | SHA-256 |
|---|---|---|
| Longueur de sortie | 128 bits (32 chars hex) | 256 bits (64 chars hex) |
| Résistance aux collisions | Compromise (attaques pratiques) | Sûr (aucune attaque connue) |
| Hachage de mots de passe | Jamais | Non (utiliser bcrypt/Argon2) |
| Signatures numériques | Jamais | Oui |
| Intégrité de fichiers (sécurité) | Jamais | Oui |
| Sommes de contrôle non liées à la sécurité | Acceptable (sans attaquant) | Toujours OK |
| Clés de cache | Acceptable | Toujours OK |
| Signature de certificat TLS | Rejeté par les navigateurs | Standard |
| Conforme FIPS 140-3 | Non (déprécié) | Oui |
Conclusion
MD5 est cryptographiquement compromis depuis 2004. Les collisions à préfixe choisi — la technique qui a alimenté le malware Flame — sont maintenant computationnellement bon marché. Toute application qui s'appuie sur MD5 pour la sécurité (signatures, vérification d'intégrité, authentification) est vulnérable à des attaques qui coûtent quelques minutes de calcul à exécuter.
SHA-256 ne présente aucune attaque pratique connue, est accéléré matériellement sur les CPU modernes, et est le standard pour l'intégrité cryptographique dans TLS, la signature de code et l'authentification d'API. Le coût de performance par rapport à MD5 est négligeable pour presque tous les cas d'usage.
Le chemin de migration est simple : les vérifications d'intégrité de fichiers sont un chercher-remplacer. Les signatures d'API nécessitent de coordonner une version. Les hachages de mots de passe ont besoin d'une stratégie de rehachage progressive à la connexion. Pour tout nouveau code, SHA-256 devrait être le choix par défaut. Calculez et comparez les hachages directement avec Toova MD5 et Toova SHA-256 — ou générez des codes d'authentification HMAC-SHA-256 avec le générateur HMAC.