web-dev-qa-db-fra.com

Est-il sûr d'utiliser MD5 pour vérifier l'intégrité des petits fichiers (moins de 15 Ko)?

Je sais que la collision pour MD5 a été documentée depuis les années 90 et qu'il a été démontré que les certificats numériques basés sur MD5 étaient complètement compromis en 2010, mais dans quelle mesure MD5 garantit-il que de petites quantités de données n'ont pas été falsifiées?

J'ai quelques petits fichiers texte de quelques pages (disons 15 Ko). J'ai utilisé SHA-256 sur eux, mais il serait beaucoup plus pratique de pouvoir utiliser MD5 à la place.

Dans quelle mesure MD5 serait-il un condensé de hachage pour ces petits fichiers texte de 15 Ko? Une partie malveillante serait-elle en mesure de produire des collisions pour une si petite quantité de données ou la petite taille rend-elle cette tâche difficile?

55
thebunnyrules

La taille de l'entrée est sans importance. En fait, à cause du paradoxe d'anniversaire , vous n'avez pas besoin de plus que la taille du hachage pour garantir les collisions. La meilleure façon d'éviter les collisions est d'utiliser un hachage plus fort qui ne leur est pas vulnérable, comme SHA-2. Cependant, vous décrivez une attaque plus difficile qu'une attaque par collision, appelée attaque pré-image, dont MD5 est à l'abri.

Il existe trois types d'attaques* qui se traduisent par deux fichiers avec le même condensé:

  • 1ère pré-image - Trouvez une entrée qui se résout en un hachage spécifique.

  • 2ème pré-image - Modifiez une entrée sans changer le hachage résultant.

  • Collision - Trouvez deux entrées distinctes qui ont le même hachage.

Celles-ci sont appelées attaques lorsqu'elles peuvent être exécutées plus efficacement que par la recherche par force brute. Les collisions peuvent toujours se produire naturellement, et en fait, elles sont garanties avec toute quantité d'entrée non négligeable en raison du principe du pigeonhole , mais les hachages sont conçus pour rendre difficile la intentionnellement effectuer. Pour un hachage avec une sortie de la taille de MD5, le risque de collision accidentelle aléatoire est extrêmement faible. Même si vous hachez 6 milliards de fichiers aléatoires par seconde, cela prendrait 100 ans avant d'avoir 50% de chances que deux hachages entrent en collision. MD5 est super pour détecter la corruption accidentelle.

Une forte fonction de hachage n - bit est conçue pour avoir un niveau de sécurité de 2 n contre les 1ère et 2ème attaques pré-image, et un niveau de sécurité de 2 n/2 contre les attaques par collision. Pour un hachage 128 bits comme MD5, cela signifie qu'il a été conçu pour avoir un niveau de sécurité de 2128 contre les préimages et 264 contre les collisions. À mesure que les attaques s'améliorent, le niveau de sécurité réel qu'il peut fournir est lentement réduit.

MD5 est vulnérable à une attaque par collision nécessitant l'équivalent de seulement 218 invocations de hachage au lieu des 2 prévues64 exploiter. À moins que l'attaquant ne génère des fichiers les deux, il ne s'agit pas d'une attaque par collision. Un attaquant qui possède un fichier et souhaite le modifier de manière malveillante sans changer le hachage devra monter une 2ème attaque de pré-image, ce qui est complètement infaisable contre MD5 avec la technologie moderne (la meilleure attaque a une complexité de 2123,4, par rapport au maximum théorique de MD5 de 2128). Les attaques par collision sont pertinentes dans différentes situations. Par exemple, si vous disposez d'un exécutable créé par un attaquant sans porte dérobée, vous pouvez le hacher et enregistrer le hachage. Cet exécutable pourrait ensuite être remplacé par une version avec porte dérobée, mais le hachage serait le même que celui bénin! C'est aussi un problème pour certificats où quelqu'un pourrait soumettre un certificat pour un domaine qu'ils possèdent, mais le certificat entrerait en collision intentionnellement avec un pour un domaine qu'ils ne possèdent pas.

