MD5 : fonctionnement, empreinte de 32 caractères et failles

MD5 est une fonction de hachage qui transforme n'importe quelle donnée en une empreinte de 128 bits, écrite sous forme de 32 caractères hexadécimaux. Elle reste pratique pour vérifier qu'un téléchargement n'a pas été tronqué, mais sa résistance aux collisions est cassée depuis 2004 : ne l'utilisez plus pour signer, authentifier ou stocker un mot de passe.

Ce que MD5 calcule exactement

MD5 (Message Digest 5) a été conçu par Ronald Rivest en 1991 et publié dans la RFC 1321 en avril 1992, en remplacement de MD4 qui montrait déjà des faiblesses. L'algorithme découpe le message en blocs de 512 bits, applique 64 opérations par bloc réparties en 4 tours, et met à jour quatre registres de 32 bits initialisés à des constantes fixes (0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476). Le résultat concaténé fait 128 bits, soit 16 octets, soit 32 caractères hexadécimaux.

Avant le traitement, le message est complété : un bit à 1, puis des zéros jusqu'à ce que la longueur soit congrue à 448 modulo 512, puis la longueur d'origine codée sur 64 bits en petit-boutiste. Cette construction dite de Merkle-Damgård explique une bonne partie des faiblesses décrites plus bas.

