it-swarm.com.de

Können zwei verschiedene Zeichenfolgen denselben MD5-Hashcode generieren?

Für jedes unserer binären Assets generieren wir einen MD5-Hash. Dies wird verwendet, um zu überprüfen, ob ein bestimmtes binäres Asset bereits in unserer Anwendung vorhanden ist. Ist es jedoch möglich, dass zwei verschiedene binäre Assets denselben MD5-Hash generieren? Ist es also möglich, dass zwei verschiedene Strings denselben MD5-Hash erzeugen?

89
Lieven Cardoen

Für eine Reihe von geraden Milliarden von Vermögenswerten ist die Wahrscheinlichkeit von zufälligen Kollisionen vernachlässigbar gering - nichts, worüber Sie sich Sorgen machen sollten. Unter Berücksichtigung des Geburtstagsparadoxons bei einer Menge von 2 ^ 64 (oder 18.446.744.073.709.551.616) Assets beträgt die Wahrscheinlichkeit einer einmaligen MD5-Kollision in dieser Menge 50%. In dieser Größenordnung würden Sie Google wahrscheinlich in Bezug auf die Speicherkapazität schlagen.

Da jedoch die MD5-Hash-Funktion unterbrochen wurde (sie ist anfällig für einen Kollisionsangriff ), kann jeder ermittelte Angreifer 2 kollidierende Assets erzeugen in Sekundenschnelle CPU-Leistung. Wenn Sie also MD5 verwenden möchten, stellen Sie sicher, dass ein solcher Angreifer die Sicherheit Ihrer Anwendung nicht gefährdet!

Berücksichtigen Sie auch die Auswirkungen, wenn ein Angreifer eine Kollision mit einem vorhandenen Asset in Ihrer Datenbank fälschen könnte. Zwar gibt es keine derartigen bekannten Angriffe ( Preimage-Angriffe ) auf MD5 (Stand 2011), doch könnte dies durch die Ausweitung der aktuellen Forschung zu Kollisionsangriffen möglich werden.

Wenn sich herausstellt, dass dies ein Problem darstellt, schlage ich vor, die SHA-2-Reihe von Hash-Funktionen (SHA-256, SHA-384 und SHA-512) zu untersuchen. Der Nachteil ist, dass es etwas langsamer ist und eine längere Hash-Ausgabe hat.

91
intgr

MD5 ist eine Hash-Funktion - also können zwei verschiedene Strings absolut kollidierende MD5-Codes erzeugen.

Beachten Sie insbesondere, dass MD5-Codes eine feste Länge haben, sodass die mögliche Anzahl von MD5-Codes begrenzt ist. Die Anzahl der Zeichenketten (beliebiger Länge) ist jedoch definitiv unbegrenzt, so dass logischerweise muss Kollisionen vorliegen.

37
Konrad Rudolph

Ja, es ist möglich. Dies ist in der Tat ein Geburtstagsproblem . Die Wahrscheinlichkeit, dass zwei zufällig ausgewählte Strings denselben MD5-Hash haben, ist jedoch sehr gering.

Beispiele finden Sie unter this und this .

12
sharptooth

Ja, natürlich: MD5-Hashes haben eine endliche Länge, aber es gibt unendlich viele mögliche Zeichenfolgen, die mit MD5-Hashes versehen werden können.

10
Tony Andrews

Ja, es ist möglich, dass zwei verschiedene Zeichenfolgen denselben MD5-Hashcode generieren.

Hier ist ein einfacher Test unter Verwendung einer sehr ähnlichen binären Nachricht in Hex-Zeichenfolge:

$ echo '4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa200a8284bf36e8e4b55b35f427593d849676da0d1555d8360fb5f07fea2' | xxd -r -p | tee >/dev/null >(md5) >(sha1sum)
c6b384c4968b28812b676b49d40c09f8af4ed4cc  -
008ee33a9d58b51cfeb425b0959121c9

$ echo '4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa202a8284bf36e8e4b55b35f427593d849676da0d1d55d8360fb5f07fea2' | xxd -r -p | tee >/dev/null >(md5) >(sha1sum)
c728d8d93091e9c7b87b43d9e33829379231d7ca  -
008ee33a9d58b51cfeb425b0959121c9

Sie erzeugen unterschiedliche SHA-1-Summen, aber denselben MD5-Hashwert. Zweitens sind die Saiten sehr ähnlich, so dass es schwierig ist, den Unterschied zwischen ihnen zu finden.

