AccueilđŸ‡«đŸ‡·Chercher

MD5

Le MD5, pour Message Digest 5, est une fonction de hachage cryptographique qui permet d'obtenir l'empreinte numérique d'un fichier (on parle souvent de message). Il a été inventé par Ronald Rivest en 1991.

Vue générale de MD5.

Si l'algorithme MD5 prĂ©sente un intĂ©rĂȘt historique important, il est aujourd'hui considĂ©rĂ© comme dĂ©passĂ© et absolument impropre Ă  toute utilisation en cryptographie ou en sĂ©curitĂ©[1] - [2]. Il est toutefois encore utilisĂ© pour vĂ©rifier l'intĂ©gritĂ© d'un fichier aprĂšs un tĂ©lĂ©chargement.

Historique

MD5 (Message Digest 5) est une fonction de hachage cryptographique qui calcule, Ă  partir d'un fichier numĂ©rique, son empreinte numĂ©rique (en l'occurrence une sĂ©quence de 128 bits ou 32 caractĂšres en notation hexadĂ©cimale) avec une probabilitĂ© trĂšs forte que deux fichiers diffĂ©rents donnent deux empreintes diffĂ©rentes.

En 1991, Ronald Rivest améliore l'architecture de MD4 pour contrer des attaques potentielles qui seront confirmées plus tard par les travaux de Hans Dobbertin.

Cinq ans plus tard, en 1996, une faille qualifiĂ©e de « grave » (possibilitĂ© de crĂ©er des collisions Ă  la demande) est dĂ©couverte et indique que MD5 devrait ĂȘtre mis de cĂŽtĂ© au profit de fonctions plus robustes comme SHA-1.

En 2004, une équipe chinoise découvre des collisions complÚtes. MD5 n'est donc plus considéré comme sûr au sens cryptographique. On suggÚre maintenant d'utiliser plutÎt des algorithmes tels que SHA-256, RIPEMD-160 ou Whirlpool.

Cependant, la fonction MD5 reste encore largement utilisée comme outil de vérification lors des téléchargements et l'utilisateur peut valider l'intégrité de la version téléchargée grùce à l'empreinte. Ceci peut se faire avec un programme comme md5sum pour MD5 et sha1sum pour SHA-1.

Comme toute fonction de hachage cryptographique, MD5 peut aussi ĂȘtre utilisĂ© pour calculer l'empreinte d'un mot de passe avec la prĂ©sence d'un sel permettant de ralentir une attaque par force brute. Cela a Ă©tĂ© le systĂšme employĂ© dans GNU/Linux. Ainsi, plutĂŽt que de stocker les mots de passe dans un fichier, ce sont leurs empreintes MD5 qui Ă©taient enregistrĂ©es (SHA-256, SHA-512 -par dĂ©faut- ou DES sont maintenant utilisĂ©s), de sorte que quelqu'un qui lirait ce fichier ne pourrait pas dĂ©couvrir les mots de passe. La commande enable secret des commutateurs et routeurs Cisco utilisait le hachage MD5 (5 pour indiquer MD5) pour stocker le mot de passe du mode privilĂ©giĂ© dans le fichier de configuration de l'Ă©quipement. Les derniĂšres versions d'IOS intĂšgrent le hachage SHA256 (4 pour indiquer SHA256)[3]. Cependant, il est recommandĂ© aujourd'hui d'utiliser des fonctions de hachage destinĂ©es au stockage des mots passe telles que bcrypt, scrypt ou Argon2, car elles ont l'avantage d'ĂȘtre lentes, ce qui ralentit l'adversaire souhaitant attaquer les mots de passe.

Le programme John the ripper permet de casser (inverser la fonction pour) les MD5 triviaux par force brute. Il est incommode pour les clés longues, et ne fonctionne pas toujours si elles contiennent des caractÚres nationaux spécifiques (cela dépend en fait des dictionnaires utilisés).

Les rainbow tables (Ă  accĂšs direct, et qui font parfois plusieurs gigaoctets) permettent de les craquer souvent en moins d'une seconde. Ces tables utilisent des dictionnaires Ă©tablis aprĂšs plusieurs jours, mois ou annĂ©es de calcul. Ceux-ci ne contiennent pas la totalitĂ© des clĂ©s MD5 possibles, ni ne sont destinĂ©s Ă  un cassage par force brute (une empreinte comporte 128 bits, ce qui reprĂ©sente environ 400 sextillions () de combinaisons), mais permettent par examen de l'empreinte d'Ă©liminer de trĂšs grandes classes de combinaisons Ă  ne pas tester, ce qui accĂ©lĂšre la recherche plusieurs milliards de fois. L'efficacitĂ© des tables arc-en-ciel diminue si l'empreinte est calculĂ©e avec un « sel ».

