Ich habe eine Bildbibliothek auf Amazon S3. Für jedes Bild md5 ich die Quell-URL auf meinem Server plus einen Zeitstempel, 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 mir Gedanken über Kollisionen im MD5-Hashwert machen, die erzeugt werden?
Bonus: Wie viele Dateien könnte ich haben, bevor Kollisionen im von MD5 erzeugten Hashwert auftreten?
Antworten:
Die Wahrscheinlichkeit, dass nur zwei Hashes versehentlich kollidieren, beträgt 1/2 128, was 1 zu 340 Undecillion 282 Decillion 366 Nonillion 920 Octillion 938 Septillion 463 Sextillion 463 Billionen 374 Billiarden 607 Billionen 431 Milliarden 768 Millionen 211 Tausend 456 entspricht.
Wenn Sie jedoch alle Hashes behalten, ist die Wahrscheinlichkeit dank des Geburtstagsparadoxons etwas höher . Um eine 50% ige Chance zu haben, dass ein Hash mit einem anderen Hash kollidiert, benötigen Sie 2 64 Hashes. Dies bedeutet, dass Sie für eine Kollision im Durchschnitt 100 Jahre lang 6 Milliarden Dateien pro Sekunde hashen müssen .
quelle
1 - sPn/s^n
, wos
die Größe des Suchraums (2^128
in diesem Fall) undn
die Anzahl der gehashten Elemente ist. Was Sie wahrscheinlich denken2^64
, ist die ungefähre Anzahl von Elementen, die Sie für MD5-Hash benötigen, um eine 50% ige Kollisionswahrscheinlichkeit zu haben.S3 kann Unterverzeichnisse haben. Geben Sie einfach ein "/" in den Schlüsselnamen ein, und Sie können auf die Dateien zugreifen, als wären sie in separaten Verzeichnissen. 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 das gleiche wie ein Verzeichnis in einem Dateisystem, aber die S3-API verfügt über einige Funktionen, mit denen es fast gleich funktioniert. Ich kann ihn bitten, alle Dateien aufzulisten, die mit "users / 1234 /" beginnen, und es werden mir alle Dateien in diesem "Verzeichnis" angezeigt.
quelle
Also warte, ist es:
oder:
Wenn erstere, sind Sie meistens auf dem Weg zu einer GUID, und ich würde mir darüber keine Sorgen machen. Wenn letzteres der Fall ist, lesen Sie Kargs Beitrag darüber, wie Sie schließlich auf Kollisionen stoßen werden.
quelle
md5(filename) + timestamp
Reduziert das Kollisionsrisiko massiv, da Sie eine MD5-Kollision benötigen würden, damit genau derselbe Zeitstempel eine Kollision insgesamt hat.md5(filename + timestamp)
ist dasselbe wiemd5(filename)
unter der Annahme, dass der Dateiname zunächst zufällig ist (da das Hinzufügen von mehr Zufälligkeit zu etwas Zufälligem nur das individuelle md5-Ergebnis ändert und das Geburtstagsproblem immer noch in allen md5-Hashes besteht).Eine grobe Faustregel für Kollisionen ist die Quadratwurzel des Wertebereichs. Ihr MD5-Sig ist vermutlich 128 Bit lang, sodass Sie wahrscheinlich Kollisionen über 2 ^ 64 Bilder hinaus sehen werden.
quelle
Obwohl zufällige MD5-Kollisionen äußerst selten sind, können Ihre Benutzer Kollisionen entwickeln, wenn sie Dateien bereitstellen können (die wörtlich gespeichert werden). Das heißt, sie können absichtlich zwei Dateien mit derselben MD5-Summe, aber unterschiedlichen Daten erstellen. Stellen Sie sicher, dass Ihre Anwendung diesen Fall auf vernünftige Weise behandeln kann, oder verwenden Sie möglicherweise einen stärkeren Hash wie SHA-256.
quelle
Während es aufgrund von Kollisionen gut bekannt gewordene Probleme mit MD5 gab, sind unbeabsichtigte Kollisionen zwischen zufälligen Daten äußerst selten . Auf der anderen Seite, wenn Sie den Dateinamen hashen, sind das keine zufälligen Daten, und ich würde Kollisionen schnell erwarten.
quelle
Es spielt keine Rolle, wie wahrscheinlich es ist; es ist möglich. Es könnte bei den ersten beiden Dingen passieren, die Sie hashen (sehr unwahrscheinlich, aber möglich), daher müssen Sie Kollisionen von Anfang an unterstützen.
quelle
Eine MD5-Kollision ist äußerst unwahrscheinlich. Wenn Sie haben 9 Billionen MD5 haben, gibt es nur eine Chance in 9 Billionen, dass es zu einer Kollision kommt.
quelle