Ist MD5 immer noch gut genug, um Dateien eindeutig zu identifizieren?

139

Wird das Hashing einer Datei durch MD5 immer noch als ausreichend gute Methode angesehen, um sie eindeutig zu identifizieren, da der MD5-Algorithmus und Sicherheitsprobleme usw. nicht mehr funktionieren? Sicherheit ist hier nicht mein Hauptanliegen, aber die eindeutige Identifizierung jeder Datei ist.

Irgendwelche Gedanken?

Ranhiru Jude Cooray
quelle
2
Ich verwende es derzeit selbst in einer meiner Anwendungen, und soweit mir bekannt ist, ist es gut genug, um Dateien eindeutig zu identifizieren.
Nicht verfügbar
2
Sie werden diese Frage wahrscheinlich finden: stackoverflow.com/questions/862346/… nützlich.
Scharfzahn
Wie viele Dateien müssen Sie identifizieren? Es gibt 128 Bit aus. Wenn Sie also versuchen, einige Tausend Dateien zu identifizieren, ist dies in Ordnung. Aber wenn Sie versuchen, viel mehr als das zu identifizieren, stoßen Sie möglicherweise auf Kollisionen / das Geburtstagsparadoxon.
Marcin
Es werden Bilddateien, JPGs, PNGs und GIFs sein. Und ja, ich denke, das Limit wäre ein paar Tausend ... Aber wie viele Dateien werden mir Ihrer Meinung nach Probleme bereiten?
Ranhiru Jude Cooray
Siehe auch
NeDark

Antworten:

89

Ja. MD5 wurde aus Sicherheitsgründen vollständig zerstört, aber die Wahrscheinlichkeit einer versehentlichen Kollision ist immer noch verschwindend gering. Stellen Sie nur sicher, dass die Dateien nicht von jemandem erstellt werden, dem Sie nicht vertrauen und der möglicherweise böswillige Absichten hat.

Marcelo Cantos
quelle
2
@none: Ihre erste Frage finden Sie hier . Ich fürchte, ich verstehe die anderen Fragen nicht.
Marcelo Cantos
9
@ 0xA3: Weder Sie noch ich haben eine Ahnung, auf welche Dateien sich das OP bezieht oder wie viel Schaden ein Kompromiss verursachen würde. Nach allem, was wir wissen, könnte es die Baby-Fotosammlung ihres Kindes sein. Mein Ziel ist es, die Fakten zu liefern; Was jemand anderes mit ihnen macht, ist ihre Sache. Denken Sie auch daran, dass Bruce Schneier empfiehlt , Ihr Passwort aufzuschreiben. Nicht alles muss in Fort Knox aufbewahrt werden. Einige Dinge halten sich gut unter dem Blumentopf.
Marcelo Cantos
3
@Marcelo Cantos, ich denke, was hier fehlt, ist eine Differenzierung oder Auspackung des Begriffs "Sicherheit". Offensichtlich gehen die Leute von "Sicherheit" für jede Verwendung von Prüfsummenarbeit aus, aber die Nomenklatur, die Marcelo wahrscheinlich bedeutet, ist "in einem Labor".
HPVC
5
Ich bin absolut anderer Meinung. Ein anderer Hashwert gibt an, dass die Dateien unterschiedlich sind. Aber für einen gleichen Hashwert: Sie können nicht sagen "es ist sehr wahrscheinlich, dass beide gleich sind", wenn der Hash gleich ist: Sie können nur Byte für Byte vergleichen. Ein Hash ist viele Größenordnungen kleiner als die Anzahl der verschiedenen Werte für die gesamte Datei, daher gibt es für jeden Hash viele, viele, viele mögliche Kollisionen. Nur wenn Sie eine bekannte Datei (mit einem bekannten Hash) kopieren, bedeutet ein identischer Hash-Wert "wahrscheinlich", dass der zweite korrekt kopiert wurde (selbst dann ist es nicht 100% sicher, aber sehr wahrscheinlich).
Olivier Dulac
3
OK, meine Mathematik ist scheiße. GUIDs haben ungefähr 122 Entropiebits, und daher beträgt die Wahrscheinlichkeit einer Kollision irgendwo in einer Milliarde Dateien ungefähr 2 ^ (2 * 30 - 122) = 2 ^ -62. Dies ist zwar viel höher als meine ursprüngliche Berechnung, aber es ist immer noch winzig bei ungefähr eins in 4 Billionen.
Marcelo Cantos
32