Exemple

Voici l'empreinte (appelée abusivement signature) obtenue sur une phrase :

MD5("Et l’unique cordeau des trompettes marines") = 8747e564eb53cb2f1dcb9aae0779c2aa

En modifiant un caractĂšre, cette empreinte change radicalement :

MD5("Et l’unique cordeau des trompettes marinEs") = c802e1bd9b5f2b0d244bbc982f5082b3

TrĂšs concrĂštement, la vĂ©rification de l'empreinte ou somme de contrĂŽle MD5 peut ĂȘtre rĂ©alisĂ©e de la façon suivante : lors du tĂ©lĂ©chargement d'un programme, on note la sĂ©rie de caractĂšres nommĂ©e « Signature MD5 » indiquĂ©e sur la page de tĂ©lĂ©chargement. Quand ce tĂ©lĂ©chargement est terminĂ©, on lance un utilitaire de calcul MD5 comme HashCalc, md5sums (Windows) ou md5sum (Linux), qui indique entre autres la somme de contrĂŽle correspondant au fichier. Si les deux valeurs correspondent, on peut alors raisonnablement considĂ©rer que le fichier n'a pas Ă©tĂ© corrompu (volontairement ou non d'ailleurs). On constate plusieurs fragilitĂ©s dans ce processus : la page d'origine a pu ĂȘtre modifiĂ©e, et l'utilitaire de calcul peut ĂȘtre adaptĂ© pour fournir la signature attendue. C'est pourquoi il faut impĂ©rativement utiliser un utilitaire provenant d'une source de confiance. Il est aussi possible d'utiliser une extension pour le navigateur Mozilla Firefox comme MD Hash tool[4] afin d'automatiser ce contrĂŽle.

Cryptanalyse

À ses dĂ©buts, la fonction MD5 Ă©tait considĂ©rĂ©e comme sĂ»re, mais au cours du temps, des failles ont Ă©tĂ© dĂ©couvertes dans son fonctionnement et durant l'Ă©tĂ© 2004, il a Ă©tĂ© cassĂ© par des chercheurs chinois, Xiaoyun Wang, Dengguo Feng, Xuejia Lai (co-inventeur du cĂ©lĂšbre algorithme de chiffrement IDEA) et Hongbo Yu. Leur attaque a permis de dĂ©couvrir une collision complĂšte (deux messages diffĂ©rents qui produisent la mĂȘme empreinte) sans passer par une mĂ©thode de type recherche exhaustive[5].

Sur un systĂšme parallĂ©lisĂ©, les calculs n'ont pris que quelques heures. Le MD5 n'est donc plus considĂ©rĂ© comme sĂ»r, mais l'algorithme dĂ©veloppĂ© par ces trois chercheurs concerne des collisions quelconques et ne permet pas de rĂ©aliser une collision sur une empreinte spĂ©cifique, c'est-Ă -dire rĂ©aliser un deuxiĂšme message, Ă  partir de l'empreinte d'un premier message, qui produirait la mĂȘme empreinte. Un projet de calcul distribuĂ© lancĂ© en , MD5CRK (en), visait Ă  dĂ©couvrir une collision complĂšte mais a Ă©tĂ© subitement arrĂȘtĂ© aprĂšs la dĂ©couverte de l'Ă©quipe chinoise. La sĂ©curitĂ© du MD5 n'Ă©tant plus garantie selon sa dĂ©finition cryptographique, les spĂ©cialistes recommandent d'utiliser des fonctions de hachage plus rĂ©centes comme le SHA-256.

On sait maintenant gĂ©nĂ©rer des collisions MD5 en moins d'une minute lorsque les deux blocs en collisions sont « libres »[6]. On peut aussi gĂ©nĂ©rer une infinitĂ© de collisions avec un texte T Ă  partir de deux messages M1 et M2 de mĂȘme longueur qui sont en collision. Il suffit de concatĂ©ner M1 et M2 avec T, tel que T1 = M1 + T et T2 = M2 + T, afin d'obtenir une collision complĂšte entre T1 et T2. On ne peut toutefois pas gĂ©nĂ©rer une signature particuliĂšre et la falsification de documents reste un exercice difficile.

