Wie viele zufällige Elemente vor MD5 erzeugen Kollisionen?

Ich habe eine Bildbibliothek auf Amazon S3. Für jedes Bild habe ich die Quell-URL auf meinem Server und einen Zeitstempel erstellt, um einen eindeutigen Dateinamen zu erhalten. Da S3 keine Unterverzeichnisse haben kann, muss ich alle diese Bilder in einem einzigen flachen Ordner speichern.

Muss ich mich über Kollisionen im MD5-Hash-Wert Gedanken machen, der erzeugt wird?

Bonus: Wie viele Dateien könnte ich haben, bevor ich Kollisionen in dem Hash-Wert sehen würde, den MD5 produziert?

131
hinzugefügt der Autor kenorb, Quelle
Die wörtliche Antwort ist, dass die zweite Datei dasselbe MD5 wie das erste haben könnte. Die Chancen sind jedoch extrem gering.
hinzugefügt der Autor Rick James, Quelle

8 Antworten

Die Wahrscheinlichkeit, dass nur zwei Hashes versehentlich kollidieren, ist 1/2 128 was ist 1 in 340 undecillion 282 zmillion 366 nillion 920 octrillion 938 septillion 463sextillion 463 trillion 374 quilliary 607 trillion 431 milliarde 768 million 211 tausend 456.

Wenn Sie jedoch alle Hashes behalten, ist die Wahrscheinlichkeit ein bisschen höher dank Geburtstagsparadox . Um eine Chance von 50% zu haben, dass Hash mit einem anderen Hash kollidiert, benötigen Sie 2 64 Hashes. Das bedeutet, dass Sie im Durchschnitt eine Übereinstimmung erzielen müssen, um eine Kollision zu erzielen. 6 Milliarden Dateien pro Sekunde für 100 Jahre .