Aus praktischen Gründen mag der erstellte Hash angemessen zufällig sein, aber theoretisch besteht aufgrund des Pigeonhole-Prinzips immer die Wahrscheinlichkeit einer Kollision . Unterschiedliche Hashes bedeuten sicherlich, dass die Dateien unterschiedlich sind, aber der gleiche Hash bedeutet nicht unbedingt, dass die Dateien identisch sind.

Die Verwendung einer Hash-Funktion für diesen Zweck - unabhängig davon, ob die Sicherheit ein Problem darstellt oder nicht - sollte daher immer nur der erste Schritt einer Überprüfung sein, insbesondere wenn bekannt ist, dass der Hash-Algorithmus leicht Kollisionen erzeugt. Um zuverlässig herauszufinden, ob zwei Dateien mit demselben Hash unterschiedlich sind, müssen Sie diese Dateien Byte für Byte vergleichen.

Stapeluberlauf
quelle
16
@ Ranhiru. Nein. Der Hash gibt Ihnen einen 'Zusammenfassungs'-Wert, der (für MD5) nur 16 Bytes lang ist. Um sicherzustellen, dass die Dateien identisch sind, müssen Sie eine byteweise Überprüfung durchführen. Dies gilt unabhängig davon, welchen Hash-Algorithmus Sie wählen. Es besteht immer die Möglichkeit einer Kollision.
PaulG
6
@ Ranhiru. Lesen Sie diese Antwort noch einmal durch, es ist imho die umfassendste hier. Hashing kann als erster Schritt verwendet werden, der Ihnen die Gewissheit gibt, dass die Dateien identisch sind. Wenn Sie jedoch absolut 100% sicher sein möchten, müssen Sie eine byteweise Überprüfung durchführen. Dies gilt unabhängig davon, ob Sie MD5, SHA oder einen anderen Algorithmus verwenden.
PaulG
7
Diese Antwort ist falsch. Die Verhinderung von Manipulationen und die Überprüfung der Eindeutigkeit sind dasselbe. Auch wenn Hashing keine Eindeutigkeit garantiert, garantiert dies auch keinen tatsächlichen Vergleich. Tatsächlich ist die Wahrscheinlichkeit, dass ein Hash versehentlich kollidiert, tatsächlich geringer als die Wahrscheinlichkeit, dass der Vergleich aufgrund von Störungen in der CPU fehlschlägt, die durch normale Sonnengammastrahlenemissionen erzeugt werden. Und vergessen Sie nicht, dass die einzige Quelle der Datei häufig auf der anderen Seite der Welt in einem Webserver liegt und die einzige unabhängige Information, die Sie zu Vergleichszwecken haben, der Hash ist.
Marcelo Cantos
8
@ Marcelo. Es ist nicht logisch zu argumentieren, dass eine versehentliche Kollision weniger wahrscheinlich ist als ein versehentliches Umdrehen von Bits (während ein Byte-für-Byte-Vergleich durchgeführt wird). Sie haben immer noch die gleiche Chance auf Bitflips beim Erstellen des Hashs (und wahrscheinlich mehr, da mehr Verarbeitungszeit erforderlich ist). @Thomas hat den Punkt ursprünglich angesprochen, um darauf hinzuweisen, dass es keine garantierte Möglichkeit gibt, die Eindeutigkeit zu identifizieren, obwohl die Auswirkungen von Bitflips höchst umstritten sind. Die pessimistischste Schätzung ist 1 Flip pro GB / Stunde, und der ECC-RAM würde sogar das entfernen.
PaulG
2
"Die Wahrscheinlichkeit, dass ein Hash versehentlich kollidiert, ist tatsächlich geringer als die Wahrscheinlichkeit, dass der Vergleich aufgrund von Störungen in der CPU fehlschlägt, die durch normale Sonnengammastrahlenemissionen verursacht werden" [Zitat erforderlich]
Endolith
20