DĂšs 2006, il est par exemple possible de crĂ©er des pages HTML aux contenus trĂšs diffĂ©rents et ayant pourtant le mĂȘme MD5. La prĂ©sence de mĂ©tacodes de « bourrage » placĂ©s en commentaires, visibles seulement dans le source de la page web, trahit toutefois les pages modifiĂ©es pour usurper le MD5 d'une autre. La supercherie peut donc ĂȘtre levĂ©e si on examine les sources de la page en question.

En 2008, le logiciel BarsWF[7] utilise les ressources des instructions SSE2 et des processeurs massivement parallĂšles d'une carte graphique (CUDA) pour casser du MD5 en force brute Ă  la vitesse annoncĂ©e de 350 millions de clĂ©s par seconde.

Algorithme

Une opĂ©ration de MD5. MD5 comprend 64 blocs de ce type, groupĂ©s en quatre tours de 16 opĂ©rations. F est une fonction non linĂ©aire, qui varie selon le tour. Mi symbolise un bloc de 32 bits provenant du message Ă  hacher et Ki est une constante de 32 bits, diffĂ©rentes pour chaque opĂ©ration.

Notation

  • [<<<]s est une rotation de s bits vers la gauche, s varie pour chaque opĂ©ration.
  • [+] symbolise l'addition modulo 232.
  • symbolisent respectivement les opĂ©rations boolĂ©ennes XOR, AND, OR et NOT.

Préparation du message

MD5 travaille avec un message de taille variable et produit une empreinte de 128 bits. Le message est divisĂ© en blocs de 512 bits, on applique un remplissage de maniĂšre Ă  avoir un message dont la longueur est un multiple de 512. Le remplissage se prĂ©sente comme suit :

  • on ajoute un 1 Ă  la fin du message ;
  • on ajoute une sĂ©quence de '0' (le nombre de zĂ©ros dĂ©pend de la longueur du remplissage nĂ©cessaire) ;
  • on Ă©crit la taille du message, un entier codĂ© sur 64 bits.

Ce remplissage est toujours appliquĂ©, mĂȘme si la longueur du message peut ĂȘtre divisĂ©e par 512. Cette mĂ©thode de padding est semblable Ă  celle utilisĂ©e dans la plupart des algorithmes de message digest des familles MD (comme MD5 ou RIPEMD) ou SHA (SHA-1 ou SHA-512) mais diffĂ©rente de celle de l'algorithme Tiger qui utilise une convention dite Little endian d'ordonnancement des bits dans chaque octet.

La taille du message est codĂ©e en Little endian. Le message a maintenant une taille en bits multiple de 512, c'est-Ă -dire qu'il contient un multiple de 16 mots de 32 bits.

Constantes

MD5 utilise 64 valeurs constantes de mots de 32 bits, notés . ces nombres représentent des sinus d'entiers. Les valeurs suivantes sont exprimées en notation hexadécimale (base 16).

Ils peuvent ĂȘtre obtenus avec la formule .

0xd76aa478 0xe8c7b756 0x242070db 0xc1bdceee 0xf57c0faf 0x4787c62a 0xa8304613 0xfd469501
0x698098d8 0x8b44f7af 0xffff5bb1 0x895cd7be 0x6b901122 0xfd987193 0xa679438e 0x49b40821
0xf61e2562 0xc040b340 0x265e5a51 0xe9b6c7aa 0xd62f105d 0x02441453 0xd8a1e681 0xe7d3fbc8
0x21e1cde6 0xc33707d6 0xf4d50d87 0x455a14ed 0xa9e3e905 0xfcefa3f8 0x676f02d9 0x8d2a4c8a
0xfffa3942 0x8771f681 0x6d9d6122 0xfde5380c 0xa4beea44 0x4bdecfa9 0xf6bb4b60 0xbebfbc70
0x289b7ec6 0xeaa127fa 0xd4ef3085 0x04881d05 0xd9d4d039 0xe6db99e5 0x1fa27cf8 0xc4ac5665
0xf4292244 0x432aff97 0xab9423a7 0xfc93a039 0x655b59c3 0x8f0ccc92 0xffeff47d 0x85845dd1
0x6fa87e4f 0xfe2ce6e0 0xa3014314 0x4e0811a1 0xf7537e82 0xbd3af235 0x2ad7d2bb 0xeb86d391

Boucle principale

L'algorithme principal travaille avec un Ă©tat sur 128 bits. Il est lui-mĂȘme divisĂ© en 4 mots de 32 bits (en informatique, on utilise le terme "mot" pour dĂ©signer une valeur de 32 bits ou "word" en anglais) : A, B, C et D. Ils sont initialisĂ©s au dĂ©but avec des constantes. L'algorithme utilise ensuite les blocs provenant du message Ă  hacher, ces blocs vont modifier l'Ă©tat interne. Les opĂ©rations sur un bloc se dĂ©composent en quatre rondes (Ă©tapes), elles-mĂȘmes subdivisĂ©es en 16 opĂ©rations similaires basĂ©es sur une fonction non linĂ©aire F qui varie selon la ronde, une addition et une rotation vers la gauche. Les quatre fonctions non linĂ©aires disponibles sont :

  • ;
  • ;
  • ;
  • .