238
hinzugefügt
Du sagst also, es gibt eine Chance!
hinzugefügt der Autor vargonian, Quelle
"Wahrscheinlichkeit der Kollision ist 1/2 ^ 64" - was? Die Wahrscheinlichkeit einer Kollision hängt von der Anzahl der bereits gehashten Elemente ab, es handelt sich nicht um eine feste Zahl. In der Tat ist es gleich 1 - sPn/s ^ n , wobei s die Größe des Suchraums ist ( 2 ^ 128 in In diesem Fall) und n ist die Anzahl der gehashten Elemente. Was Sie wahrscheinlich denken, ist 2 ^ 64 . Dies ist die ungefähre Anzahl von Elementen, die Sie für MD5-Hash benötigen, um eine 50% ige Chance auf eine Kollision zu haben.
hinzugefügt der Autor BlueRaja - Danny Pflughoeft, Quelle
Jørgen Fogh: Und alle Gesetze der Physik sind auch "nicht korrekt". Ein solches Ausmaß von Pedantismus ist unnötig, weil es die Antwort in keiner sinnvollen Weise ändert.
hinzugefügt der Autor Kornel, Quelle
@yaauie Nein, das ist lächerlich unmöglich. Ich spreche davon, 2 ^ 64 Hashes aus 2 ^ 128 möglichen zu generieren. Das ist ein Hundertstel Prozent aller möglichen erzeugten Hashes.
hinzugefügt der Autor Kornel, Quelle
@ BlueRaja-DannyPflughoft, das ist es, was ich mir gedacht habe. Danke für die Korrektur.
hinzugefügt der Autor Kornel, Quelle
@ConcernedOfTunbridgeWells: Ich habe Korrektur für Geburtstagsparadox genommen, weshalb Antwort in Milliarden, nicht in Quintillionen ist. Ich konnte die Wahrscheinlichkeit mit Ihrem Skript nicht überprüfen PV = 2 ** 128; SS = 2 ** 64 : OverflowError: long int ist zu groß, um in int konvertiert zu werden
hinzugefügt der Autor Kornel, Quelle
Nicht streng zutreffend. Die Wahrscheinlichkeit einer Kollision ist viel höher als diese, da eine neue URL möglicherweise mit einem vorhandenen Element in der Tabelle kollidieren könnte. Siehe Dieser Beitrag (Disclaimer, ich habe ihn geschrieben) für einen Lauf- auf die Mathematik, und ein kleines Python-Skript, das angepasst werden kann, um die Wahrscheinlichkeit für eine bestimmte Anzahl von URLs zu berechnen.
hinzugefügt der Autor ConcernedOfTunbridgeWells, Quelle
Leider hast du immer noch nicht Recht. Sie gehen davon aus, dass die Hash-Funktion wirklich zufällig ist. Es ist nicht. Dies bedeutet, dass die Kollisionswahrscheinlichkeit höher ist.
hinzugefügt der Autor Jørgen Fogh, Quelle
+1 für das Hinzufügen der Berechnung. Dies ist etwas genauer: http://www.google.com/search?q=2^64%2F100* (Sekunden + pro Jahr)
hinzugefügt der Autor Mathias Bynens, Quelle
(Dies bedeutet, dass im Durchschnitt 100 Millionen Hash-Dateien pro Sekunde benötigt werden, um eine Kollision zu erreichen.); falsch. Das bedeutet, dass Sie nach der Zeit seit 100 Jahren 6 Milliarden Dateien pro Sekunde hashen, 50% der erzeugten Hashes kollidieren mit zuvor generierten Hashes.
hinzugefügt der Autor yaauie, Quelle
+1, weil ich immer wissen wollte, wie man hinter 999 Billionen Lol zählt (und oh ja, deine Antwort war informativ)
hinzugefügt der Autor Kmeixner, Quelle
Intuitiv, wenn wir das Geburtstagsparadoxon ignorieren und nur eine ungefähre Lösung betrachten: Fügen Sie 2 ^ 64 Hashes in eine Liste ein. Fügen Sie dieser Liste einen weiteren Hash hinzu. Dieser eine Hash hat 1/2 ^ 128 mal 2 ^ 64 Chance einer Kollision, dh dass ein weiterer Hash einen 1/2 ^ 64 Chance einer Kollision. Fügen Sie jetzt weitere 2 ^ 64 Hashes zur Liste hinzu und Sie sollten eine Kollision bekommen. Machen Sie dieselbe Berechnung für 2 ^ 63 (und beachten Sie
hinzugefügt der Autor robocat, Quelle

S3 kann Unterverzeichnisse haben. Setzen Sie einfach ein "/" in den Schlüsselnamen, und Sie können auf die Dateien zugreifen, als ob sie in separaten Verzeichnissen wären. Ich verwende dies, um Benutzerdateien in separaten Ordnern basierend auf ihrer Benutzer-ID in S3 zu speichern.

Zum Beispiel: "mybucket/users/1234/somefile.jpg". Es ist nicht genau dasselbe wie ein Verzeichnis in einem Dateisystem, aber die S3-API hat einige Funktionen, die es fast gleich funktionieren lassen. Ich kann es bitten, alle Dateien aufzulisten, die mit "users/1234 /" beginnen, und es zeigt mir alle Dateien in diesem "Verzeichnis" an.

22
hinzugefügt
Dies sollte ein Inhalt sein, denke ich, da er die Frage nach der Wahrscheinlichkeit einer Kollision nicht beantwortet
hinzugefügt der Autor Ian Clark, Quelle

Also warte, ist es:

md5(filename) + timestamp

oder:

md5(filename + timestamp)

Wenn der erste, Sie sind am meisten Weg zu einem GUID, und ich würde mir keine Sorgen machen. Wenn letzteres, dann sehen Sie Kargs Beitrag darüber, wie Sie schließlich in Kollisionen geraten werden.

16
hinzugefügt
@BradThomas: Tut es nicht. Das MD5 Kollisionsrisiko ist dasselbe, egal ob es sich um den Dateinamen oder die Kombination von Dateiname + Zeitstempel handelt. Aber im ersten Szenario müssten Sie sowohl eine MD5-Kollision als auch eine Timestamp-Kollision haben.
hinzugefügt der Autor Vincent Hubert, Quelle
Dies ergibt immer noch eine 2 ^ (128 ^ 60) Chance einer Kollision mit zwei Benutzern pro Minute. Buchstäblich unbrauchbar.
hinzugefügt der Autor Berry M., Quelle
Bitte erläutern Sie, wie die Einbeziehung des Zeitstempels die Wahrscheinlichkeit einer Kollision erhöht
hinzugefügt der Autor Brad Thomas, Quelle
@BradThomas Um es deutlicher zu sagen: md5 (Dateiname) + timestamp reduziert das Kollisionsrisiko massiv, da Sie eine Kollision mit md5 für genau denselben Zeitstempel benötigen, um insgesamt eine Kollision zu haben. md5 (Dateiname + Zeitstempel) ist identisch mit md5 (Dateiname) , vorausgesetzt, dass der Dateiname zufällig ist (weil das Zufügen von Zufälligkeit zu etwas Zufälligem nur den einzelnen md5 ändert) Ergebnis und das Geburtstagsproblem besteht immer noch über alle MD5-Hashes).
hinzugefügt der Autor robocat, Quelle

Eine grobe Faustregel für Kollisionen ist die Quadratwurzel des Wertebereichs. Ihr MD5-Sig ist vermutlich 128 Bit lang, so dass Sie wahrscheinlich Kollisionen oberhalb von 2 ^ 64 Bildern sehen werden.

10
hinzugefügt
de.wikipedia.org/wiki/Birthday_Problem Weitere Informationen zum Problem.
hinzugefügt der Autor Georg Schölly, Quelle
Sie meinen wahrscheinlich 128 Bits, nicht 2 ^ 128. :-)
hinzugefügt der Autor JesperE, Quelle

Obwohl zufällige MD5-Kollisionen äußerst selten sind, können Ihre Benutzer, wenn sie Dateien bereitstellen (die wörtlich gespeichert werden), Kollisionen auslösen. Das heißt, sie können absichtlich zwei Dateien mit derselben MD5sum, aber unterschiedlichen Daten erstellen. Stellen Sie sicher, dass Ihre Anwendung diesen Fall auf eine sinnvolle Weise behandeln kann, oder verwenden Sie möglicherweise einen stärkeren Hash wie SHA-256.