MD5 ist gut genug, wenn Sie keinen Gegner haben. Jemand kann jedoch (absichtlich) zwei unterschiedliche Dateien erstellen, die denselben Wert haben (dies wird als Kollision bezeichnet), und dies kann abhängig von Ihrer genauen Situation ein Problem sein oder auch nicht.

Da es eine subtile Angelegenheit ist, zu wissen, ob bekannte MD5-Schwachstellen für einen bestimmten Kontext gelten, wird empfohlen, MD5 nicht zu verwenden. Die Verwendung einer kollisionssicheren Hash-Funktion (SHA-256 oder SHA-512) ist die sichere Antwort. Die Verwendung von MD5 ist auch eine schlechte Öffentlichkeitsarbeit (wenn Sie MD5 verwenden, müssen Sie sich rechtfertigen müssen; während niemand Ihre Verwendung von SHA-256 in Frage stellt).

Thomas Pornin
quelle
2
Diese Antwort kann etwas irreführend sein, wenn der Leser mit Hashing nicht allzu vertraut ist. Es gibt nichts Magisches an SHA dass verhindert Hash - Kollisionen, sie sind nur resistenter gegen Hashkollision Angriffe . Wenn Sie mehr als 99,999 ^ e% sicher sein möchten, dass Dateien identisch sind, benötigen Sie immer noch eine byteweise Überprüfung.
PaulG
7
Tatsächlich kann ein Byte-zu-Byte-Vergleich fehlschlagen, weil ein kosmischer Strahl ein wenig umdreht (z. B. a return 0;in a umwandelt return 1;). Dies ist höchst unwahrscheinlich, aber das Risiko einer Kollision mit SHA-256 ist noch geringer. Mathematisch gesehen können Sie nicht sicher sein, dass zwei Dateien mit demselben Wert identisch sind, aber Sie können sich auch nicht sicher sein, indem Sie die Dateien selbst vergleichen, solange Sie einen Computer für den Vergleich verwenden. Was ich damit meine ist, dass es bedeutungslos ist, über 99,999 hinauszugehen ... 9% Sicherheit, und SHA-256 bietet bereits mehr als das.
Thomas Pornin
2
Was, Sie verwenden keinen ECC-Speicher? ;). Guter Kommentar, sehr interessante Gedanken.
PaulG
1
Vergessen Sie nicht den Alufolienhut! Im Ernst, woher kennen Sie diese Faktoide über Kollisionen und haben Sie dies auf irgendeine Weise überprüft?
James P.
@ThomasPornin Cosmic Ray Bit Flips würden auch die MD5-Methode beeinflussen, daher ist es noch schlimmer.
Endolith
9

Ein md5 kann Kollisionen erzeugen. Theoretisch kann eine Million Dateien hintereinander denselben Hash erzeugen, obwohl dies höchst unwahrscheinlich ist. Testen Sie Ihr Glück nicht und suchen Sie nach MD5-Kollisionen, bevor Sie den Wert speichern.

Ich persönlich mag es, md5 von zufälligen Zeichenfolgen zu erstellen, was den Aufwand für das Hashing großer Dateien verringert. Wenn Kollisionen gefunden werden, iteriere ich und hashe erneut mit dem angehängten Schleifenzähler.

Sie können nach dem Pigeonhole-Prinzip lesen .

afilina
quelle
6

Ich würde es nicht empfehlen. Wenn die Anwendung auf einem Mehrbenutzersystem funktionieren würde, könnte es einen Benutzer geben, der zwei Dateien mit demselben MD5-Hash hat (er könnte Ingenieur sein und mit solchen Dateien spielen oder einfach nur neugierig sein - sie können leicht von http: / heruntergeladen werden /www2.mat.dtu.dk/people/S.Thomsen/wangmd5/samples.html , ich selbst habe beim Schreiben dieser Antwort zwei Beispiele heruntergeladen). Eine andere Sache ist, dass einige Anwendungen solche Duplikate aus irgendeinem Grund speichern könnten (ich bin nicht sicher, ob es solche Anwendungen gibt, aber die Möglichkeit besteht).

Wenn Sie von Ihrem Programm generierte Dateien eindeutig identifizieren, ist die Verwendung von MD5 in Ordnung. Ansonsten würde ich jede andere Hash-Funktion empfehlen, bei der noch keine Kollisionen bekannt sind.

tach
quelle
2