Deux propriétés utiles au quotidien : le calcul est déterministe (même entrée, même sortie, sur n'importe quelle machine) et un seul bit modifié change environ la moitié des bits de sortie. Un fichier ISO de 5 Go et une chaîne vide donnent tous les deux une empreinte de 32 caractères. Les valeurs ci-dessous proviennent du jeu de tests de la RFC 1321, vous pouvez les reproduire immédiatement.

EntréeEmpreinte MD5
(chaîne vide)d41d8cd98f00b204e9800998ecf8427e
a0cc175b9c0f1b6a831c399e269772661
abc900150983cd24fb0d6963f7d28e17f72
message digestf96b697d7cb7938d525a2f31aaf161d0

Calculer et vérifier une empreinte en ligne de commande

Sur Linux, md5sum fait partie de GNU coreutils et est présent par défaut. Sur macOS et les BSD, la commande s'appelle md5 et n'affiche pas le nom du fichier sauf si vous le demandez. Attention au piège classique : echo ajoute un saut de ligne, donc `echo abc | md5sum` ne renvoie pas la valeur de test de la RFC. Utilisez `printf` ou l'option -n.

Le cas d'usage qui tient encore debout, c'est la vérification d'un téléchargement contre un fichier de sommes publié par l'éditeur. `md5sum -c fichier.md5` lit une liste d'empreintes et signale chaque fichier qui ne correspond pas. Cela détecte une coupure réseau, un disque défaillant ou un miroir mal synchronisé. Cela ne détecte pas un miroir compromis, parce qu'un attaquant capable de modifier le binaire peut aussi modifier le fichier de sommes.

  • Linux : `md5sum image.iso` ou `printf 'abc' | md5sum`
  • macOS et BSD : `md5 -q image.iso`
  • Windows : `certutil -hashfile image.iso MD5`
  • PowerShell : `Get-FileHash -Algorithm MD5 image.iso`
  • Multiplateforme : `openssl dgst -md5 image.iso` (bloqué si OpenSSL tourne en mode FIPS)
  • Vérification d'un lot : `md5sum -c MD5SUMS`

Collision, préimage : ce qui est cassé et ce qui ne l’est pas

Il faut distinguer deux propriétés. La résistance aux collisions signifie qu'on ne peut pas fabriquer deux messages différents ayant la même empreinte. La résistance à la préimage signifie qu'à partir d'une empreinte, on ne peut pas retrouver un message qui la produit. Sur MD5, la première est morte, la seconde tient encore sur le papier.

En août 2004, l'équipe de Xiaoyun Wang a présenté la première collision MD5 complète. L'outil fastcoll de Marc Stevens produit aujourd'hui deux fichiers de contenu différent et d'empreinte identique en quelques secondes sur un ordinateur portable ordinaire. En 2007, la collision à préfixe choisi est devenue possible, ce qui permet de partir de deux débuts de fichiers arbitraires et différents, puis de les faire converger vers la même empreinte.

Les conséquences ont été concrètes. En décembre 2008, une équipe a fabriqué un faux certificat d'autorité de certification en exploitant une collision MD5 sur des certificats émis par RapidSSL, avec un cluster de 200 PlayStation 3. En 2012, le maliciel Flame a utilisé une variante de collision à préfixe choisi pour se faire signer comme un composant Microsoft. La RFC 6151, publiée en mars 2011, acte que MD5 ne doit plus servir dans aucune application qui dépend de la résistance aux collisions.

Côté préimage, la meilleure attaque publiée reste théorique : environ 2^123,4 opérations (Sasaki et Aoki, 2009), contre 2^128 pour la force brute. Personne ne va inverser mathématiquement votre empreinte. En revanche MD5 est très rapide à calculer, et c'est là le vrai problème pour les mots de passe : une carte graphique de jeu récente teste plusieurs dizaines de milliards de MD5 par seconde sous hashcat, ce qui épuise un dictionnaire entier en quelques minutes.

Dernier défaut structurel : l'extension de longueur. Si vous construisez un code d'authentification maison sous la forme MD5(secret + message), un attaquant qui connaît le message, son empreinte et la longueur du secret peut ajouter des données à la fin et calculer une empreinte valide sans jamais connaître le secret. HMAC a été inventé pour ça.

MD5 dans les protocoles réseau, encore présent partout

Si vous administrez des routeurs ou des serveurs d'authentification, vous croisez MD5 sans le chercher. La protection des sessions BGP repose historiquement sur l'option TCP MD5 Signature de la RFC 2385, remplacée officiellement par TCP-AO (RFC 5925) mais toujours configurée sur une large partie du parc, parce que TCP-AO est mal supporté par les piles TCP.

L'exemple le plus récent est parlant. Le protocole RADIUS (RFC 2865) construit son Response Authenticator avec MD5. En juillet 2024, l'attaque Blast-RADIUS (CVE-2024-3596) a montré qu'un attaquant en position d'intercepteur sur le trafic RADIUS en UDP pouvait transformer un Access-Reject en Access-Accept grâce à une collision à préfixe choisi. Le correctif immédiat consiste à rendre obligatoire l'attribut Message-Authenticator, puis à passer le transport en RadSec (RADIUS sur TLS, RFC 6614).

Le tableau récapitule où MD5 traîne encore et ce que la norme prévoit à la place.

ProtocoleUsage de MD5Remplacement normalisé
BGPOption TCP MD5 Signature (RFC 2385)TCP-AO (RFC 5925)
OSPFv2Authentification cryptographique type 2 (RFC 2328, annexe D)HMAC-SHA (RFC 5709)
RIPv2Authentification MD5 (RFC 2082)HMAC-SHA (RFC 4822)
RADIUSResponse Authenticator, masquage du mot de passe (RFC 2865)Message-Authenticator obligatoire, puis RadSec (RFC 6614)
DNS TSIGHMAC-MD5 (RFC 2845)HMAC-SHA-256 (RFC 8945)
IPsecHMAC-MD5-96 (RFC 2403)HMAC-SHA-256-128 (RFC 4868)
SNMPv3usmHMACMD5AuthProtocol (RFC 3414)HMAC-SHA-2 (RFC 7860)

Par quoi le remplacer, et les confusions à éviter

Première confusion, la plus fréquente : MD5 n'est pas du chiffrement. Il n'y a pas de clé, pas d'opération inverse, et la sortie fait toujours 128 bits quelle que soit la taille de l'entrée. Quand un site propose de « décrypter un MD5 », il consulte en réalité une base de correspondances déjà calculées, ou lance une attaque par dictionnaire. Cela marche très bien sur `123456` et pas du tout sur une phrase de passe de 40 caractères.

Deuxième confusion : MD5 et SHA-1 sont souvent mis dans le même sac. Les deux ont des collisions pratiques, mais SHA-1 produit 160 bits (40 caractères hexadécimaux) et sa première collision publique date de 2017, soit treize ans après MD5. Ni l'un ni l'autre n'a sa place dans un nouveau projet.

Troisième point, les mots de passe. Le format md5crypt, reconnaissable au préfixe $1$ dans un /etc/shadow, applique 1000 itérations de MD5. Son auteur, Poul-Henning Kamp, l'a lui-même déclaré obsolète en 2012. Si vous héritez d'une base en MD5 simple, la migration réaliste consiste à rehacher chaque mot de passe en Argon2id à la prochaine connexion réussie de l'utilisateur, puis à effacer l'ancienne colonne. Empiler du MD5 sur du MD5 ne gagne rien.

Là où MD5 reste acceptable : clés de cache, déduplication de fichiers, identifiants de ligne dans un ETL, ETag HTTP, à condition qu'aucun attaquant ne contrôle le contenu haché et qu'une collision ne cause qu'une gêne, pas une faille. Dès que la valeur sert à décider d'accorder un accès ou à prouver qu'un fichier est authentique, changez d'algorithme.

BesoinÀ utiliser à la place de MD5
Vérifier l'intégrité d'un fichierSHA-256, ou BLAKE3 si le débit compte
Authentifier un message avec une cléHMAC-SHA-256
Stocker un mot de passeArgon2id, sinon scrypt ou bcrypt
Signer un certificat ou du codeSHA-256 avec RSA ou ECDSA, Ed25519
Clé de cache, déduplicationMD5 tolérable hors contexte adverse, sinon SHA-256 tronqué

Questions fréquentes

Peut-on décrypter un MD5 ?

Non, le hachage n'est pas réversible : 128 bits de sortie ne peuvent pas contenir un fichier de 5 Go. Les services qui prétendent le faire interrogent une base d'empreintes précalculées ou testent des milliards de candidats par force brute. Une chaîne courte ou courante sera retrouvée en une fraction de seconde, une entrée longue et aléatoire ne le sera pas.

MD5 ou SHA-256 pour vérifier un téléchargement ?

SHA-256. MD5 ne détecte qu'un transfert corrompu ; il ne prouve rien face à un attaquant, puisque celui-ci peut fabriquer un second fichier ayant la même empreinte. Beaucoup de projets publient encore les deux pour compatibilité : dans ce cas, vérifiez la ligne SHA-256, et si possible la signature GPG du fichier de sommes.

Deux fichiers différents peuvent-ils vraiment avoir le même MD5 ?

Oui, et ce n'est plus une curiosité mathématique. L'outil fastcoll génère une paire de fichiers en collision en quelques secondes sur un poste standard. On sait aussi produire deux exécutables ou deux PDF au contenu visiblement différent partageant la même empreinte, ce qui est exactement le mécanisme utilisé contre le certificat RapidSSL en 2008.

Faut-il éliminer MD5 de toute mon infrastructure ?

Non, il faut le retirer là où il porte une décision de sécurité : signatures, authentification, mots de passe, contrôle d'intégrité opposable. Un ETag HTTP calculé en MD5 ou une clé de déduplication interne ne posent pas de problème tant que le contenu ne vient pas d'un tiers hostile. Priorisez plutôt RADIUS, les sessions BGP et tout stockage de secrets.

Pourquoi mon md5sum ne correspond pas à celui affiché sur le site ?

Dans l'ordre de fréquence : téléchargement incomplet ou repris, transfert FTP en mode ASCII qui a converti les fins de ligne, fichier décompressé alors que l'empreinte porte sur l'archive, ou saut de ligne parasite quand vous hachez une chaîne avec echo au lieu de printf. Comparez d'abord la taille en octets, cela règle la plupart des cas.

À lire aussi

chiffrement · certificat ssl · brute force · attaques par mot de passe

Testez vos connaissances

Quiz rapide Question 1 sur 3

Quelle est la taille d'une empreinte MD5 ?

Newsletter

Recevez nos guides IP & réseau

Nouveaux outils, définitions et astuces sécurité, directement par email. Pas de spam, désinscription en un clic.