web-dev-qa-db-fra.com

Comment se fait-il que les valeurs de hachage MD5 ne soient pas réversibles?

Un concept auquel je me suis toujours posé la question est l'utilisation de fonctions et de valeurs de hachage cryptographiques. Je comprends que ces fonctions peuvent générer une valeur de hachage unique et pratiquement impossible à inverser, mais voici ce que je me suis toujours demandé:

Si sur mon serveur, dans PHP, je produis:

md5("stackoverflow.com") = "d0cc85b26f2ceb8714b978e07def4f6e"

Lorsque vous exécutez la même chaîne via une fonction MD5, vous obtenez le même résultat sur votre installation PHP. Un processus est utilisé pour produire une valeur, à partir d’une valeur de départ.

Cela ne signifie-t-il pas qu'il existe un moyen de déconstruire ce qui se passe et d'inverser la valeur de hachage? 

Qu'est-ce qui rend ces chaînes impossibles à retracer dans ces fonctions?

86
barfoon

Le matériel d'entrée peut être une longueur infinie, où la sortie est toujours longue de 128 bits. Cela signifie qu'un nombre infini de chaînes en entrée générera la même sortie.

Si vous choisissez un nombre aléatoire et que vous le divisez par 2, mais que vous n'écrivez que le reste, vous obtiendrez respectivement 0 ou 1 - pair ou impair. Est-il possible de prendre ce 0 ou 1 et d'obtenir le numéro d'origine?

194
Cody Brocious

Si les fonctions de hachage telles que MD5 étaient réversibles, cela aurait été un événement décisif dans l'historique des algorithmes de compression de données! Il est facile de voir que si MD5 était réversible, des blocs de données arbitraires de taille arbitraire pourraient être représentés par 128 bits à peine, sans aucune perte d’information. Ainsi, vous auriez pu reconstruire le message d'origine à partir d'un nombre de 128 bits, quelle que soit la taille du message d'origine.

49
Autodidact

Contrairement à ce que soulignent les réponses les plus citées, la non-injectivité (c’est-à-dire qu’il existe plusieurs chaînes de hachage de même valeur) d’une fonction de hachage cryptographique provoquée par la différence entre une taille d’entrée importante (potentiellement infinie) et une valeur fixe. taille de sortie n'est pas le point important - en fait, nous préférons les fonctions de hachage où ces collisions se produisent aussi rarement que possible.

Considérons cette fonction (en notation PHP, sous forme de question):

function simple_hash($input) {
     return bin2hex(substr(str_pad($input, 16), 0, 16));
}

Cela ajoute des espaces, si la chaîne est trop courte, puis prend les 16 premiers octets de la chaîne, puis l'encode au format hexadécimal. Il a la même taille de sortie qu'un hachage MD5 (32 caractères hexadécimaux ou 16 octets si nous omettons la partie bin2hex).

print simple_hash("stackoverflow.com");

Cela produira:

737461636b6f766572666c6f772e636f6d