Persönlich denke ich, dass Leute rohe Prüfsummen (wählen Sie Ihre Methode) anderer Objekte verwenden, um viel zu viel als eindeutige Bezeichner zu fungieren, wenn sie wirklich eindeutige Bezeichner haben möchten. Das Fingerabdrucken eines Objekts für diese Verwendung war nicht die Absicht und erfordert wahrscheinlich mehr Nachdenken als die Verwendung einer UUID oder eines ähnlichen Integritätsmechanismus.

hpavc
quelle
0

MD5 ist defekt, Sie könnten stattdessen SHA1 verwenden (in den meisten Sprachen implementiert)

Guillaume Lebourgeois
quelle
Dies ist eine sehr gute Antwort. MD5 ist ab Mai 2018 für Anwendungsfälle im Bereich Recht und Rechnungswesen in Europa nicht mehr akzeptabel.
Bert Sinnema
@ BertSinnema Könnten Sie mich bitte auf die Quelle verweisen, die definiert, welche Hash-Funktionen akzeptabel sind usw.?
berezovskyi
@ GregSchmit vielleicht, weil OP sich nicht um die kryptografische Stärke an sich kümmerte. Ich verstand die Frage als "Ich verwende MD5 bereits in einem nicht sicherheitsrelevanten Kontext. Muss ich Zeit aufwenden, um den Code zu aktualisieren?" Art der Sache. Und in diesem Zusammenhang war die Antwort wahrscheinlich falsch und SHA1 wurde seitdem ebenfalls gebrochen.
berezovskyi
0

Wenn Sie kurze (<einige K?) Zeichenfolgen (oder Dateien) hashen, können Sie zwei md5-Hash-Schlüssel erstellen, einen für die eigentliche Zeichenfolge und einen zweiten für die Umkehrung der mit einer kurzen asymmetrischen Zeichenfolge verketteten Zeichenfolge. Beispiel: md5 (umgekehrt (Zeichenfolge || '1010')). Durch Hinzufügen der zusätzlichen Zeichenfolge wird sichergestellt, dass selbst Dateien, die aus einer Reihe identischer Bits bestehen, zwei verschiedene Schlüssel generieren. Bitte haben Sie Verständnis dafür, dass selbst unter diesem Schema die theoretische Wahrscheinlichkeit besteht, dass die beiden Hash-Schlüssel für nicht identische Zeichenfolgen identisch sind, die Wahrscheinlichkeit jedoch außerordentlich gering erscheint - etwas in der Größenordnung des Quadrats der einzelnen md5-Kollisionswahrscheinlichkeit und der Zeitersparnis kann beträchtlich sein, wenn die Anzahl der Dateien zunimmt. Ausgefeiltere Schemata zum Erstellen der zweiten Zeichenfolge könnten ebenfalls in Betracht gezogen werden:

Um nach Kollisionen zu suchen, kann dieser Test auf die Eindeutigkeit der md5-Hash-Schlüssel für alle bit_vectors in einer Datenbank ausgeführt werden:

Wählen Sie md5 (bit_vector), count (*), bit_and (bit_vector) aus db mit bit_vector
group durch md5 (bit_vector), bit_vector mit bit_and (bit_vector) <> bit_vector

Marco Polo
quelle
Kluge Idee. Wenn ein "Angreifer" eine gefälschte Datei mit demselben MD5-Hash erstellt, hilft dies nur, wenn er Ihr "Salting" kennt und das Umkehren des Inhalts einen anderen Hash erzeugt. Die Verwendung von 2 solchen MD5-Schlüsseln würde die Gewinnchancen erheblich verringern. Wenn es nur darum geht, einen "Angriff" mit einem Salz vor der lokalen Berechnung zu verhindern, reicht dies aus.
Wolf5
0

Ich stelle mir MD5 gerne als Indikator für die Wahrscheinlichkeit vor, wenn eine große Menge von Dateidaten gespeichert wird.

Wenn die Hashes gleich sind, weiß ich, dass ich die Dateien byteweise vergleichen muss, aber das kann aus falschen Gründen nur ein paar Mal passieren, andernfalls (Hashes sind nicht gleich) kann ich sicher sein, dass es sich um zwei verschiedene Dateien handelt .

Shimmy Weitzhandler
quelle