Der Unterschied kann mit dem folgenden Befehl ermittelt werden:

$ diff -u <(echo 4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa200a8284bf36e8e4b55b35f427593d849676da0d1555d8360fb5f07fea2 | fold -w2) <(echo 4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa202a8284bf36e8e4b55b35f427593d849676da0d1d55d8360fb5f07fea2 | fold -w2)
--- /dev/fd/63  2016-02-05 12:55:04.000000000 +0000
+++ /dev/fd/62  2016-02-05 12:55:04.000000000 +0000
@@ -33,7 +33,7 @@
 af
 bf
 a2
-00
+02
 a8
 28
 4b
@@ -53,7 +53,7 @@
 6d
 a0
 d1
-55
+d5
 5d
 83
 60

Das obige Kollisionsbeispiel stammt von Marc Stevens: Einzelblockkollision für MD5 , 2012; Er erklärt seine Methode mit dem Quellcode ( alternativer Link zum Artikel ).


Ein weiterer Test:

$ echo '0e306561559aa787d00bc6f70bbdfe3404cf03659e704f8534c00ffb659c4c8740cc942feb2da115a3f4155cbb8607497386656d7d1f34a42059d78f5a8dd1ef' | xxd -r -p | tee >/dev/null >(md5) >(sha1sum)
756f3044edf52611a51a8fa7ec8f95e273f21f82  -
cee9a457e790cf20d4bdaa6d69f01e41

$ echo '0e306561559aa787d00bc6f70bbdfe3404cf03659e744f8534c00ffb659c4c8740cc942feb2da115a3f415dcbb8607497386656d7d1f34a42059d78f5a8dd1ef' | xxd -r -p | tee >/dev/null >(md5) >(sha1sum)
6d5294e385f50c12745a4d901285ddbffd3842cb  -
cee9a457e790cf20d4bdaa6d69f01e41

Unterschiedliche SHA-1-Summe, gleicher MD5-Hash.

Der Unterschied liegt in einem Byte:

$ diff -u <(echo 0e306561559aa787d00bc6f70bbdfe3404cf03659e704f8534c00ffb659c4c8740cc942feb2da115a3f4155cbb8607497386656d7d1f34a42059d78f5a8dd1ef | fold -w2) <(echo 0e306561559aa787d00bc6f70bbdfe3404cf03659e744f8534c00ffb659c4c8740cc942feb2da115a3f415dcbb8607497386656d7d1f34a42059d78f5a8dd1ef | fold -w2)
--- /dev/fd/63  2016-02-05 12:56:43.000000000 +0000
+++ /dev/fd/62  2016-02-05 12:56:43.000000000 +0000
@@ -19,7 +19,7 @@
 03
 65
 9e
-70
+74
 4f
 85
 34
@@ -41,7 +41,7 @@
 a3
 f4
 15
-5c
+dc
 bb
 86
 07

Das obige Beispiel stammt von Tao Xie und Dengguo Feng: Konstruieren von MD5-Kollisionen mit nur einem Nachrichtenblock , 2010.


Verbunden:

6
kenorb

Ja, es ist möglich. Es heißt Hash-Kollision .

Allerdings sollen Algorithmen wie MD5 die Wahrscheinlichkeit einer Kollision minimieren.

Der Wikipedia-Eintrag auf MD5 erklärt einige Sicherheitslücken in MD5, die Sie kennen sollten.

4
Wernsey

Nur um informativer zu sein. Aus mathematischer Sicht sind Hash-Funktionen nicht injektiv .
Dies bedeutet, dass es keine 1 zu 1-Beziehung (sondern eine einseitige Beziehung) zwischen dem Startsatz und dem resultierenden Satz gibt.

Bijection auf Wikipedia

BEARBEITEN: Um vollständig zu sein, existieren injektive Hash-Funktionen: Sie heißen Perfektes Hashing .

4
Roubachof

Ja ist es! Kollision wird eine Möglichkeit sein (obwohl das Risiko sehr gering ist). Wenn nicht, hätten Sie eine ziemlich effektive Komprimierungsmethode!

EDIT : Wie Konrad Rudolph sagt: Eine potenziell unbegrenzte Menge von Eingaben, die in eine endliche Menge von Ausgaben (32 hexadezimale Zeichen) umgewandelt wurde wird zu einer endlosen Anzahl von Kollisionen führen.

3
jensgram