Cette fonction a également la même propriété de non-injectivité que celle soulignée par la réponse de Cody pour MD5: nous pouvons passer des chaînes de toute taille (pour autant qu'elles tiennent dans notre ordinateur) et ne générer que 32 chiffres hexadécimaux. Bien sûr, ça ne peut pas être injectif.

Mais dans ce cas, il est trivial de trouver une chaîne qui mappe vers le même hachage (appliquez simplement hex2bin sur votre hachage et vous l’avez). Si votre chaîne d'origine avait la longueur 16 (comme dans notre exemple), vous obtiendrez même cette chaîne d'origine. Rien de ce genre ne devrait être possible pour MD5, même si vous savez que la longueur de la saisie est assez courte (sauf en essayant toutes les entrées possibles jusqu'à ce que nous en trouvions une qui corresponde, par exemple une attaque par force brute).

Les hypothèses importantes pour une fonction de hachage cryptographique sont les suivantes:

  • il est difficile de trouver une chaîne produisant un hachage donné (résistance à la pré-image)
  • il est difficile de trouver une chaîne différente produisant le même hachage qu'une chaîne donnée (seconde résistance à la pré-image)
  • il est difficile de trouver une paire de chaînes avec le même hash (résistance à la collision)

Évidemment, ma fonction simple_hash ne remplit aucune de ces conditions. (En fait, si nous limitons l'espace d'entrée à "chaînes de 16 octets", ma fonction devient alors injective et résiste même à une résistance à la deuxième image et à la collision.)

Il existe maintenant des attaques par collision contre MD5 (par exemple, il est possible de produire une paire de chaînes, même avec un même préfixe, qui ont le même hachage, avec beaucoup de travail, mais pas beaucoup de travail impossible), vous ne devriez donc pas utiliser MD5 pour tout ce qui est critique ... Il n'y a pas encore d'attaque de pré-image, mais les attaques vont s'améliorer.

Pour répondre à la question:

Qu'est-ce qui rend le .__ à propos de ces fonctions? cordes résultantes impossible à retracer?

Ce que MD5 (et d’autres fonctions de hachage reposant sur la construction Merkle-Damgard) fait en réalité consiste à appliquer un algorithme de chiffrement avec le message comme clé et une valeur fixe comme "texte brut", en utilisant le texte chiffré obtenu comme hachage. (Avant cela, l'entrée est complétée et divisée en blocs, chacun de ces blocs est utilisé pour chiffrer la sortie du bloc précédent, XORed avec son entrée pour empêcher les calculs inverses.)

Les algorithmes de cryptage modernes (y compris ceux utilisés dans les fonctions de hachage) sont conçus de manière à rendre difficile la récupération de la clé, même si le texte en clair et le texte chiffré (ou même lorsque l'adversaire choisit l'un d'entre eux) . généralement en effectuant de nombreuses opérations de brassage de bits de manière à ce que chaque bit de sortie soit déterminé par chaque bit de clé (plusieurs fois) et par chaque bit d'entrée. De cette façon, vous ne pouvez facilement retracer ce qui se passe à l'intérieur que si vous connaissez la clé complète et l'entrée ou la sortie.

Pour les fonctions de hachage de type MD5 et une attaque de type préimage (avec une chaîne hachée à bloc unique pour simplifier les choses), vous n’avez que les entrées et les sorties de votre fonction de cryptage, mais pas la clé (c’est ce que vous recherchez).

27
Paŭlo Ebermann

La réponse de Cody Brocious est la bonne. À proprement parler, vous ne pouvez pas "inverser" une fonction de hachage car de nombreuses chaînes sont mappées sur le même hachage. Notez cependant que trouver la chaîne one mappée sur un hachage donné ou la chaîne deux mappée sur le même hachage (c'est-à-dire un collision) constituerait une avancée majeure. pour un cryptanalyst. La grande difficulté de ces deux problèmes explique pourquoi de bonnes fonctions de hachage sont utiles en cryptographie. 

17

MD5 ne crée pas une valeur de hachage unique; L'objectif de MD5 est de produire rapidement une valeur qui change de manière significative en fonction d'un changement mineur de la source. 

Par exemple., 

"hello" -> "1ab53"
"Hello" -> "993LB"
"ZR#!RELSIEKF" -> "1ab53"

(Évidemment, ce n'est pas le cryptage MD5 réel) 

La plupart des hachages (si pas tous) sont également non uniques; ils sont plutôt uniques assez , donc une collision est hautement improbable, mais toujours possible. 

12
Trevel

Un bon moyen de penser à un algorithme de hachage consiste à redimensionner une image dans Photoshop ... Supposons que votre image mesure 5 000 x 5 000 pixels et que vous la redimensionnez à 32 x 32. Ce que vous avez est toujours une représentation de l’image originale, mais elle est beaucoup plus petite et a effectivement «jeté» certaines parties des données d’image pour les adapter à une taille plus petite. Donc, si vous redimensionniez cette image 32x32 à une taille de 5000x5000, vous obtiendrez un désordre flou. Cependant, comme une image 32x32 n’est pas si grande, il serait théoriquement possible de réduire la taille d’une autre image pour obtenir exactement les mêmes pixels!

C'est juste une analogie, mais cela aide à comprendre ce que fait un hash.

8
nbevans

Une collision de hachage est beaucoup plus probable que vous ne le pensez. Examinez le paradoxe anniversaire pour mieux comprendre pourquoi.

4
Gamic

Le nombre de fichiers d'entrée possibles étant supérieur au nombre de sorties 128 bits, il est impossible d'attribuer de manière unique un hachage MD5 à chaque possible.

Les fonctions de hachage cryptographique sont utilisées pour vérifier l'intégrité des données ou les signatures numériques (le hachage étant signé pour plus d'efficacité). Changer le document original doit donc signifier que le hachage original ne correspond pas au document modifié.

Ces critères sont parfois utilisés:

  1. Résistance à la pré-image: pour une fonction de hachage donnée et donnée, il devrait être difficile de trouver une entrée qui possède le hachage donné pour cette fonction.
  2. Seconde résistance à la pré-image: pour une fonction de hachage et une entrée données, il devrait être difficile de trouver une deuxième entrée, différente, avec le même hachage.
  3. Résistance à la collision: pour une fonction donnée, il devrait être difficile de trouver deux entrées différentes avec le même hash. 

Ces critères sont choisis de manière à rendre difficile la recherche d’un document correspondant à un hachage donné, sinon il serait possible de falsifier des documents en remplaçant l’original par un qui correspondrait à un hachage. (Même si le remplacement est du charabia, le simple remplacement de l'original peut provoquer des perturbations.)

Le numéro 3 implique le numéro 2.

En ce qui concerne MD5 en particulier, il a été démontré qu’il présentait des défauts: Comment décomposer MD5 et d’autres fonctions de hachage .

4
Geoglyph

Un scientifique chinois a trouvé un moyen appelé "collisions choisies-préfixes" pour créer un conflit entre deux chaînes différentes.

Voici un exemple: http://www.win.tue.nl/hashclash/fastcoll_v1.0.0.5.exe.Zip
Le code source: http://www.win.tue.nl/hashclash/fastcoll_v1.0.0.5_source.Zip

2
gameboy90

Mais c’est là que les tables Rainbow entrent en jeu . Fondamentalement, c’est juste une grande quantité de valeurs hachées séparément, puis le résultat est sauvegardé sur disque. Ensuite, le bit d’inversion consiste simplement à effectuer une recherche dans un très grand tableau.

Cela n'est évidemment possible que pour un sous-ensemble de toutes les valeurs d'entrée possibles, mais si vous connaissez les limites de la valeur d'entrée, vous pourrez peut-être la calculer.

2
martinlund

Comme beaucoup l'ont déjà dit, MD5 a été conçu pour que les flux de données de longueur variable puissent être hachés en un bloc de données de longueur fixe, de sorte qu'un même hachage est partagé par de nombreux flux de données d'entrée.

Toutefois, si vous avez besoin de connaître les données d'origine à partir de la somme de contrôle, par exemple si vous avez le hash d'un mot de passe et devez le trouver, il est souvent plus rapide de simplement chercher sur Google (ou le chercheur de votre choix) pour la réponse que de le forcer brutalement. J'ai réussi à trouver quelques mots de passe en utilisant cette méthode.

1
Tim Matthews

par définition Fonction de hachage (hachage cryptographique): ne devrait pas être inversible ni avoir de collisions (le moins possible).

regd votre question: c'est un hasch à sens unique. input (quelle que soit sa longueur) générera une sortie de taille fixe (elle sera complétée sur la base de algo (limite de 512 bits pour MD5)). Les informations sont compressées (perdues) et pratiquement impossibles à générer à partir de transformations inverses.

informations supplémentaires sur le MD5: il est vulnérable aux collisions. récemment parcouru cet article, http://www.win.tue.nl/hashclash/Nostradamus/

ouvre le code source pour les implémentations de chiffrement de hachage (MD5 et SHA) peut être trouvé à Mozilla code . (librairie freebl).

0
FL4SOF

Désormais, les hachages MD5 ou autres de ce nombre sont précalculés pour toutes les chaînes possibles et sont stockés pour un accès facile. Bien qu'en théorie, MD5 ne soit pas réversible, mais en utilisant de telles bases de données, vous pouvez savoir quel texte a généré une valeur de hachage particulière.

Par exemple, essayez le code de hachage suivant à l’adresse http://gdataonline.com/seekhash.php pour trouver le texte que j’ai utilisé pour calculer le hachage.

aea23489ce3aa9b6406ebb28e0cda430
0
Babar

Le meilleur moyen de comprendre ce que signifient toutes les réponses les plus votées est d’essayer de rétablir l’algorithme MD5. Je me souviens que j’ai essayé de rétablir l’algorithme MD5crypt il ya quelques années, non pas pour récupérer le message original car c’est impossible, mais pour générer un message produisant le même hachage que le hachage original. Cela me permettrait théoriquement, du moins en théorie, de me connecter à un périphérique Linux qui stockerait le nom d'utilisateur: mot de passe dans le fichier/etc/passwd en utilisant le message généré (mot de passe) au lieu de celui d'origine. Les deux messages ayant le même hachage résultant, le système reconnaîtra mon mot de passe (généré à partir du hachage d'origine) comme valide. Cela n'a pas fonctionné du tout. Après plusieurs semaines, si je me souviens bien, l’utilisation de salt dans le message initial m’a tué. Je devais produire non seulement un message initial valide, mais également un message initial valide salé, ce que je n’ai jamais pu faire. Mais la connaissance que j'ai tirée de cette expérience était bien.

0
Vinicius

f (x) = 1 est irréversible. Les fonctions de hachage ne sont pas irréversibles.

C'est en fait champs obligatoires pour qu’ils remplissent leur fonction qui consiste à déterminer si une personne possède une copie non corrompue des données hachées. Cela amène une susceptibilité aux attaques par force brute, qui sont assez puissantes de nos jours, en particulier contre MD5.

Il y a aussi de la confusion ici et ailleurs chez les personnes qui ont des connaissances en mathématiques mais peu de connaissances en cryptographie. Plusieurs chiffrements ne font que XOR saisir les données avec le flux de clés. Vous pouvez donc dire qu'un texte chiffré correspond à tous les textes en clair de cette longueur, car vous auriez pu utiliser n'importe quel flux de clés.

Cependant, cela ne tient pas compte du fait qu'un texte en clair raisonnable produit à partir de la graine password est beaucoup, beaucoup plus probable qu'un autre produit par la graine Wsg5Nm^bkI4EgxUOhpAjTmTjO0F!VkWvysS6EEMsIJiTZcvsh@WI$IH$TYqiWvK!%&Ue&nk55ak%BX%9!NnG%32ftud%YkBO$U6o dans la mesure où quiconque prétendant que la seconde possibilité était envisageable se moquait de lui.

De la même manière, si vous essayez de choisir entre les deux mots de passe potentiels password et Wsg5Nm^bkI4EgxUO, ce n'est pas aussi difficile à faire que certains mathématiciens voudraient bien vous faire croire.

0
Olathe