représente les opérateurs booléens XOR, ET, OU et NON, respectivement.

Pseudo-code

MD5 peut s'Ă©crire sous cette forme en pseudo-code.

//Note : Toutes les variables sont sur 32 bits
//DĂ©finir r comme suit : 
var entier[64] r, k
r[ 0..15] := {7, 12, 17, 22,  7, 12, 17, 22,  7, 12, 17, 22,  7, 12, 17, 22}
r[16..31] := {5,  9, 14, 20,  5,  9, 14, 20,  5,  9, 14, 20,  5,  9, 14, 20}
r[32..47] := {4, 11, 16, 23,  4, 11, 16, 23,  4, 11, 16, 23,  4, 11, 16, 23}
r[48..63] := {6, 10, 15, 21,  6, 10, 15, 21,  6, 10, 15, 21,  6, 10, 15, 21}
//MD5 utilise des sinus d'entiers pour ses constantes :
pour i de 0 Ă  63 faire
    k[i] := floor(abs(sin(i + 1)) × 2^32)
fin pour
//Préparation des variables :
var entier h0 := 0x67452301
var entier h1 := 0xEFCDAB89
var entier h2 := 0x98BADCFE
var entier h3 := 0x10325476
//Préparation du message (padding) :
ajouter le bit "1" au message
ajouter le bit "0" jusqu'Ă  ce que la taille du message en bits soit Ă©gale Ă  448 (mod 512)
ajouter la taille du message initial(avant le padding) codée en 64-bit little-endian au message
//DĂ©coupage en blocs de 512 bits :
pour chaque bloc de 512 bits du message
    subdiviser en 16 mots de 32 bits en little-endian w[i], 0 ≀ i ≀ 15
    //initialiser les valeurs de hachage :
    var entier a := h0
    var entier b := h1
    var entier c := h2
    var entier d := h3
    //Boucle principale :
    pour i de 0 Ă  63 faire
        si 0 ≀ i ≀ 15 alors
              f := (b et c) ou ((non b) et d)
              g := i
        sinon si 16 ≀ i ≀ 31 alors
              f := (d et b) ou ((non d) et c)
              g := (5×i + 1) mod 16
        sinon si 32 ≀ i ≀ 47 alors
              f := b xor c xor d
              g := (3×i + 5) mod 16
        sinon si 48 ≀ i ≀ 63 alors
            f := c xor (b ou (non d))
            g := (7×i) mod 16
        fin si
        var entier temp := d
        d := c
        c := b
        b := leftrotate((a + f + k[i] + w[g]), r[i]) + b
        a := temp
    fin pour
    //ajouter le résultat au bloc précédent :
    h0 := h0 + a
    h1 := h1 + b 
    h2 := h2 + c
    h3 := h3 + d
fin pour
var entier empreinte := h0 concaténer h1 concaténer h2 concaténer h3 //(en little-endian)


Notes et références

  1. Dougherty Chad R, « Vulnerability Note VU#836068 MD5 vulnerable to collision attacks », sur Vulnerability notes database, CERT Carnegie Mellon University Software Engineering Institute, (consulté le )
  2. (en) Alexander Sotirov, Marc Stevens, Jacob Appelbaum, Arjen Lenstra, David Molnar, Dag Arne Osvik, Benne de Weger, « Creating a rogue CA certificate », .
  3. Wendell Odom (trad. de l'anglais), Préparation à la certification CCNA ICND1 et CCENT : Guide de la préparation officiel DeuxiÚme édition, Paris, PEARSON, , CCIE 1624 éd., 662 p. (ISBN 978-2-7440-7285-7), chap. 9 (« Configuration des commutateurs Ethernet »), p. 265
    Ă  voir en premiĂšre ligne de la page.
  4. (en) « mozdev.org - mdhashtool: installation ».
  5. (en) « Musings on the Wang et al. MD5 Collision » [PDF].
  6. Vlastimil Klima, « Tunnels in Hash Functions: MD5 Collisions Within a Minute, Cryptology ePrint Archive Report 2006/105 », .
  7. (en) « World Fastest MD5 cracker BarsWF ».

Annexes

Articles connexes

Liens externes

Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.