Wie schon andere gesagt haben, kann es zu Kollisionen zwischen zwei verschiedenen Eingaben kommen. In Ihrem Anwendungsfall sehe ich dies jedoch nicht als Problem. Ich bezweifle sehr, dass Sie auf Kollisionen stoßen werden. Ich habe MD5 für den Fingerabdruck von Hunderttausenden von Bilddateien einer Reihe von Bildformaten (JPG, Bitmap, PNG, RAW) bei einem früheren Auftrag verwendet und hatte keine Kollision .

Wenn Sie jedoch versuchen, einen Fingerabdruck von Daten zu erstellen, könnten Sie möglicherweise zwei Hash-Algorithmen verwenden - die Wahrscheinlichkeit, dass eine Eingabe zur gleichen Ausgabe von zwei verschiedenen Algorithmen führt, ist nahezu unmöglich.

3
Thomas Owens

Mir ist klar, dass dies alt ist, aber ich dachte, ich würde meine Lösung beitragen. Es gibt 2 ^ 128 mögliche Hash-Kombinationen. Und damit eine 2 ^ 64 Wahrscheinlichkeit eines Geburtstagsparadoxons. Während die unten stehende Lösung die Möglichkeit von Kollisionen nicht ausschließt, wird sie das Risiko mit Sicherheit um einen erheblichen Betrag verringern.

2^64 = 18,446,744,073,709,500,000 possible combinations

Was ich getan habe, ist, dass ich ein paar Hashes basierend auf der Eingabezeichenfolge zusammengebaut habe, um eine viel längere resultierende Zeichenfolge zu erhalten, die Sie als Ihren Hash betrachten ...

Mein Pseudocode dafür ist also:

Result = Hash(string) & Hash(Reverse(string)) & Hash(Length(string))

Das ist zur praktischen Unwahrscheinlichkeit einer Kollision. Aber wenn Sie super-paranoid sein möchten und es nicht passieren kann und Speicherplatz kein Problem darstellt (und auch keine Rechenzyklen) ...

Result = Hash(string) & Hash(Reverse(string)) & Hash(Length(string)) 
         & Hash(Reverse(SpellOutLengthWithWords(Length(string)))) 
         & Hash(Rotate13(string)) Hash(Hash(string)) & Hash(Reverse(Hash(string)))

Okay, nicht die sauberste Lösung, aber jetzt können Sie viel mehr damit spielen, wie selten Sie auf eine Kollision stoßen. Bis zu dem Punkt, an dem ich annehmen könnte, dass der Begriff in allen realistischen Sinnen unmöglich ist.

Meinetwegen denke ich, dass die Möglichkeit einer Kollision selten genug ist, dass ich dies nicht als "todsicher" betrachten werde, aber es ist so unwahrscheinlich, dass es dem Bedarf entspricht.

Jetzt steigen die Kombinationsmöglichkeiten deutlich. Während Sie eine lange Zeit damit verbringen könnten, wie viele Kombinationen Ihnen dies bringen könnte, werde ich theoretisch sagen, dass es Sie BEDEUTEND mehr bringt als die oben angegebene Anzahl von

2^64 (or 18,446,744,073,709,551,616) 

Wahrscheinlich um hundert Stellen mehr oder so. Das theoretische Maximum, das dies geben könnte, wäre

Mögliche Anzahl der resultierenden Zeichenfolgen:

528294531135665246352339784916516606518847326036121522127960709026673902556724859474417255887657187894674394993257128678882347559502685537250538978462939576908386683999005084168731517676426441053024232908211188404148028292751561738838396898767036476489538580897737998336

2
Andrew

Ich denke, wir müssen den Hashing-Algorithmus gemäß unserer Anforderung sorgfältig auswählen, da Hash-Kollisionen nicht so selten sind, wie ich erwartet hatte. Ich habe kürzlich einen sehr einfachen Fall von Hash-Kollision in meinem Projekt gefunden. Ich verwende Python Wrapper von xxhash zum Hashing. Link: https://github.com/ewencp/pyhashxx

s1 = 'mdsAnalysisResult105588'
s2 = 'mdsAlertCompleteResult360224'
pyhashxx.hashxx(s1) # Out: 2535747266
pyhashxx.hashxx(s2) # Out: 2535747266

Es verursachte ein sehr kniffliges Caching-Problem im System, und schließlich stellte ich fest, dass es sich um eine Hash-Kollision handelt.

1
i_am_saurabh