Il est sûr d'utiliser MD5 pour vérifier les fichiers tant que le hachage stocké n'est pas soumis à une falsification et peut être fiable pour être correct, et tant que les fichiers vérifiés n'ont pas été créés (ou influencés!) Par un attaquant. Cependant, il peut être judicieux d'utiliser un hachage plus fort, simplement pour empêcher une future attaque pratique de pré-image contre MD5 à l'avenir de mettre vos données en danger. Si vous voulez un hachage moderne qui est très rapide mais toujours cryptographiquement sécurisé, vous pouvez regarder BLAKE2 .

* Bien qu'il existe d'autres attaques contre MD5 telles que des attaques par extension de longueur qui affectent tous les hachages Merkle – Damgård, comme mentionné par @LieRyan, elles ne sont pas pertinentes pour vérifier l'intégrité d'un fichier par rapport à un hachage correct.

 Une variante de l'attaque par collision appelée attaque par collision à préfixe choisi est capable de prendre deux messages arbitraires (préfixes) et de trouver deux valeurs qui, lorsqu'elles sont ajoutées à chaque message, entraînent un condensé en collision. Cette attaque est plus difficile à réussir qu'une attaque par collision classique. Comme l'attaque d'extension de longueur, cela ne s'applique qu'aux hachages Merkle – Damgård.

93
forest

Cela dépend de ce contre quoi vous voulez vous défendre

La sécurité n'est jamais un jeu universel. Si c'était le cas, il n'y aurait pas 12941 algorithmes de hachage différents. Au lieu de cela, vous devez comprendre que chaque mesure de sécurité vous défend contre un type d'attaque spécifique. Vous mettez un mot de passe dans votre ordinateur pour vous défendre contre l'accès aléatoire de personnes, pas parce que c'est si amusant de taper whereD1DweG0sowron6 Chaque fois que vous vous connectez.

Quant aux algorithmes de hachage, vous pouvez les classer grossièrement comme "hachages cryptographiques" et "hachages non cryptographiques". Les algorithmes de hachage cryptographique sont conçus pour résister à un certain nombre d'attaques, tandis que les hachages non cryptographiques sont conçus pour être aussi rapides que possible.1 MD5, par exemple, est considéré comme un hachage cryptographique, mais tellement cassé qu'il n'est utilisable qu'en tant que hachage non cryptographique.

Quand utiliser un hachage non cryptographique

Si votre objectif est de détecter les bit-flips lors de la copie d'un fichier d'un emplacement à un autre (par exemple, une clé USB vers un ordinateur portable), alors MD5 est absolument le bon choix. J'irais même jusqu'à dire n'importe quel hachage rapide et non cryptographique est bon. Lorsque vous copiez des fichiers, vous n'avez en réalité pas à craindre les interférences de l'attaquant. Si vous êtes paranoïaque à propos des pirates qui sont en mesure de modifier votre noyau, ajouter des hachages ne résoudra pas vos problèmes.

Vérification de l'intégrité des fichiers avec les interférences de l'attaquant

Si vous avez l'intention de signer et de publier ces fichiers, un attaquant pourrait avoir la possibilité de créer un fichier éventuellement légitime avec le même hachage, ce qui signifie que votre signature est tout aussi valide sur le fichier malveillant.

Un exemple

Supposons que votre message d'origine m1 Ressemble à ceci:

Je déclare par la présente que les règles de lapin!

Vous utilisez votre fonction de hachage h(m1) et obtenez le résumé d1. Ensuite, vous signez le résumé d1 Et obtenez une signature s1.

Vous publiez ensuite votre message m1, Votre signature s1 Et votre fonction de hachage h().

Je pourrais être l'attaquant dans le scénario et créer un message m2 Qui a exactement le même hachage dans la fonction de hachage que vous avez choisie:

Il est de notoriété publique que les chiens valent mieux que les lapins à tous égards ...

Depuis h(m1) = h(m2) = d1, la signature s1 Est valide à la fois pour votre m1 D'origine et pour mon m2 Malveillant.

Afin de vous défendre contre de telles attaques, il est essentiel de choisir un algorithme de hachage fort avec une haute résistance aux collisions. Cela signifie qu'il devient très difficile pour moi de trouver un m2h(m2) = h(m1).

Les bons choix incluraient SHA256 et SHA512, ainsi que des tonnes d'autres. Il semble que tout le monde ait des fonctions de hachage non traditionnelles préférées, mais SHA256 et SHA512 ont un support très répandu et il vous sera difficile de trouver un système qui ne prend pas en charge ces hachages. Et comme vos fichiers sont très petits, le calcul du hachage doit être presque instantané.

