Qu’est-ce que MD5 et comment est-il utilisé ?
MD5 est une ancienne fonction de hachage cryptographique qui n'est plus considérée comme sécurisée pour de nombreuses applications. Il transforme les données de n'importe quelle longueur en une sortie de longueur fixe. Cette sortie possède une gamme de propriétés utiles.
Ces propriétés rendent MD5 sûr pour l'identification des données et pour vérifier si les données ont été corrompues. Cependant, le succès des attaques contre l’algorithme MD5 fait qu’il n’est plus recommandé pour le stockage des mots de passe. Cela doit être évité dans les situations où les pirates peuvent modifier les données pour commettre des attaques, comme dans les signatures numériques et les certificats SSL.
Cet article sur MD5 se concentrera principalement sur le contexte, les problèmes de sécurité et les applications de MD5. Si vous êtes intéressé par la mécanique sous-jacente de l'algorithme et par ce qui se passe au niveau mathématique, rendez-vous sur notre L'algorithme MD5 (avec exemples) article.
L'histoire de MD5
Les premières fonctions de hachage remontent au travail de Son Peter Luhn dans les années 1950. En 1958, il fit la démonstration d'une machine appelée Key Word in Context (KWIC) lors d'une conférence internationale. Le KWIC était capable de créer automatiquement un index d'articles d'une longueur comprise entre 500 et 5 000 mots, contribuant ainsi à accélérer le processus de classification et d'organisation de l'information.
Les algorithmes de hachage ont continué à progresser dans les années qui ont suivi, mais les premiers murmures concernant les fonctions de hachage cryptographique ne sont apparus que dans les années 1970. Whitfield Diffie et Martin Hellman , les pionniers du système d'accord de clé Diffie-Hellman, ont été les premiers à identifier la nécessité d'un hachage ne fonctionnant que dans une seule direction.
Plus tard dans la décennie, un certain nombre de cryptographes ont commencé à peaufiner les détails de base des fonctions cryptographiques. Michael Rabin a proposé une conception basée sur le DE LA chiffrer par bloc. Gideon Yuval a publié un papier de 1979 appelé Comment escroquer Rabin démontré les failles du plan de Rabin et comment le Paradoxe d'anniversaire pourrait conduire à des collisions (deux entrées distinctes aboutissant à la même valeur de hachage) qui étaient initialement imprévues.
Ralph Merkle a poussé le développement plus loin en proposant des exigences pour les fonctions de hachage résistantes aux collisions. Il a également décrit la construction Merkle-Damgard, qui permet de créer des fonctions de hachage résistantes aux collisions. Cette construction a ensuite été utilisée dans la construction de MD5 et de ses itérations antérieures, ainsi que dans la famille de fonctions de hachage SHA actuellement utilisée. L’idée de résistance aux collisions a été formalisée par Damgard en 1987.
Tous ces développements ont fini par a conduit à la famille Message Digest (MD) de fonctions de hachage cryptographique , développé par Ron Rivest, également réputé pour avoir fourni le R dans l'algorithme de chiffrement RSA.
Les débuts de la famille Message Digest sont un peu mystérieux car il n’existe pas de MD1 publiquement connu, ni beaucoup d’informations sur pourquoi. L'explication la plus probable vient du thèse de Bart Preneel , un cryptographe flamand. En tant qu’initié de l’industrie, il disposait peut-être d’informations qui n’ont pas été publiées ailleurs. Preneel a écrit :
Rivest de RSA Data Security Inc. a conçu une série de fonctions de hachage, nommées MD pour « message résumé » suivi d'un numéro. MD1 est un algorithme propriétaire.
Cela implique que la toute première version a été conçue pour le propre usage d’une organisation et n’a pas été rendue publique. Rivest a développé MD2 en 1989, mais d'autres cryptographes ont découvert des collisions peu de temps après. MD3 n’est pas non plus entré dans le domaine public. Dans la section 18.10 du livre de Bruce SchneierCryptographie appliquéeil précise que :
MD3 est encore une autre fonction de hachage conçue par Ron Rivest. Il présentait plusieurs défauts et n’est jamais vraiment sorti du laboratoire…
Cela a été suivi en 1990 par celui de Rivest. MD4 . Les attaques contre la fonction de hachage ont été découvertes relativement rapidement, ce qui a conduit au développement de MD5 en 1991. MD5 a été utilisé pendant une grande partie des années 90 et au début des années 2000, mais au fil du temps, les attaques contre cette fonction sont devenues de plus en plus graves.
Les faiblesses de MD5 ont conduit les cryptographes à recommander SHA-1 à la place. SHA-1 s’est également révélé peu sûr au fil du temps. De nos jours, nous utilisons principalement SHA-2, bien qu’il existe également SHA-3. MD5 est toujours utilisé à certaines fins, mais il est fortement déconseillé dans les situations où la sécurité est requise.
Que sont les fonctions de hachage ?
Avant d’entrer dans les détails de MD5, il est important d’avoir une solide compréhension de ce qu’est une fonction de hachage.
Les fonctions de hachage prennent des données de n'importe quelle taille et les transforment en une valeur de taille fixe, appelée hachage. Certaines personnes les appellent des résumés, des valeurs de hachage ou des codes de hachage, mais ce ne sont que des synonymes. Ces hachages sont mappés dans une table de hachage qui classe les données, comme dans l'image ci-dessous. Des fonctions de hachage simples sont généralement utilisées pour le stockage et la récupération de données.
Table de hachage de Jorge Stolfi sous licence CC0
Nous prendrons une fonction de hachage très simple et l'expliquerons à travers un exemple. Bien que les fonctions de hachage puissent être utilisées pour mapper tout type de données, y compris des lettres comme dans l'image ci-dessus, nous nous en tiendrons aux chiffres pour simplifier les choses.
Disons que nous avons dix nombres que nous voulons hacher :
- 76 541
- 884
- 9 826
- 22
- 474
- 19 465
- 56 490
- 25 738
- 64 829
- 7 432
Vous pouvez jouer à la maison avec ça outil de visualisation de hachage . Vers le bas, vous verrezChoisissez la fonction de hachage,Politique de résolution des collisionsetTaille du tableau. Sélectionner Hachage de mod simple , Sondage linéaire , et dix , respectivement.
Entrez chaque numéro dans l'ordre en cliquant sur Suivant lorsque vous y êtes invité. Après avoir saisi le premier numéro, les éléments suivants vous seront présentés :
Position de hachage = Valeur d'entrée % Taille de la table
Position de hachage = 76541 % 10 = 1
Tentative d'insertion de 76541 à la position 1.
Insérer 76541 en position 1.
La première ligne, « Position de hachage = Valeur d'entrée % Taille de la table », présente simplement la formule de la fonction de hachage modulo simple. Cette opération s’écrit aussi souvent sous la formeh(k) =kcontrem, où:
- h (k)– La position de hachage pour l’entréek.
- k- L'entrée.
- mod – Une opération modulo. Ces opérations consistent à diviser le premier nombre par le second. Cependant, la réponse n’est pas le résultat auquel on s’attendrait normalement. La réponse est quel que soit le reste entier du nombre. A titre d'exemple, 13 mod 4 n'est pas égal à 2,6. Au lieu de cela, cela est égal à 3. En effet, 5 rentre deux fois dans 13, avec un reste de 3, notre réponse. Dans notre exemple, le module (le diviseur, et non le nombre divisé par) est leTaille du tableau, qui était de 10. Cela rend tous les calculs relativement simples. Lorsque le module est égal à 10, le reste de l'opération modulo sera toujours quel que soit le chiffre le plus à droite. Les résultats des opérations modulo sont moins prévisibles lorsque d'autres nombres font office de module. Le signe de l’opération modulo s’écrit souvent sous la forme contre , mais parfois le symbole % est utilisé à la place.
- m– La taille de la table de hachage. Dans ce cas, il s’agit de 10.
Par conséquent, la formule pour la position de hachage de notre premier nombre, 76 541, est :
- h(76,541) = 76,541 contre 10
Vous pouvez le faire manuellement si vous le souhaitez, ou saisir les deux entrées dans ce champ. module de calcul . Si vous le faites, la réponse que vous obtenez est 1, ce qui correspond à ce que notre fonction de hachage nous a dit ci-dessus (76541 % 10 = 1).
Si nous revenons aux quatre lignes que l'outil de visualisation de hachage nous a fournies, vous verrez que la troisième ligne dit :
Tentative d'insertion de 76541 à la position 1.
Suivi de la quatrième ligne, qui dit :
Insérer 76541 en position 1.
La raison en est que cette opération modulo ne peut nous donner que dix résultats distincts, et avec dix nombres aléatoires, rien n’empêche que certains de ces résultats soient le même nombre. Si nous essayons de créer une table de hachage dans laquelle chacune de ces dix entrées est mappée sur son propre espace dans la table, nous rencontrerons des problèmes si l'une d'entre elles donne le même résultat.
C'est pourquoi notre outil de hachage indique qu'il « tente d'insérer 76541 à la position 1 ». Il ne peut pas mettre un nombre dans la table de hachage s'il y a déjà un autre nombre à cette position. Cependant, comme il s’agit du premier calcul, il n’y a pas encore d’autres nombres dans le tableau, donc la position 1 est libre. Par conséquent, il peut insérer avec succès « 76541 en position 1 ».
Si vous saisissez les prochains nombres de notre liste, vous remarquerez que l'outil de hachage exécute l'opération de hachage de la même manière que ci-dessus :
Position de hachage = 884 % 10 = 4
Tentative d'insertion de 884 en position 4.
Insérer 884 en position 4.
Position de hachage = 9826 % 10 = 6
Tentative d'insertion de 9826 en position 6.
Insérer 9826 en position 6.
Position de hachage = 22 % 10 = 2
Tentative d'insertion de 22 à la position 2.
Insérer 22 en position 2.
Ce n'est qu'à la cinquième entrée, 474, que l'on remarque quelque chose de différent :
Position de hachage = 474 % 10 = 4
Tentative d'insertion de 474 en position 4.
Tentative d'insertion de 474 en position 5.
Insérer 474 en position 5.
La première ligne nous dit queh(474) = 4. Vous pouvez vérifier cela vous-même en saisissant 474 contre 10 dans le calculateur modulo lié ci-dessus. La réponse est certainement 4, mais la position de hachage de 4 est déjà occupée par le résultat de notre deuxième calcul de hachage :
h(884) = 884 % 10 = 4
Parce que la position est déjà occupée, vous remarquerez que l'outil de hachage dit :
Tentative d'insertion de 474 à poste 4 .
Tentative d'insertion de 474 à poste 5 .
Insérer 474 en position 5.
Il s'agit essentiellement de l'outil de hachage qui nous indique qu'il a essayé de mettreh(474) en position 4, mais il était plein. Pour cette raison, il a décidé d’essayer de le mettre en position 5 à la place. La position 5 était vide, donc 474 ont été placés en position 5 de la table de hachage.
L'outil de hachage décide cela en fonction de sondage linéaire , que nous avons choisi commePolitique de résolution des collisionslorsque nous avons configuré pour la première fois les paramètres de cette table de hachage. Une politique de résolution de collision est exactement ce à quoi elle ressemble : un ensemble de procédures que l'outil de hachage doit suivre en cas de collision, ce qui signifie essentiellement lorsque deux entrées distinctes ont la même position de hachage.
Notre sélection, le sondage linéaire, résout les collisions en recherchant le prochain emplacement libre dans la table de hachage. L'outil de hachage a tenté de placer 474 à la position 4, mais il y a eu une collision. L'outil a donc suivi la politique de résolution de collision du sondage linéaire et a essayé d'insérer 474 dans l'emplacement suivant, la position 5. La position 5 était vide, donc 474 était finalement placé en position 5, même si h (474) = 4 .
Remplir le reste de la table de hachage
Si vous continuez à insérer le reste des dix entrées dans notre outil de hachage, vous remarquerez quelques collisions supplémentaires, notamment pour le numéro 19 465, oùh(19 465) = 5. La position 5 est déjà occupée, tout comme la position 6, donc 19 465 est finalement placé en position 7, malgréh(19 465) = 5.
Notre table de hachage finale ressemble finalement à :
- Position 0 – 56 490
- Poste 1 – 76 541
- Positions 2 à 22
- Poste 3 – 7 432
- Poste 4 – 884
- Poste 5 – 474
- Position 6 – 9 826
- Position 7 – 19 465
- Position 8 – 25 738
- Position 9 – 64 829
Les positions de hachage sont sensiblement différentes de notre ordre initial de :
- 76 541
- 884
- 9 826
- 22
- 474
- 19 465
- 56 490
- 25 738
- 64 829
- 7 432
Vous pouvez regarder ce qui précède et voir tout cela comme une sorte d’effort inutile. Cependant, nous avons réussi à mapper chacune de nos valeurs arbitraires (allant de 22 à 76 541) à des positions fixes dans la table de hachage (allant de 0 à 9).
Ceci est extrêmement utile en termes de stockage et de récupération de données, car la table de hachage n'occupe qu'un peu plus d'espace de stockage que les valeurs elles-mêmes. Il permet également un accès dans un délai court et relativement constant, par rapport à certaines alternatives de stockage et de récupération.
Ce qui précède n’est qu’un aperçu du fonctionnement de ces fonctions de hachage, servant de tremplin pour comprendre le fonctionnement des fonctions de hachage cryptographique. Ce publication du Virginia Polytechnic Institute et de l'Université d'État donne une description plus détaillée si vous souhaitez en savoir plus sur le hachage et la récupération de données.
Que sont les fonctions de hachage cryptographique ?
MD5 est une fonction de hachage cryptographique, ce qui signifie qu'il s'agit d'un type spécifique de fonction de hachage qui possède certaines des mêmes fonctionnalités que celle décrite ci-dessus. Les fonctions de hachage normales et les fonctions de hachage cryptographique mappent toutes deux des données de taille arbitraire en valeurs de taille fixe, tout comme la façon dont 25 738 a été mappé à la position 8. Tout comme avec les fonctions de hachage normales, les valeurs de taille fixe résultant des fonctions de hachage cryptographique sont également appelées hachages, résumés, valeurs de hachage ou codes de hachage.
Cependant, les fonctions de hachage cryptographique ont un certain nombre d'exigences supplémentaires :
- Ce sont des fonctions à sens unique – ce qui signifie qu’il est impossible d’utiliser la valeur de hachage pour déterminer quelle était l’entrée d’origine (avec la technologie et les techniques actuelles). Lorsqu’une fonction de hachage cryptographique sécurisée est utilisée, il est impossible de prendre le hachage résultant et de déduire d’une manière ou d’une autre quelle a dû être l’entrée.
- Ils sont déterministes : la même entrée initiale produira toujours la même valeur de hachage lorsqu'elle sera soumise à la même fonction de hachage. Quand on met « Ils sont déterministes » dans ce Générateur de hachage MD5 , cela nous donne un hachage de 23db6982caef9e9152f1a5b2589e6ca3 A chaque fois.
- De petits changements dans l'entrée donnent des valeurs de hachage radicalement différentes – Un petit changement dans l'entrée modifie la valeur de hachage résultante de manière si significative qu'il ne semble plus y avoir de corrélation entre les deux. Si nous changeons seulement la dernière lettre de l’entrée précédente d’un « c » à un « d », notre entrée est toujours très similaire. C'est maintenant 'Ils sont déterministes d ». Cependant, lorsque nous le mettons dans le même générateur qu'avant, cela nous donne une valeur de hachage complètement différente, 6b590a88650e7c5ee94fc8bda8e02000 .
- Il est impossible que deux entrées distinctes aboutissent à la même valeur de hachage – Les algorithmes de hachage cryptographique sécurisé sont conçus de telle manière qu'il est impossible que différentes entrées renvoient la même valeur. Nous voulons nous assurer qu'il est presque impossible qu'il y ait une valeur de hachage partagée entre « Ils sont déterministes », « kjahgsdkjhashlkl », « Il était une fois… » et l'une des nombreuses autres entrées possibles. Bien sûr, il y a des limites à cela. Avec une infinité d’entrées possibles, nous aurions besoin d’une table de hachage capable de stocker une infinité de hachages pour éviter les collisions. Cela ne serait pas pratique, alors nous nous contentons d’un compromis où il est extrêmement improbable qu’il y ait une collision. Nous y parvenons en créant des hachages incroyablement grands.
- Ils sont rapides à calculer.
Qu’est-ce que MD5 ?
Jusqu’à présent, nous savons que MD5 est un type de fonction de hachage, plus précisément une fonction de hachage cryptographique. Il possède un certain nombre de propriétés apparemment étranges qui lui confèrent diverses utilisations. Cependant, en raison de ses faiblesses, il n'est plus considéré comme sûr pour certaines de ces utilisations.
Mais en quoi consiste réellement la fonction de hachage MD5 ?
MD5 est une fonction de hachage qui produit un hachage de 128 bits. Cela signifie que quelle que soit son entrée, la sortie est un hachage de 32 caractères de longueur fixe, comme ceci :
23db6982caef9e9152f1a5b2589e6ca3
Hachages MD5 et hexadécimal
Vous verrez normalement les hachages MD5 écrits en hexadécimal (16), qui est un système numérique alternatif. Dans la vie de tous les jours, on utilise le système décimal qui compte de zéro à neuf avant de revenir à nouveau à zéro, cette fois avec un un devant pour indiquer qu'il s'agit du deuxième versement de un à neuf (10-19).
En revanche, les nombres hexadécimaux comptent de un à 16 avant de recommencer. Puisque nous n'avons pas seize nombres différents à un chiffre (nous n'avons que de zéro à neuf, 10 est deux chiffres), nous ajoutons les lettres a, b, c, d, e et f pour représenter 10, 11, 12, 13, 14 et 15 respectivement. Cela signifie que 16 en décimal peut également être représenté par 10 en hexadécimal.
Si vous souhaitez convertir le hachage de la section précédente dans le système de nombres décimaux que nous connaissons tous, vous devrez commencer par le côté droit et multiplier le nombre par seize à la puissance zéro. Le nombre le plus à droite était un trois, donc :
3x160 = 3x1 = 3
Nous passerions alors au nombre suivant, « a », qui n’est en réalité que 10 en hexadécimal. Cette fois, on le multiplie par 16 à la puissance un :
10x161 = 10x16 = 160
En déplaçant d'un espace vers la gauche, nous avons le nombre « c », qui n'est en réalité que 12 en hexadécimal. Puisqu’il s’agit du troisième chiffre en partant de la droite, cette fois on le multiplie par 16 puissance deux.
12x162 = 12x256 = 3072
Nous continuons à nous déplacer d'un espace vers la gauche après chaque opération, en effectuant le même calcul, mais en augmentant l'exposant (le nombre en exposant) de un à chaque fois. Une fois que nous avons effectué l’opération pour chacun des chiffres, nous additionnons tous les résultats, ce qui nous donne l’équivalent décimal du nombre hexadécimal.
Pour gagner du temps, nous utiliserons un convertisseur hexadécimal en décimal faire le travail pour nous. Lorsque nous entrons dans notre hachage hexadécimal, nous constatons que :
23db6982caef9e9152f1a5b2589e6ca3
Est la version hexadécimale de :
47 662 232 879 966 347 151 498 352 140 906 032 291
Le les raisons Les raisons pour lesquelles les hachages MD5 sont généralement écrits en hexadécimal dépassent le cadre de l'article, mais au moins vous comprenez maintenant que les lettres représentent en réalité simplement un système de comptage différent.
Le hachage de 128 bits ne comporte que 32 caractères, car chaque caractère occupe quatre bits d'information, et 128 divisé par quatre est égal à 32. En d'autres termes, chaque octet d'information (un octet équivaut à huit bits) peut représenter deux bits hexadécimaux. personnages.
L'algorithme MD5
Comment la fonction de hachage MD5 transforme-t-elle une phrase telle que « Ils sont déterministes » en :
23db6982caef9e9152f1a5b2589e6ca3
Comment peut-il accepter des entrées de n'importe quelle longueur et toujours générer un hachage de 128 bits ?
Comment peut-il garantir qu’il est impossible qu’une autre entrée ait la même sortie (MD5 ne le fait plus car il n’est pas sécurisé, mais le mécanisme sous-jacent est toujours pertinent) ?
Si vous souhaitez approfondir chaque étape de la façon dont MD5 transforme une entrée en un hachage fixe de 128 bits, consultez notre article L'algorithme MD5 (avec exemples). Il explore les mécanismes de ce qui se passe et les nombreux processus impliqués dans la modification de l'entrée dans le hachage. Tout se passe en un instant, mais il y a beaucoup de calculs à faire sous le capot de la fonction de hachage MD5.
Dans cette section, nous éviterons d’entrer dans les détails et aborderons plutôt les aspects de MD5 qui composent sa construction en tant qu’algorithme de hachage cryptographique.
MD5 utilise une fonction de compression unidirectionnelle, qui est un type de fonction cryptographique qui n'est pas liée aux algorithmes de compression de données que vous connaissez peut-être mieux (par exemple, ceux utilisés pour réduire la taille des fichiers vidéo et audio).
Ces les fonctions de compression unidirectionnelle prennent deux entrées de longueur fixe et les transforment en une seule sortie de même longueur fixe . A titre d'exemple, deux entrées de 128 bits mèneraient à une seule sortie de 128 bits.
Si vous y avez prêté attention, vous avez peut-être réalisé que cela va à l’encontre de l’une des principales exigences d’une fonction de hachage cryptographique, à savoir ils peuvent prendre des entrées de n'importe quelle longueur et génère toujours un hachage de taille fixe.
Les fonctions de compression unidirectionnelle ne peuvent pas gérer les entrées variables, donc MD5 contourne ce problème en complétant ses données, pour s'assurer qu'elles sont toujours traitées dans des blocs de données de 512 bits. Lorsque l’entrée est supérieure à 512 bits, elle utilise simplement plusieurs blocs, complétant le bloc final avec des données supplémentaires pour s’assurer qu’il est également de 512 bits.
Fonctions de hachage cryptographique résistantes aux collisions
Une collision se produit lorsque deux entrées différentes aboutissent au même hachage. La résistance aux collisions est extrêmement importante pour qu’une fonction de hachage cryptographique reste sécurisée. Une fonction de hachage résistante aux collisions est conçue de telle manière qu'il est impossible que le hachage d'une entrée soit le même que celui d'une autre entrée. Lorsqu’il est pratique pour les attaquants de produire deux hachages identiques à partir de deux entrées distinctes, cela compromet la sécurité de la fonction de hachage cryptographique.
Pour que ces soi-disant attaques par collision fonctionnent, un attaquant doit être capable de manipuler deux entrées distinctes dans l'espoir de finalement trouver deux combinaisons distinctes ayant un hachage correspondant . Cela contraste avec un préimage attaque, où un attaquant doit trouver une entrée qui correspond à une valeur de hachage spécifique.
Les attaques par collision constituent une menace importante dans le monde de la cybersécurité. Nous allons passer en revue un exemple pour illustrer comment deux hachages correspondants pour des entrées distinctes pourraient être problématiques dans le monde réel.
Disons que Employé maléfique travaille à Entreprise A est chargé de créer un Facture de 1 000 000 $ envoyer à Entreprise B . Evil Employee propose un stratagème pour rendre légitime une version de la facture, une facture qui dit essentiellement : « L'entreprise B doit payer à l'entreprise A 1 000 000 $ ». Evil Employee crée ensuite une autre version malveillante qui dit : « L'entreprise B doit payer 1 000 000 $ à Evil Employee ».
Evil Employee joue avec les deux contrats, changeant le libellé, les polices, l'espacement et tout le reste. Ils passent par d'innombrables combinaisons de la version légitime et de la version maléfique, jusqu'à ce qu'ils tombent finalement sur des versions des deux qui ont le même résultat lorsqu'elles sont poussées via une fonction de hachage.
Evil Employee montre ensuite la facture légitime à son patron. Le patron le signe avec son signature numérique pour prouver que la facture a été autorisée. Evil Employee change ensuite les factures et envoie la facture malveillante à l'entreprise B, accompagnée de la signature numérique du patron qui a été créée pour la facture légitime.
Étant donné que les hachages du document légitime et du document malveillant sont les mêmes (ils entrent en collision), lorsque l'entreprise B vérifie la signature numérique, elle ne saura jamais que le changement a eu lieu. Evil Employee se retrouvera avec un joli million de dollars sur son compte bancaire et se trouvera déjà dans un autre pays avant que quiconque ne comprenne ce qui s'est passé.
Les hachages constituent un élément essentiel du processus de vérification des signatures numériques qui sous-tend une grande partie de notre sécurité en ligne. Lorsqu’une fonction de hachage cryptographique n’est pas résistante aux collisions, elle permet aux criminels de commettre un large éventail de stratagèmes frauduleux qui portent atteinte au système de signature numérique.
Construction Merkle Damgard
Comme nous l'avons indiqué, la fonction de hachage MD5 implique des fonctions de compression unidirectionnelle.
Plus précisément, la fonction de hachage MD5 propose des fonctions de compression unidirectionnelle avec la construction Merkle-Damgard. Il s’agit d’une technique de conception qui vise à transformer les fonctions de compression résistantes aux collisions en fonctions de hachage cryptographique résistantes aux collisions.
La construction de Merkle-Damgard repose sur la preuve formelle que si la fonction de compression unidirectionnelle est résistante aux collisions, la fonction de hachage qui l'utilise l'est aussi. Le but de la construction Merkle-Damgard est en réalité simplement d'étendre une fonction de compression résistante aux collisions et de la rendre capable de prendre des entrées de longueur variable, plutôt que les entrées de taille fixe qu'elles gèrent normalement.
Cet élément de la conception de MD5 est l’un des composants clés pour transformer une fonction de compression en une fonction de hachage cryptographique pouvant accepter n’importe quelle entrée, mais renvoyant toujours une sortie de longueur fixe.
Hachage Merkle Damgard par David Gothberg sous licence CC0
Si vous vous familiarisez avec les détails de l'article sur l'algorithme MD5 (avec exemples), vous verrez que l'algorithme MD5 est structuré avec une construction Merkle-Damgard similaire à celle présentée dans l'image ci-dessus. L'algorithme MD5 divise l'entrée initiale en blocs de taille fixe, traitant chacun d'eux via la fonction de compression parallèlement à la sortie du tour précédent.
Cette propriété de la construction Merkle-Damgard était un aspect important de ce qui a permis de sécuriser la fonction de hachage MD5 dans le passé.
Faiblesses de sécurité de MD5
Comme nous l'avons mentionné, MD5 n'est plus considéré comme une fonction de hachage sécurisée. Ses problèmes de sécurité ont commencé dans les années 90, peu de temps après sa première publication. Même si cela n’a pas porté un coup fatal à la sécurité de MD5, Bert den Boer et Antoon Bosselars a publié un article en 1993, qui critiquait les modifications apportées lors de la mise à niveau de MD4 vers MD5. Bosselars et den Boer ont découvert que ils pourraient créer des collisions pour la fonction de compression MD5 dans MD5 , mais pas pour la fonction MD5 dans son ensemble.
Ces collisions ont été appelées pseudo-collisions dans un papier publié par Hans Dobbertin en 1996. L’article de Dobbertin traitait d’une faille plus grave dans MD5. Si un attaquant était capable de choisir une valeur de départ initiale pour le tampon plutôt que celle donnée par l'algorithme, et était également capable de choisir deux entrées de message très similaires mais légèrement différentes, alors l'attaquant peut être capable de produire le même hachage pour les deux entrées .
L’article de Dobbertin a montré une collision plus inquiétante que la pseudo-collision documentée par Bosselars et den Boer, mais encore une fois, elle n’a pas brisé la fonction globale du MD5. Une fois de plus, il s'agissait d'une collision sur la fonction de compression plutôt que sur la fonction MD5 globale. Bien qu’il s’agisse d’un autre signe inquiétant, la fonction de hachage MD5 était encore considérée comme sécurisée à ce stade.
La menace croissante de Collision MD5
Les chercheurs en sécurité commençaient à se méfier de la fonction de hachage MD5, mais elle restait largement utilisée. Ce n’est qu’en 2004 que les chercheurs ont publié une collision plus grave. Article de Xiaoyun Wang et Hongbo Yu Comment casser MD5 et autres fonctions de hachage a présenté une méthode pour rechercher des collisions dans la fonction de hachage MD5 en une heure.
La technique des chercheurs consistait à trouver une paire d’entrées de message ayant des relations mathématiques spécifiques entre elles. En utilisant ce qui était à l’époque un serveur haut de gamme, ils ont pu détecter de telles collisions en 15 minutes seulement. Cette attaque a été la première à montrer que les collisions de la fonction de hachage MD5 dans son ensemble étaient réalisables.
Il a été suivi en 2005 par un article démontrant une collision en termes plus pratiques. Dans Certificats X.509 en collision , Arhen Lenstra, Xiaoyun Wang et Benne de Weger ont montré que les collisions MD5 pouvaient conduire à deux certificats X.509 distincts avec la même signature numérique.
La sécurité d'Internet repose sur la confiance dans l'infrastructure à clé publique, dont ces certificats constituent un élément essentiel. Les collisions MD5 ont permis à deux certificats X.509 distincts d'avoir tous deux la même signature de l'émetteur.
Ces certificats sont essentiels dans l’écosystème de sécurité, car ils relient l’identité d’une entité et sa clé secrète. Si deux certificats peuvent avoir la même signature, alors il peut être impossible de savoir lequel est le véritable propriétaire de la clé secrète. Cela constitue une menace énorme pour la sécurité de notre monde en ligne.
Quelques jours plus tard, les choses ont commencé à s’aggraver encore pour MD5. Vlastimil Klima a publié un article détaillant une méthode de découverte du premier bloc qui était censée être 1 000 à 2 000 fois plus rapide que celle développée par Wang et al. Alors que l'équipe de Wang et al. pouvait trouver le deuxième bloc beaucoup plus rapidement, Klima a estimé que la nouvelle méthode était globalement trois à six fois plus rapide. L’article de Klima indique que la première collision pourrait avoir lieu en huit heures sur un modeste ordinateur portable cadencé à 1,6 GHz.
Cette attaque était encore plus inquiétante, car non seulement elle pouvait être utilisée pour falsifier des signatures numériques, mais elle montrait que l’attaque était à la portée du pirate informatique ordinaire.
MD5 est cassé
Fin 2005, même le créateur de MD5 Ron Rivest déclarait que la fonction de hachage était « clairement cassée ».
En 2009, une attaque pré-image a été proposée par Yu Sasaki et Kazumaro Aoki . Cependant, cette attaque a une complexité de 2123,4, ce qui est loin d’être réalisable. Aucune attaque pratique de pré-image contre MD5 n'a encore été découverte.
En 2010, les chercheurs Tai Xie et Dengguo Feng publié une collision avec un seul bloc. Avant cet article, seules des collisions multiblocs avaient été trouvées. Xie et Feng ont trouvé deux entrées de message distinctes qui donnaient la même valeur de hachage. Cependant, ils n’ont pas publié les détails de leur technique, affirmant qu’ils les avaient cachés pour des raisons de sécurité. Une autre collision d'un seul bloc a eu lieu trouvé par Marc Stevens en 2012.
Alors que MD5 était considéré comme de plus en plus dangereux après chaque publication, ce n'est qu'en 2011 que l'Internet Engineering Task Force (IETF) a publié un rapport. nouvelle RFC conseillant des considérations de sécurité mises à jour. La RFC a estimé que MD5 n'était plus acceptable dans les situations où une résistance aux collisions était requise, comme pour les signatures numériques. Cependant, il autorisait toujours MD5 pour les codes d'authentification de message basés sur le hachage (HMAC).
Malgré les problèmes de sécurité connus de MD5, la fonction de hachage était toujours largement mis en œuvre depuis plusieurs années après la mise à jour.
Les candidatures de MD5
Les fonctions de hachage cryptographique comme MD5 sont courantes en cybersécurité. Ils sont principalement utilisés dans divers types d’authentification et dans les signatures numériques.
Plus tôt dans l’article, nous avons répertorié les nombreuses propriétés étranges des fonctions de hachage cryptographique. Ces exigences (telles que la nécessité d’être des fonctions déterministes à sens unique) n’étaient pas une sorte d’exercice intellectuel inutile. Au lieu de cela, ces aspects ont été choisis car ils rendent les fonctions de hachage cryptographique utiles.
Commençons par discuter d’une application courante mais controversée de MD5, le stockage et la vérification des mots de passe.
Fonctions de hachage cryptographique et vérification du mot de passe
Avant de discuter de la manière dont MD5 est utilisé dans le processus de vérification des mots de passe, revenons un peu en arrière et examinons le système dans son ensemble.
Vous disposez de dizaines de comptes en ligne différents (avec, espérons-le, des mots de passe forts et uniques pour chacun). Lorsque vous créez chaque compte ou modifiez votre mot de passe, vous pouvez supposer que le site Web stocke votre mot de passe quelque part. Sinon, comment le site Web pourrait-il vérifier que le mot de passe que vous avez saisi était correct ?
Supposons un instant qu'il stocke votre mot de passe. Que se passerait-il si un attaquant pénétrait dans les systèmes du site Web et volait la base de données de mots de passe ? Le compte de chaque utilisateur serait compromis, et les utilisateurs qui utilisent le même mot de passe pour chacun de leurs comptes seraient vulnérables sur chaque site auquel ils se connectent (c'est pourquoi les mots de passe doivent être uniques).
Le risque de catastrophe dû aux violations de données fait que le stockage des mots de passe est une mauvaise idée, quelle que soit la qualité de la sécurité d'un site Web. Heureusement, les fonctions de hachage cryptographique nous offrent une bien meilleure option et, espérons-le, tous vos comptes en ligne les utilisent réellement.
Au lieu de stocker directement votre mot de passe, les sites Web peuvent configurer leurs champs de saisie de mot de passe pour le hacher immédiatement et ne stocker que ce hachage . Chaque fois qu'un utilisateur se connecte, le mot de passe qu'il saisit est immédiatement haché (encore une fois, jamais stocké).
Ce hachage est ensuite comparé au hachage du mot de passe que le site Web a stocké dans sa base de données. Si les deux hachages correspondent, le site Web sait que le mot de passe correct a été saisi et accorde l'accès à l'utilisateur.
La beauté de ce système est que le site n’a jamais besoin de conserver une copie des mots de passe des utilisateurs, les seules choses qu’il doit stocker sont les hachages. Si tel est le cas, lorsqu’un pirate informatique s’introduit dans le système et vole les bases de données de mots de passe, la situation est loin d’être aussi grave. En effet, les hachages sont des fonctions à sens unique et il n'est pas pratique de les inverser pour comprendre l'entrée.
Il existe un certain nombre de mises en garde concernant le point ci-dessus, notamment le fait qu'un algorithme de hachage cryptographique sécurisé a été utilisé, ainsi que le salage, etc. Ces mises en garde sont beaucoup plus strictes pour MD5, car il n'est pas considéré comme sécurisé en tant qu'algorithme de hachage autonome. pour les mots de passe. Nous en discuterons plus en détail plus tard.
Montrons comment fonctionne le concept global en disant que votre mot de passe est « 8Dnhf(3g&n2Jb5V!2G8Na^ ». Ceci calculateur de hachage peut jouer le rôle du site Web qui hache et stocke votre mot de passe. Lorsque vous saisissez un nouveau mot de passe pour la première fois, le site Web le convertit immédiatement en hachage et le stocke :
80ddfe44955c5e3da8b2292463682f28
Le site Web ne stocke jamais votre mot de passe. Chaque fois que vous vous connectez, vous saisissez votre saisie dans le champ et le site la hache immédiatement. Il compare ce hachage à celui qu'il a stocké sur ses serveurs. Si les deux correspondent, il vous donne accès à ses systèmes. Encore une fois, le mot de passe lui-même n'est jamais stocké.
Si le site Web dispose des systèmes appropriés pour traiter et stocker ces hachages de mots de passe, peu importe si un attaquant (encore une fois, avec des mises en garde) vole la base de données. L’attaquant peut faire autant d’efforts qu’il le souhaite, mais il ne sera pas en mesure de trouver un mot de passe suffisamment fort à partir de son hachage (mises en garde).
Ils peuvent essayer de le saisir comme entrée dans un calculateur de hachage, mais cela ne fonctionnera pas, car les fonctions de hachage cryptographique sont des fonctions à sens unique. Ils peuvent effectuer des recherches partout sur Internet et essayer toutes les techniques qu’ils trouvent, mais ils reviendront sans rien (mises en garde).
MD5 et vérification du mot de passe
MD5 est toujours utilisé pour magasin mots de passe utilisateur . Comme nous l'avons mentionné, MD5 est désormais considéré comme extrêmement peu sûr, en particulier pour les applications nécessitant une résistance aux collisions. Mais qu’est-ce que cela signifie dans le contexte du hachage de mots de passe ?
Le fait que MD5 soit vulnérable aux collisions n’a pas vraiment d’impact sur sa sécurité dans le contexte du hachage de mot de passe. En effet, un attaquant ne peut manipuler qu'une des entrées lorsqu'il tente de trouver un hachage de mot de passe correspondant. L'autre entrée a déjà été sélectionnée par l'utilisateur (se référer au Fonctions de hachage cryptographique résistantes aux collisions section pour plus de précisions sur les raisons pour lesquelles les attaques par collision sont adaptées à d'autres scénarios).
En matière de hachage de mot de passe, il est plus important que la fonction de hachage soit résistante aux pré-images, ce que MD5 est toujours . Cependant, il existe d'autres facteurs qui rendent MD5 impropre au hachage de mot de passe. L'algorithme est trop rapide et manque de sel par défaut, ce qui permet aux attaquants de deviner rapidement des millions, voire des milliards de mots de passe.
La vitesse de l'algorithme et l'absence de sel signifient que les mots de passe courts et simples qui ont été hachés avec la fonction de hachage MD5 sont vulnérables aux attaques de table arc-en-ciel . Ils sont également vulnérables aux attaques par force brute. Si un attaquant parvient à voler une base de données de mots de passe hachés avec MD5, la vitesse de MD5 lui permet de deviner rapidement les mots de passe qui correspondent aux hachages de la base de données.
Étant donné que de nombreuses personnes utilisent encore des mots de passe courts ou courants, les hachages de mots de passe MD5 ne prendront peut-être pas autant de temps à deviner. Cela présente un risque grave pour de nombreux utilisateurs, comme en témoigne Craquage du mot de passe de CynoSure Prime à la suite de la fuite de données d'Ashley Madison. Le groupe a pu découvrir des millions de mots de passe en quelques heures seulement , car les mots de passe et noms d'utilisateur ont été hachés avec MD5.
Les hachages MD5 peuvent être sécurisés si un utilisateur dispose d'un mot de passe incroyablement long et fort. Ils peuvent également être sécurisés lors du salage et étirement des touches sont utilisés à côté. Cependant, il est beaucoup plus facile et moins sujet aux erreurs fatales si les développeurs hachent leurs mots de passe avec une option sécurisée par défaut, comme bcrypt, Argon2 ou scrypt. En raison de ces problèmes, l'Institut national des normes et de la technologie ne recommande plus MD5 pour le hachage de mot de passe.
Verification des données
MD5 a également des applications dans la vérification des données, mais avant de discuter de ses mérites, il est important de comprendre les différents types de vérification des données. Un type de vérification des données implique vérifier l'intégrité des données pour déterminer s'il a été accidentellement corrompu. Par corrompu, nous parlons de savoir si les données ont été modifiées involontairement, introduisant des erreurs. Cela peut se produire de plusieurs manières innocentes, notamment :
- Bogues dans le logiciel.
- Erreurs de transmission de données.
- Problèmes avec le support de stockage.
- Erreurs d'écriture survenues lors du déplacement ou de la copie des fichiers.
Si les données sont corrompues, elles risquent de ne plus fonctionner comme prévu. Les utilisateurs peuvent recevoir une erreur lorsqu'ils tentent d'y accéder, ou des parties des informations peuvent avoir été perdues.
Dans de nombreuses situations, nous devons également être capables de vérifier l'authenticité des données . Nous entendons par là que nous devons vérifier que les données n’ont pas été secrètement modifiées pendant leur stockage ou leur transit. À titre d’exemple, les pirates informatiques modifient souvent les données pour introduire des logiciels malveillants, puis tentent de les faire passer pour l’original inoffensif. Des personnes involontaires peuvent le télécharger, pensant que c’est quelque chose d’inoffensif, puis finir par devoir combattre un virus secrètement caché à l’intérieur.
La vérification de l’intégrité et la vérification de l’authenticité ont toutes deux leur rôle. Les utilisateurs voudront peut-être rechercher des fichiers corrompus dans leur système pour s’assurer qu’ils n’ont perdu aucune donnée. Dans ce cas, ils voudraient vérifier l’intégrité d’un fichier. En revanche, lors du téléchargement d’un programme sur Internet, il est conseillé de vérifier l’authenticité des données pour s’assurer qu’elles n’ont pas été altérées par des pirates.
Les fonctions de hachage cryptographique peuvent être utilisées à la fois pour la vérification de l'intégrité et de l'authenticité, mais MD5 ne convient que pour la vérification de l'intégrité.
Vérification de l'intégrité des données MD5
Dans ces situations, la fonction de hachage MD5 peut être utilisée comme fonction de somme de contrôle. Le principe sous-jacent est que chaque fichier est exécuté via la fonction de somme de contrôle MD5 pour produire un hachage MD5 correspondant.
Les fichiers sont exécutés périodiquement par la fonction, produisant à chaque fois des hachages. Comme nous l'avons vu, les fonctions de hachage cryptographique comme MD5 sont déterministes et la sortie pour une entrée donnée est toujours la même. Même des modifications mineures apportées à l'entrée entraînent un hachage radicalement différent.
Ces propriétés nous permettent de comparer les hachages de fichiers au fil du temps. Si la sortie hachée d'un fichier est la même qu'au début, alors nous savons que les données n'ont pas été corrompues depuis leur premier hachage.
Si même une petite quantité de données avait été modifiée ou altérée au fil du temps, nous verrons un hachage très différent. Cela nous alerte de la corruption, ce qui signifie que nous pouvons prendre des mesures pour tenter de récupérer les données ou de les remplacer par une version d'une sauvegarde précédente.
S’il est vrai que MD5 est faible face aux attaques par collision, cela ne pose pas vraiment de problème lors de l’utilisation de l’algorithme comme somme de contrôle pour vérifier l’intégrité des données. Il est possible que deux fichiers distincts aient la même valeur de hachage, mais la probabilité qu'un fichier soit corrompu d'une manière si spécifique qu'il produise toujours le même hachage est si improbable qu'il ne vaut pas la peine de s'en inquiéter.
Les problèmes avec MD5 et l'authentification des données
Dans les cas où les données peuvent avoir été modifiées de manière malveillante, MD5 n’est pas sécurisé à utiliser car il n’est pas résistant aux collisions. Si MD5 est utilisé, les créateurs de fichiers peuvent essayer la même technique décrite dans le Fonctions de hachage cryptographique résistantes aux collisions section pour produire deux fichiers différents avec exactement le même hachage. L’un d’eux pourrait être légitime, tandis que l’autre pourrait être malveillant.
Si vous avez téléchargé un fichier et l'avez vérifié par rapport au hachage MD5 d'origine, vous ne pourrez pas savoir s'il s'agit de la version légitime ou malveillante. Le hachage correspondrait dans les deux cas. Cela signifie que MD5 ne peut pas être invoqué pour prouver l'authenticité des données.
Pour des raisons similaires, MD5 n'est pas adapté à d'autres applications où une authentification est requise, comme dans les signatures numériques et les certificats SSL. Dans les cas où vous souhaitez vérifier l’authenticité des données et vous assurer qu’elles n’ont pas été falsifiées, il est préférable d’utiliser une fonction de hachage résistante aux collisions comme SHA-256 au lieu du MD5 non sécurisé.
Identification de fichier avec MD5
MD5 peut être utilisé pour l'identification de fichiers dans des situations où le risque que des attaquants manipulent des fichiers et provoquent des collisions est limité. Si vous souhaitez joindre un hachage unique pour identifier facilement chaque fichier, vous n'avez pas à vous soucier trop des collisions. La probabilité que deux de vos fichiers aient le même identifiant de hachage est si faible que vous ne devriez pas vous inquiéter.
Preuve de travail
Avec la popularité croissante des projets de blockchain et des crypto-monnaies, ces technologies peuvent être l’un des domaines les plus courants dans lesquels le profane est confronté au hachage. Les fonctions de hachage sont essentielles pour les systèmes de preuve de travail, qui vérifient les transactions de crypto-monnaie tout en extrayant de nouvelles pièces.
Ce processus est accompli par des ordinateurs en compétition les uns avec les autres pour montrer qu'ils ont fait le « travail », ce qui signifie en réalité qu'ils ont exécuté un nombre incalculable de fois une fonction de hachage avec différentes entrées, afin de trouver l'entrée qui produit un hachage avec un ensemble d'entrées. nombre de zéros.
MD5 ne convient pas au système de preuve de travail utilisé dans Bitcoin, car il est tout simplement trop rapide. Si MD5 était la fonction de hachage de Bitcoin, les mineurs trouveraient le résultat correct trop rapidement et le temps de blocage serait beaucoup plus rapide que le temps préféré d'environ 10 minutes. Au lieu de cela, SHA-256 est utilisé comme fonction de hachage de Bitcoin.
Alternatives à MD5
Compte tenu des problèmes de sécurité du MD5, il n’est plus approprié dans les situations où une résistance aux collisions est requise. Dans la plupart des cas, SHA-256 ou ses parents (SHA-224, SHA-384, SHA-512, SHA-512/224, SHA-512/256) sont recommandés à la place.
Le Famille SHA-3 Des algorithmes de hachage ont été publiés par le NIST en 2015. Cependant, ils n’ont pas encore été largement adoptés car SHA-256 et ses proches sont toujours considérés comme sécurisés. Au fil du temps, nous nous attendons à voir des attaques plus graves réussir contre SHA-256. Lorsque celles-ci deviendront plus pratiques, la communauté technologique évoluera lentement vers des fonctions de hachage plus sécurisées. Mais comme nous l’avons vu avec MD5, il est probable qu’un certain nombre de développeurs continueront à utiliser des algorithmes plus anciens de manière dangereuse, longtemps après que nous ayons pris connaissance des problèmes de sécurité.
Nous connaissons les problèmes du MD5 depuis longtemps, donc ceux qui continuent à l’utiliser de manière non sécurisée n’ont aucune excuse. Dans ces cas-là, cela constitue une menace grave et doit être corrigée le plus rapidement possible. Si vous rencontrez un fournisseur qui s'appuie toujours sur MD5 pour la sécurité, il est probablement préférable de passer à un concurrent, car qui sait quelles autres mauvaises pratiques ils ont mis en place.