7
hinzugefügt
die Verwendung eines Salzes würde sich um das Engineering-Problem des Benutzers kümmern, nein?
hinzugefügt der Autor StackOverflowed, Quelle
Es hängt davon ab, wie das Salz angewendet wird. Es müsste ein Präfix der vom Benutzer bereitgestellten Daten sein oder besser noch der Schlüssel für einen HMAC. Es ist wahrscheinlich immer noch eine gute Idee, die Verteidigung in der Tiefe zu üben.
hinzugefügt der Autor bdonlan, Quelle
Beachten Sie, obwohl SHA256 256 Bit lang ist, können Sie das Risiko von Kollisionen mit der Länge des Schlüssels, den Sie speichern, durch Abschneiden des SHA256 auf weniger Bits, z.B. Verwenden Sie SHA256, aber schneiden Sie sie auf 128 Bits ab (was sicherer ist als MD5, obwohl sie die gleiche Anzahl von Bits haben).
hinzugefügt der Autor robocat, Quelle

Während es aufgrund von Kollisionen gut bekannt gewordene Probleme mit MD5 gab, sind UNWÜRDIGE Kollisionen zwischen Zufallsdaten äußerst unwahrscheinliche selten . Auf der anderen Seite, wenn Sie auf den Dateinamen Hashing, das sind keine zufälligen Daten, und ich würde Kollisionen schnell erwarten.

3
hinzugefügt
Das einzige Problem, das ich mit dem Taylor-Beispiel habe, ist, dass jemand, der eine Kopie seiner Datenbank bekommt, wahrscheinlich die Kreditkartennummern mit Hilfe eines Rainbow-Tisches herausfinden könnte ...
hinzugefügt der Autor Sam Saffron, Quelle
Während ich nicht wählen würde, um MD5 für Kreditkarten zu verwenden, ist eine Rainbow-Tabelle aller gültigen Kreditkartennummern zwischen 10.000.000 (8 Ziffern ist die kleinste Kreditkarte, die ich gesehen habe) und 9.999.999.999.999.999 (größte 16-stellige Nummer) immer noch eine große Tabelle zu generieren. Es gibt wahrscheinlich einfachere Möglichkeiten, diese Zahlen zu stehlen.
hinzugefügt der Autor acrosman, Quelle

MD5 Kollision ist extrem unwahrscheinlich. Wenn Sie 9 Billionen MD5s haben, gibt es in 9 Billionen nur eine Chance, dass es zu einer Kollision kommt.

0
hinzugefügt
Viele der anderen Antworten sprechen über die Wahrscheinlichkeit einer Kollision, wenn man einen einen weiteren Gegenstand hinzufügt. Ich denke meine Antwort ist nützlicher, da es sich um die wahrscheinlich vom ganzen Tisch stammende Dupre handelt.
hinzugefügt der Autor Rick James, Quelle

Es spielt keine Rolle, wie wahrscheinlich es ist; es ist möglich. Es könnte bei den ersten beiden Dingen passieren, die du hashst (sehr unwahrscheinlich, aber möglich), also musst du Kollisionen von Anfang an unterstützen.

0
hinzugefügt
Es kann natürlich noch viele andere schlechte Dinge geben, die mit einer Wahrscheinlichkeit von 1/2 ^ 128 passieren können. Sie möchten vielleicht nicht aussortieren, worüber Sie sich Sorgen machen müssen.
hinzugefügt der Autor Will Dean, Quelle
Du kannst nicht ernst sein. Sie müssen 6 Milliarden Dateien pro Sekunde hacken, jede Sekunde für 100 Jahre, um gute Kollisionswahrscheinlichkeiten zu erhalten. Selbst wenn Sie sehr sehr unglücklich sind, würde wahrscheinlich mehr als die gesamte Kapazität von S3 länger als ein menschliches Leben gebraucht werden.
hinzugefügt der Autor Kornel, Quelle
Das Schlimmste, was hier passieren kann, ist ein Foto. Für eine relativ kleine Anzahl würde ich mir keine Sorgen machen. Wenn Ihre Software einen Autopiloten steuert, der ein Flugzeug landet, ist das eine andere Geschichte.
hinzugefügt der Autor Jim C, Quelle
Es ist Milliarden Mal wahrscheinlicher, dass Ihre Datenbank und ihre Backups ausfallen. Über Kollisionen lohnt es sich nicht zu sorgen.
hinzugefügt der Autor Artelius, Quelle
Nutzen Sie die Kollisionsschutzzeit, indem Sie einen Bunker bauen, um Ihren Server zu platzieren! Diese lästigen Meteore können dich treffen (sehr unwahrscheinlich, aber möglich), also musst du den Meteoritenschutz vom Betteln aus unterstützen.
hinzugefügt der Autor polvoazul, Quelle
Es würde 100 Jahre dauern, um eine 50% Kollisionswahrscheinlichkeit bei 6 G-Dateien/Sek. Zu erhalten. Sie haben eine gute Wahrscheinlichkeit der Kollision vor Jahrzehnten.
hinzugefügt der Autor user327961, Quelle