Par exemple, sur ma machine à 800 MHz, le calcul du hachage SHA512 d'un fichier aléatoire 16k a pris 3 ms, donc même sur un grille-pain, cela devrait être relativement rapide.


1  Vous pouvez voir la même chose avec des générateurs de nombres aléatoires. Les PRNG cryptographiques visent à fournir des nombres aléatoires qui sont vraiment difficiles à deviner, tandis que les PRNG non cryptographiques visent à donner simplement des nombres qui semblent aléatoires à première vue et le font rapidement.

12
MechMK1

La taille du fichier ne fait aucune différence. MD5 est basé sur construction Merkle – Damgård , qui est vulnérable à attaque d'extension de longueur . 15 Ko suffisent pour faire l'attaque d'extension de longueur. Il existe de nombreuses collisions et méthodes connues pour générer des collisions MD5 qui ne font que quelques centaines d'octets, et une fois qu'une collision de base est détectée, être vulnérable à l'extension de longueur signifie qu'elles peuvent être utilisées pour générer un nombre arbitraire de collisions supplémentaires.

0
Lie Ryan

La taille en soi n'est pas extrêmement pertinente, les données de collision peuvent être aussi petites qu'un seul bloc.

Cependant, vous êtes beaucoup plus en sécurité avec une collection de fichiers texte qu'avec une collection de fichiers PDF ou similaires.

Pourquoi? car les résultats d'une attaque par collision aboutissent généralement à ce que les deux fichiers de la paire contiennent des "déchets d'apparence aléatoire". Dans un format riche, ces déchets d'apparence aléatoire peuvent être cachés à la vue afin que l'attaquant puisse inciter l'administrateur de la collection à accepter l'un de leur paire de fichiers en collision.

Dans un fichier texte, le contenu est clair pour tout le monde.

0
Peter Green

Réponse courte: Non, il n'est pas sûr d'utiliser MD5 pour vérifier l'intégrité des fichiers, courts ou longs.

La réponse complète dépend de votre confiance dans la distribution des erreurs .

Y a-t-il un risque aléatoire indépendant de basculement de bits dans chaque position du fichier en raison de la transmission sur un canal légèrement déficitaire comme un port série? Si c'est le cas, vous pouvez utiliser MD5, mais il est beaucoup moins cher d'utiliser un CRC, qui est garanti pour détecter un flip de bit unique, et peut être garanti par des choix standard de polynôme CRC pour détecter tous les nombres impairs de flips de bit.

Mais vous avez posé des questions sur sécurisé , ce qui suggère que vous envisagez des adversaires légèrement plus intelligents qu'un port série avec perte. Si vous n'êtes pas confiant que les erreurs sont des retournements de bits aléatoires indépendants, alors n'utilisez pas MD5 ou un CRC. = Il est très facile pour des adversaires intelligents de trouver des paires de fichiers distincts qui partagent un hachage MD5 commun ou une somme de contrôle CRC, et dans de nombreux scénarios, cela peut permettre à un adversaire de forger des documents que votre système MD5 ne détectera pas. La taille du fichier n'est pas pertinente: il est facile de trouver des collisions MD5 dans des fichiers aussi courts que 64 octets, sans limite de durée.

Il existe un endroit pour discuter des différences techniques entre les attaques par collision, les attaques de pré-image et les attaques de deuxième pré-image. Une réponse à une question générale pour savoir s'il est sûr de vérifier l'intégrité des fichiers n'est pas un tel endroit. Lorsque vous avez un protocole spécifique à l'esprit où vous pouvez articuler les pouvoirs précis de l'adversaire et exactement comment les utilisateurs légitimes se comporteront dans le protocole, et vous avez des contraintes d'implémentation qui limitent votre choix de fonctions de hachage de sorte que vous devez considérez MD5, alors nous pourrons discuter (peut-être sur crypto.SE) s'il est sûr d'utiliser MD5 dans ce protocole pour atteindre la sécurité que vous espérez atteindre contre un tel adversaire.

Mais il serait beaucoup plus simple et plus sûr d'utiliser simplement SHA-2, ou SHA-3, ou BLAKE2.

0