Bedeutet ein identischer kryptografischer Hash oder eine identische Prüfsumme für zwei Dateien, dass sie identisch sind?

57

Ich habe 2 Excel-Dokumente und möchte überprüfen, ob sie bis auf den Dateinamen genau gleich sind.

Zum Beispiel heißen die Dateien fileone.xlsund filetwo.xls. Abgesehen von den Dateinamen wird davon ausgegangen, dass deren Inhalt identisch ist, aber das ist es, was ich überprüfen möchte.

Ich habe nach Möglichkeiten gesucht, dies zu überprüfen, ohne eine Reihe von Plugins zu installieren. Es scheint keinen direkten Weg zu geben.

Ich habe versucht, MD5-Hashes für beide Dateien zu generieren. Wenn die Hashes identisch sind, bedeutet dies, dass der Dateiinhalt 1: 1 identisch ist?

Sam
quelle
8
Kryptohashes und manchmal sogar normale Hashes können nützlich sein, um Dateien auf verschiedenen Systemen zu vergleichen oder eine große Anzahl von Dateien zu durchsuchen. Wenn sich jedoch zwei Dateien auf demselben System befinden, können Sie sie einfach mit cmpUnix oder fc(Datei vergleichen) unter Windows vergleichen.
dave_thompson_085
10
shattered.io - SHA1 ist ein „stärker“ Hashing - Algorithmus als md5 und noch shattered.io/static/shattered-1.pdf und shattered.io/static/shattered-2.pdf den gleichen Hash - Wert haben , während völlig anders zu sein.
Styropor fliegen
30
Randnotiz: Überprüfen Sie zuerst ihre Größe. Wenn sie unterschiedliche Größen haben, müssen Sie die Dateien nicht öffnen, sie sind unterschiedlich.
Emilio M Bumachar
42
Vereinfachte Version: Ein MD5-Hash ist gut genug, um sich vor einem Unfall zu schützen . Es ist nicht gut genug, um sich vor böswilliger Absicht zu schützen . Ob das für Sie gut genug ist, müssen Sie anhand Ihrer Umstände entscheiden.
Euro Micelli
9
diff -s file1 file2Wenn angegeben wird, dass sie identisch sind, sind sie identisch (tatsächlich werden die Dateien Byte für Byte verglichen, sodass selbst Hash-Kollisionen ausgeschlossen sind). Prüfsummen werden verwendet, wenn Sie nur einen Hash und ein Element haben, von dem angenommen wird, dass es mit dem Urheber dieses Hash identisch ist.
Bakuriu

Antworten:

93

Wenn die Hashes identisch sind, bedeutet dies, dass der Dateiinhalt 1: 1 identisch ist?

Alle Dateien sind eine Sammlung von Bytes (Werte 0-255). Wenn zwei MD5-Hashes übereinstimmen, sind diese beiden Byte-Sammlungen höchstwahrscheinlich identisch (gleiche Reihenfolge, gleiche Werte).

Es ist sehr unwahrscheinlich, dass zwei Dateien dasselbe MD5 generieren, das ist ein 128-Bit-Hash. Die Wahrscheinlichkeit ist:

Wahrscheinlichkeit von nur zwei Hashes versehentlich kollidiert ist 1/2 128 der 1 ist in 340 Undecillion 282 decillion 366 nonillion 920 octillion 938 septillion 463 sextillion 463 Trillionen 374 Billi 607 Billionen 431 Milliarden 768 Millionen 211 Tausend 456. (von einer Antwort auf Stackoverflow .)

Hashes sollen "nur in eine Richtung" funktionieren - dh Sie nehmen eine Sammlung von Bytes und erhalten einen Hash, aber Sie können keinen Hash nehmen und eine Sammlung von Bytes zurückerhalten.

Die Kryptographie hängt davon ab (es ist eine Möglichkeit, zwei Dinge zu vergleichen, ohne zu wissen, was diese Dinge sind.)

Um das Jahr 2005 herum wurden Methoden entdeckt, um einen MD5-Hash zu verwenden und Daten zu erstellen, die mit dem Hash übereinstimmen. Dabei werden zwei Dokumente erstellt, die denselben MD5-Hash aufweisen ( Kollisionsangriff ). Siehe @ user2357112's Kommentar unten. Dies bedeutet, dass ein Angreifer beispielsweise zwei ausführbare Dateien erstellen kann, die dasselbe MD5 haben. Wenn Sie abhängig von MD5 bestimmen, welchem ​​Sie vertrauen möchten, werden Sie getäuscht.

Daher sollte MD5 nicht für Kryptografie oder Sicherheit verwendet werden. Es ist schlecht, ein MD5 auf einer Download-Site zu veröffentlichen, um beispielsweise die Download-Integrität sicherzustellen. Abhängig von einem MD5-Hash, den Sie nicht selbst generiert haben, um zu überprüfen, ob Datei- oder Dateninhalte vorhanden sind, möchten Sie dies vermeiden.

Wenn Sie Ihre eigenen erstellen, wissen Sie, dass Sie sich selbst (hoffentlich) nicht bösartig gegenüberstehen. Für Ihre Verwendung ist es in Ordnung, aber wenn Sie möchten, dass jemand anderes es reproduzieren kann und Sie den MD5-Hash öffentlich veröffentlichen möchten, sollten Sie einen besseren Hash verwenden.


Beachten Sie, dass zwei Excel-Dateien dieselben Werte in denselben Zeilen und Spalten enthalten können, der Bytestream der Datei jedoch aufgrund unterschiedlicher Formatierungen, Stile, Einstellungen usw. völlig unterschiedlich sein kann.

Wenn Sie die Daten in der Datei vergleichen möchten, exportieren Sie sie zuerst mit denselben Zeilen und Spalten in die CSV-Datei, um alle Formatierungen zu entfernen und dann die CSV-Dateien zu hashen oder zu vergleichen.

LawrenceC
quelle
107
Excel-Dateien und andere Office-Dokumente können auch unterschiedliche Hashes aufweisen, da sie geöffnet und erneut gespeichert wurden, ohne dass Änderungen vorgenommen wurden, da in den Metadaten der Datei ein neuer Wert für die zuletzt gespeicherte Datums- / Uhrzeitangabe gespeichert wurde.
BeowulfNode42
29
Bonus: Wenn Sie nach CSV exportiert haben, können Sie das altehrwürdige diffoder ein ähnliches Dienstprogramm verwenden, um tatsächlich zu bestätigen, dass die Dateien Byte für Byte identisch sind, anstatt nur denselben Hash zu haben.
Monty Harder
18
Ein Hash zu nehmen und Daten zu erstellen, die mit dem Hash übereinstimmen, ist ein Pre-Image-Angriff. Ich glaube, MD5 ist derzeit anfällig für Kollisionsangriffe, aber ich glaube nicht, dass Pre-Image- oder Second-Pre-Image-Angriffe derzeit realisierbar sind.
user2357112
2
@ Tim was sagst du? Er sagte: Exportiere sie nach CSV und diff -süberprüfe, ob die CSV identisch sind. In der Tat können Sie diff -ssogar die Excel-Dateien: Wenn diffgesagt wird, dass sie identisch sind, müssen Sie nicht zum CSV-Vergleich gehen.
Bakuriu
2
@ Bakuriu Offensichtlich war mein Kommentar sehr schlecht formuliert - ich meinte, beim Exportieren in CSV gehen viele Informationen verloren - insbesondere Formeln, Diagramme, bedingte und Standardformatierungen.
Tim
37

In der Praxis bedeutet ein identischer kryptografischer Hash, dass die Dateien identisch sind, sofern sie nicht von einem Angreifer oder einer anderen böswilligen Entität erstellt wurden. Die Wahrscheinlichkeit, dass zufällige Kollisionen mit einer gut konzipierten kryptografischen Hash-Funktion auftreten, ist so gering, dass sie in der Praxis und bei Abwesenheit eines aktiven Angreifers vernachlässigbar sind.

Im Allgemeinen können wir jedoch nicht sagen, dass zwei beliebige Dateien mit demselben Hash definitiv bedeuten, dass sie identisch sind.

Die Funktionsweise einer kryptografischen Hash-Funktion besteht darin, eine Eingabe beliebiger Länge zu übernehmen und einen aus der Eingabe berechneten Wert fester Länge auszugeben. Einige Hash-Funktionen haben mehrere Ausgabelängen zur Auswahl, aber die Ausgabe ist bis zu einem gewissen Grad immer noch ein Wert mit fester Länge. Dieser Wert kann bis zu ein paar Dutzend Bytes lang sein. Die heute gebräuchlichsten Hash-Algorithmen mit dem längsten Ausgabewert haben eine 512-Bit-Ausgabe und eine 512-Bit-Ausgabe beträgt 64 Byte.

Wenn eine Eingabe in eine Hash-Funktion länger ist als die Ausgabe der Hash-Funktion, muss eine gewisse Genauigkeit entfernt werden, damit die Eingabe in die Ausgabe passt. Infolgedessen müssen mehrere Eingänge vorhanden sein, deren Länge größer ist als die Länge des Ausgangs, und die den gleichen Ausgang erzeugen.

Nehmen wir als Beispiel das aktuelle Arbeitstier SHA-256. Es gibt einen Hash von 256 Bits oder 32 Bytes aus. Wenn Sie zwei Dateien haben, die jeweils genau 32 Byte lang, aber unterschiedlich sind, sollten diese (unter der Annahme, dass kein Fehler im Algorithmus vorliegt) unterschiedliche Werte haben, unabhängig vom Inhalt der Dateien. In mathematischer Hinsicht ist der Hash eine Funktion, die einen 2 256- Eingaberaum auf einen 2 256- Ausgaberaum abbildet, was ohne Kollisionen möglich sein sollte. Wenn Sie jedoch zwei Dateien mit einer Länge von jeweils 33 Byte haben, muss eine Kombination von Eingaben vorhanden sein, die für beide Dateien denselben 32-Byte-Ausgabehashwert ergeben, da wir jetzt einen 2 264- Eingabebereich auf eine 2 256- Datei abbildenAusgaberaum; hier können wir leicht erkennen, dass es durchschnittlich 2 8 Eingänge für jeden einzelnen Ausgang geben sollte. Gehen Sie noch weiter, und bei 64-Byte-Dateien sollten für jeden einzelnen Ausgang 2 256 Eingänge vorhanden sein!

Kryptografische Hash-Funktionen sind so konzipiert, dass es schwierig ist , eine Eingabe zu erstellen, die eine bestimmte Ausgabe ergibt, oder zwei Eingaben zu erstellen, die dieselbe Ausgabe ergeben. Dies ist bekannt als Urbild Angriff Widerstand oder Kollision Angriff Widerstand . Es ist nicht unmöglich , diese Kollisionen zu finden. Es soll nur wirklich, wirklich, wirklich, wirklich schwer sein. (Ein kleiner Sonderfall eines Kollisionsangriffs ist ein Geburtstagsangriff .)

Einige Algorithmen können Angreifern besser widerstehen als andere. MD5 wird heutzutage allgemein als komplett kaputt angesehen, aber zuletzt hatte es immer noch eine ziemlich gute Beständigkeit gegen das erste Bild . SHA-1 wird ebenfalls effektiv gebrochen; Präimage-Angriffe wurden demonstriert, erfordern jedoch bestimmte Bedingungen, obwohl es keinen Grund zu der Annahme gibt, dass dies auf unbestimmte Zeit der Fall sein wird. Angriffe werden immer besser und nie schlimmer. SHA-256/384/512 werden derzeit noch für die meisten Zwecke als sicher angesehen. Aber wenn Sie, sind nur daran interessiert, wenn zwei Nicht- in böser Absicht erstellten, gültigDateien sind die gleichen, dann sollte eine dieser Dateien ausreichen, da der Eingabebereich bereits so begrenzt ist, dass Sie sich hauptsächlich für zufällige Kollisionen interessieren. Wenn Sie Grund zu der Annahme haben, dass die Dateien in böswilliger Absicht erstellt wurden, müssen Sie mindestens eine derzeit als sicher geltende kryptografische Hash-Funktion verwenden, die den unteren Balken auf SHA-256 setzt.

Das erste Vorbild ist, eine Eingabe zu finden, die einen bestimmten Ausgabehashwert ergibt. Das zweite Vorbild ist, einen Eingang zu finden, der den gleichen Ausgang liefert wie ein anderer, spezifizierter Eingang. Eine Kollision besteht darin, zwei Eingaben zu finden, die dieselbe Ausgabe ergeben, unabhängig davon, was das ist, und manchmal unabhängig davon, was die Eingaben sind.

Dabei ist zu beachten, dass die Dateien möglicherweise sehr unterschiedliche Datendarstellungen aufweisen und dennoch exakt gleich angezeigt werden. So können sie zu sein scheinen das gleiche , obwohl ihre Verschlüsselungs Hashes nicht übereinstimmen, aber wenn die Hashes übereinstimmen , dann sind sie sehr wahrscheinlich die gleiche erscheinen.

ein CVn
quelle
2
Wenn die Hashes übereinstimmen, sind die Dateien entweder das Ergebnis einer absichtlichen Kollision, oder sie sind es nicht, und es wird garantiert , dass sie gleich sind. Die Wahrscheinlichkeit einer zufälligen Kollision ist rein theoretisch. Zu sagen, dass "wenn die Hashes übereinstimmen, dann werden sie höchstwahrscheinlich gleich angezeigt", ist irreführend: Wenn Böswilligkeit im Gange ist und es sich um eine Kollisionssituation handelt, werden sie wahrscheinlich nicht gleich sein, und andernfalls ist die Wahrscheinlichkeit effektiv Null Es handelt sich nicht um ein Ereignis mit geringer Wahrscheinlichkeit, gegen das verteidigt werden muss.
Gilles 'SO- hör auf böse zu sein'
9
@ Gilles: Im Gegenteil. Michaels Wortlaut ist genau richtig und "garantiert" ist irreführend (oder tatsächlich falsch). Die Wahrscheinlichkeit, dass zwei Dateien mit identischen Hashes nicht übereinstimmen (trotz böswilliger Änderung), ist äußerst gering und kann in der Praxis vernachlässigt werden. Es ist jedoch nicht Null . Es ist im Allgemeinen eine Chance, dass aus irgendeinem Grunde verschiedene Eingaben werden den gleichen Hash produzieren und möglicherweise sogar mit einer Wahrscheinlichkeit viel höher als 2 ^ -128 (Verschlüsselungsalgorithmen sind schwarze Kunst, die algortihm auf subtile, unbekannte Weise fehlerhaft sein kann und Wir können nicht 100% sicher sein).
Damon
5
@Gilles " effektiv null " ist immer noch nicht null , was bedeutet, dass es immer noch eine (zugegebenermaßen geringe) Wahrscheinlichkeit gibt, dass zwei verschiedene Datensätze zu demselben Hash führen. Dem kann man nicht widersprechen.
Attie
5
@Attie: Die Wahrscheinlichkeit, dass zwei nicht verwandte Dateien denselben Wert haben, liegt so weit unter der Wahrscheinlichkeit, dass viele andere Dinge schief gehen (z. B. zufällige Bitfehler, die Dateien auf der Festplatte beschädigen), dass es sich nicht lohnt, sich vor zufälligen Übereinstimmungen zu schützen. Der Schutz vor absichtlich entwickelten Spielen mag sich lohnen, aber zufällige Spiele sind so unwahrscheinlich, dass jeder Aufwand, der zum Schutz gegen sie aufgewendet wird, wahrscheinlich woanders besser sein könnte.
Supercat
3
@ Gilles falsch. Sie können mir nicht in einem Atemzug sagen, dass es eine Chance gibt, egal wie klein Sie es bewerten, dass es zu einer versehentlichen Kollision kommen kann, dann kann es im nächsten Grantee zu keiner Kollision kommen. Das zu sagen ist sehr irreführend, da es eine Eigenschaft des Hashing-Algorithmus impliziert, von der bereits bekannt ist, dass sie vollständig falsch ist.
Iheanyi
10

Es ist ein Wahrscheinlichkeitsspiel ... Hashes können eine endliche Anzahl von Werten darstellen.

Wenn wir einen hypothetischen (und sehr schwachen) 8-Bit-Hashing-Algorithmus betrachten, kann dies 256 verschiedene Werte darstellen. Wenn Sie anfangen, Dateien durch den Algorithmus zu führen, werden Sie beginnen, Hashes auszugeben ... aber in Kürze werden Sie " Hash-Kollisionen " sehen. Dies bedeutet, dass zwei verschiedene Dateien in den Algorithmus eingespeist wurden und derselbe Hashwert wie die Ausgabe erzeugt wurde. Hier ist der Hash eindeutig nicht stark genug, und wir können nicht behaupten, dass " Dateien mit übereinstimmenden Hashes den gleichen Inhalt haben ".

Das Erweitern der Größe des Hashs und die Verwendung stärkerer kryptografischer Hashing-Algorithmen können erheblich dazu beitragen, Kollisionen zu reduzieren und unser Vertrauen zu stärken, dass zwei Dateien mit demselben Hash den gleichen Inhalt haben.

Das heißt, wir können niemals 100% ige Sicherheit erreichen - wir können niemals mit Sicherheit behaupten , dass zwei Dateien mit demselben Hash wirklich den gleichen Inhalt haben.

In den meisten Situationen ist dies in Ordnung und das Vergleichen von Hashes ist " gut genug ", dies hängt jedoch von Ihrem Bedrohungsmodell ab.

Letztendlich würde ich Ihnen Folgendes empfehlen, wenn Sie das Sicherheitsniveau erhöhen müssen:

  1. Verwenden Sie starke Hashing-Algorithmen ( MD5 wird nicht mehr als angemessen angesehen, wenn Sie sich vor potenziell böswilligen Benutzern schützen müssen.)
  2. Verwenden Sie mehrere Hashing-Algorithmen
  3. Vergleichen Sie die Größe der Dateien - ein zusätzlicher Datenpunkt kann helfen, mögliche Kollisionen zu identifizieren. Beachten Sie jedoch, dass die demonstrierte MD5-Kollision die Länge der Daten nicht ändern musste.

Wenn Sie 100% sicher sein müssen, beginnen Sie auf jeden Fall mit einem Hash, aber wenn die Hashes übereinstimmen, führen Sie einen byteweisen Vergleich der beiden Dateien durch.


Darüber hinaus bedeutet die Komplexität der von Anwendungen wie Word und Excel erstellten Dokumente, dass Text, Zahlen und sichtbares Layout identisch sein können, die in der Datei gespeicherten Daten jedoch unterschiedlich sein können.

Excel ist besonders schlecht diese - einfach eine Tabelle zu öffnen es zu speichern (mit getan nichts ) kann eine neue Datei, mit unterschiedlichen Inhalten produzieren.

Attie
quelle
6
MD5 wird nicht mehr als ausreichend angesehen und ist kryptografisch sehr wahr, aber für die Eindeutigkeitsprüfung (wenn keine Böswilligkeit vorliegt, z. B. wenn Sie die Eingabe steuern) ist es nett und schnell (und 128 Bit sollten ausreichen)
Chris H
4
" Führe einen Byte-für-Byte-Vergleich der beiden Dateien durch. " Wenn du einen Dateivergleich durchführst, kannst du es auch zuerst tun ... es macht keinen Sinn, alle Dateien zu lesen, um ihre zu berechnen Hashes nur, um beide Dateien erneut zu lesen, um sie zu vergleichen!
TripeHound
3
@TripeHound Es hängt davon ab, ob die Dateien lokal sind oder nicht ... wenn Sie bereits einen Hash haben und eine neue Datei in das System einführen, wenn die neue Datei einen in einer Datenbank gespeicherten Hash benötigt, etc ... Machen Sie den Anruf, der zu Ihrer Situation passt.
Attie
5
Nein, es ist kein Wahrscheinlichkeitsspiel. Sie schätzen falsch ein, wie unwahrscheinlich eine versehentliche Kollision ist. Es wird einfach nicht passieren. Ein bisschen Spiegeln während des Vergleichs ist wahrscheinlicher. Andererseits kann es in einigen Szenarien zu einer absichtlichen Kollision kommen, und das ist überhaupt kein Wahrscheinlichkeitsspiel.
Gilles 'SO- hör auf böse zu sein'
3
@mbrig: Bei einem 32-Bit-Hash besteht ein erhebliches Risiko einer versehentlichen Nichtübereinstimmung. Der Wechsel zu 128 oder 256 Bit macht jedoch einen großen Unterschied. Mit 128 Bit hätten eine Milliarde Affen, die jeweils eine Milliarde wirklich zufälliger Dokumente mit anständiger Größe eingeben, eine Chance von 0,3%, zwei Dokumente mit demselben Hash zu erstellen. Selbst wenn Milliarden Affen eine Milliarde anständig großer zufälliger Dokumente pro Sekunde über eine Milliarde Jahre hinweg mit 256 Bit tippen könnten, wäre die Wahrscheinlichkeit, dass eine dieser Nichtmillionen von Dokumenten zufällig übereinstimmende Hash-Werte aufweist, äußerst gering.
Supercat
6

Wenn zwei Dateien denselben MD5-Hash haben und sie nicht speziell gestaltet wurden, sind sie identisch. Wie schwierig es ist, Dateien mit demselben MD5-Hash zu erstellen, hängt vom Dateiformat ab. Ich weiß nicht, wie einfach es mit Excel-Dateien ist.

Wenn Sie also eigene Dateien haben, die nur herumliegen und Duplikate suchen, ist MD5 sicher. Wenn Sie eine der Dateien geschrieben haben und die andere Datei zweifelhaften Ursprungs ist, ist MD5 immer noch sicher (die einzige Möglichkeit, unterschiedliche Dateien mit derselben MD5-Prüfsumme zu erhalten, besteht darin, beide Dateien zu erstellen). Wenn jemand, dem Sie nicht vertrauen, Ihnen einen Budgetvorschlag sendet und später eine andere Datei sendet, von der er behauptet, dass sie dieselbe ist, reicht MD5 möglicherweise nicht aus.

Verwenden Sie SHA-256 oder SHA-512 anstelle von MD5, um Risiken zu vermeiden. Wenn zwei Dateien denselben SHA-256-Hash haben, sind sie identisch. Gleiches gilt für SHA-512. (Es gibt eine theoretische Möglichkeit, dass sie unterschiedlich sein könnten, aber die Wahrscheinlichkeit, dass dies versehentlich passiert, ist so viel geringer als die Wahrscheinlichkeit, dass Ihr Computer während der Überprüfung ein wenig kippt, als dass es einfach nicht relevant ist Keiner weiß, wie das bei SHA-256 oder SHA-512 geht.)

Wenn zwei Excel-Dateien unterschiedliche Hashes haben, sind sie unterschiedlich, aber es gibt keine Möglichkeit, festzustellen, um wie viel sie sich unterscheiden. Sie können identische Daten, aber unterschiedliche Formatierungen haben, oder sie können sich nur in den Eigenschaften unterscheiden, oder sie wurden möglicherweise von verschiedenen Versionen gespeichert. Wenn Excel mit Word vergleichbar ist, werden beim Speichern einer Datei lediglich die Metadaten aktualisiert. Wenn Sie nur die Zahlen- und Textdaten vergleichen und Formatierungen und Eigenschaften ignorieren möchten, können Sie die Arbeitsblätter in CSV exportieren, um sie zu vergleichen.

Wenn Sie über Unix / Linux-Tools verfügen, können Sie cmpzwei Dateien miteinander vergleichen. Um zwei Dateien auf demselben Computer zu vergleichen, werden die Dinge durch Prüfsummen nur noch komplizierter.

Gilles 'SO - hör auf böse zu sein'
quelle
Wenn zwei Dateien denselben MD5-Hash haben und sie nicht speziell gestaltet wurden, sind sie identisch. Das ist falsch. Es gibt unendlich viele mögliche Nachrichten, aber nur 2 ^ 64 mögliche 64-Bit-Hashes. Es wird das "Pigeonhole-Prinzip" genannt : "Das Pigeonhole-Prinzip besagt, dass mindestens ein Behälter mehr als einen Gegenstand enthalten muss , wenn nGegenstände in mBehälter mit n > mgefüllt werden." Wenn Sie mehr als 2 ^ 64 Nachrichten erstellen, haben Sie Kollisionen ohne besondere Bearbeitung. Und Sie könnten mit nur 2.
Andrew Henle
@AndrewHenle, MD5 ist nicht 64-Bit, sondern 128. Wenn die Erzeugung einer zufälligen Kollision uns in die Zeitskala des Hitzetodes des Universums bringt, ist dies nur für eine äußerst akademische (daher unbrauchbare) Definition möglich.
Charles Duffy
@CharlesDuffy Sie gehen davon aus, dass der Hash zufällig verteilt wird. Es ist nicht.
Andrew Henle
Die effektive Gleichwertigkeit mit der zufälligen Verteilung ist Teil der Definition eines guten kryptografischen Hashs - es gibt viele Runden des Mischens aus einem bestimmten Grund. Es gibt zwar schwache Hash-Algorithmen, aber wenn wir uns auf diese Schwächen konzentrieren, werden wir auf die zuvor genannten Vorbehalte bei absichtlichen Angriffen hingewiesen. (Oder sagen Sie, dass MD5 nur 64 Bits enthält, die effektiv zufällig sind? Ich gebe zu, dass ich nicht mithalten konnte, also ist das plausibel - Link bitte?)
Charles Duffy
@AndrewHenle Ich behaupte nicht, dass eine Kollision mathematisch unmöglich ist, was falsch, aber hier nicht relevant wäre. Ich stelle fest, dass es nicht passiert ist, was wahr ist. Ihr Kommentar ist in einer Weise falsch, die das Geschäft komplett verändert. Es gibt 2 ^ 128 mögliche MD5-Hashes, nicht 2 ^ 64. Dies bedeutet, dass Sie 2 ^ 128 Hashes generieren müssen, um eine Kollision zu generieren. Nach dem Geburtstagsparadoxon würde 2 ^ 64 Ihnen eine makroskopische Chance auf eine Kollision zwischen den von Ihnen generierten Hashes geben (nicht mit einem zuvor generierten Hash). Dies ist jedoch umstritten, da wir wissen, wie man Kollisionen herstellt.
Gilles 'SO- hör auf böse zu sein'
6

Kurze Antwort: Ein kryptografischer Hash soll Ihnen dabei helfen, einigermaßen sicher zu sein, dass Dateien mit übereinstimmenden Hashes identisch sind. Sofern nicht absichtlich manipuliert, ist die Wahrscheinlichkeit, dass zwei leicht unterschiedliche Dateien ähnliche Hashwerte aufweisen, lächerlich gering. Aber wenn es darum geht, Dateien zu vergleichen und zu überprüfen, die absichtlich manipuliert werden könnten, ist MD5 eine schlechte Wahl. (Verwenden Sie eine andere Hash-Funktion wie SHA3 oder BLAKE2.)

Lange Antwort: Eine ideale Hash-Funktion ist eine, die für jedes einzelne Datenelement einen fast eindeutigen kryptografischen Hash erstellt. Mit anderen Worten, wir wissen definitiv, dass es zwei Dateien in diesem Universum gibt, deren Hash-Werte kollidieren. Die Wahrscheinlichkeit, dass diese beiden Dateien auf natürliche Weise zusammenkommen, ist lächerlich gering.

Vor zehn Jahren habe ich beschlossen, so weit wie möglich von MD5 weg zu bleiben. (Natürlich erinnerte ich mich bis gestern an den falschen Grund dafür. Zehn Jahre sind eine lange Zeit, verstehen Sie? Ich habe meine früheren Memos noch einmal durchgesehen, um mich daran zu erinnern, warum und diese Antwort bearbeitet.) Sie sehen, 1996 wurde MD5 mit gefunden anfällig für Kollisionsangriffe sein. 9 Jahre später konnten Forscher mit demselben Hash zwei PostScript-Dokumente und (autsch!) X.509-Zertifikate erstellen! MD5 war eindeutig defekt. (Megaupload.com verwendete auch MD5 und es gab eine Menge Taschentücher mit Hash-Kollisionen, die mir damals Probleme bereiteten.)

Daher kam ich zu dem Schluss, dass MD5 zwar zuverlässig für den Vergleich von harmlosen Dateien ist (und es immer noch gibt), man es jedoch nicht mehr verwenden muss. Wenn Sie sich darauf verlassen, kann dies zu Nachsicht und falschem Vertrauen führen: Wenn Sie mit dem Vergleichen von Dateien mit ihren MD5-Hashes beginnen, vergessen Sie eines Tages den Sicherheitsfeinabdruck und vergleichen zwei Dateien, die absichtlich mit demselben Hash erstellt wurden. Darüber hinaus ist es unwahrscheinlich, dass CPUs und Kryptoprozessoren diese Funktion unterstützen.

Das Originalposter hat jedoch noch weniger Gründe, MD5 zu verwenden, weil:

  1. Solange nur zwei Dateien verglichen werden, ist der Byte-für-Byte-Vergleich tatsächlich schneller als das Generieren eigener MD5-Hashes. Zum Vergleichen von drei oder mehr Dateien ... Nun, jetzt haben Sie einen legitimen Grund.
  2. Das OP spezifizierte "Möglichkeiten, dies zu überprüfen und ohne eine Reihe von Plugins zu installieren". Mit dem Windows PowerShell - Befehl Get-FileHash können SHA1-, SHA256-, SHA384-, SHA512- und MD5-Hashes generiert werden. Auf modernen Computern mit Hardware-Unterstützung für SHA-Hash-Funktionen erfolgt die Generierung schneller.

quelle
6
Sie können Ihre eigene kryptografische Hash-Funktion mit einer beliebigen Länge erstellen. dann hat es aber eine feste länge und das pigeonhole-prinzip gilt trotzdem. Die allgemeine Antwort lautet: "Wenn Sie nur die Hashes vergleichen, können Sie nicht sicher sein, ob die beiden Dateien identisch sind."
Kamil Maciorowski
2
@KamilMaciorowski Theoretisch kann ich ja. Meine maßgeschneiderte Hash-Funktion kann einfach eine Kopie der größten Datei erzeugen. Aber ich habe kein Interesse daran, dies weiter zu diskutieren. Die Wahrheit ist, dass Sie aus einem Grund abgestimmt haben, der sich auf das Nippen beläuft, nur um zu beweisen, dass Sie schlauer sind und es auf Sie zurückgeschossen hat. Jetzt können Sie die Abstimmung nicht zurücknehmen.
Ich stimme @KamilMaciorowski zu ... Es ist ein Wahrscheinlichkeitsspiel ... Wenn Sie einen einzelnen Hash verwenden, können Sie " einigermaßen sicher " sein, dass Dateien mit übereinstimmenden Hashes identisch sind, aber es gibt keine 100% ige Garantie. Die Verwendung besserer Algorithmen oder mehrerer Algorithmen kann Ihr Vertrauen verbessern - selbst das Vergleichen der Dateigrößen kann hilfreich sein ... Sie können jedoch niemals 100% ig sicher sein, ohne Byte für Byte zu überprüfen.
Attie
1
@ Attie Huh! Das habe ich ursprünglich gemeint. Vielen Dank. 🙏 Nur ich kenne schicke Redewendungen wie "Sie können einigermaßen sicher sein" nicht. Es tut uns leid. 😜 Aus diesem Grund haben wir eine Schaltfläche zum Bearbeiten. Ich persönlich würde niemals eine gute Antwort verwerfen, nur weil ein Wort darin falsch ist. Ich bearbeite es.
1
Zum Thema "Eine gute Antwort verwerfen": Bitte beachten Sie, dass ich zuerst sichergestellt habe, dass es kein Tippfehler ist und Sie es wirklich so meinen. dann runtergestimmt und zur gleichen Zeit gab ich dir Feedback, gab meinen Grund bekannt in der Hoffnung, dass deine Antwort besser wird. Es tat, also ist meine Ablehnung nicht mehr. Grundsätzlich habe ich dir gesagt, was ich mit deiner Antwort für falsch halte. Attie half bei der Klärung, du hast die Antwort verbessert. Aus meiner Sicht haben wir alle mit dieser Situation richtig umgegangen und die ganze Geschichte ist sehr gut gelaufen. Danke.
Kamil Maciorowski
5

Ich habe 2 Excel-Dokumente und möchte überprüfen, ob sie bis auf den Dateinamen genau gleich sind.

Aus praktischer Sicht ist es schneller, die Dateien direkt zu vergleichen, um festzustellen, ob sie unterschiedlich sind, als für jede Datei einen Hash zu berechnen und dann diesen Hash zu vergleichen.

Um die Hashes zu berechnen, müssen Sie den gesamten Inhalt beider Dateien lesen.

Um durch direkten Vergleich festzustellen, ob sie identisch sind, müssen Sie nur den Inhalt beider Dateien lesen, bis sie nicht mehr übereinstimmen. Sobald Sie einen Unterschied feststellen, wissen Sie, dass die Dateien nicht identisch sind und Sie keine Daten mehr aus den beiden Dateien lesen müssen.

Und bevor Sie dies tun, können Sie einfach die Größe der beiden Dateien vergleichen. Wenn sich die Größen unterscheiden, kann der Inhalt nicht gleich sein.

Andrew Henle
quelle
Wenn Sie zwei Dateien auf einem physischen Laufwerk verwenden, ist die Verwendung einer Hash-Funktion, die mit der E / A-Geschwindigkeit jeder einzelnen Datei Schritt halten kann, möglicherweise etwas schneller als der Vergleich der Dateien, da nicht zwischen dem Lesen der beiden Dateien gewechselt werden muss. Der Ort, an dem Hashes wirklich glänzen, ist der Versuch, Vergleiche mit vielen Dateien anzustellen, die zu groß sind, um in den Speicher zu passen. Auch wenn Sie nur herausfinden möchten, ob alle übereinstimmen, kann der Vergleich von Datei 1 mit Datei 2, von Datei 1 mit Datei 3, von Datei 1 mit Datei 4 usw. fast doppelt so langsam sein wie die Berechnung aller ihrer Hashes.
Supercat
@supercat Wenn die Dateien in Blöcken gelesen werden, die größer als etwa ein MB sind, ist der Wechsel zwischen den Dateien nicht erkennbar. Und wenn ein Workflow den Vergleich einer Reihe von Dateien zum Auffinden von Duplikaten beinhaltet, kann der Hash genauso gut berechnet werden, wie jede Datei geschrieben wird - da dies dann so ziemlich kostenlos durchgeführt werden kann.
Andrew Henle
Wenn man genug Platz hat, um große Teile der Dateien zu puffern, müssen die Umschaltzeiten kein Problem sein, aber ansonsten könnten sie es sein. Was die Berechnung der Hashes beim Schreiben von Dateien angeht, kann dies in Ordnung sein, wenn man garantieren kann, dass Dateien nicht geändert werden können, ohne gespeicherte Hashes zu ändern oder zumindest zu ungültig zu machen. Wenn versucht wird, das redundante Sichern von Dateien zu vermeiden, kann das Betrachten nur gespeicherter Hash-Werte dazu führen, dass eine versehentlich beschädigte Datei gesichert wird, die nicht beschädigten Dateien, mit denen die beschädigte Datei übereinstimmen sollte , jedoch nicht gesichert werden .
Supercat
"Sobald Sie einen Unterschied feststellen, wissen Sie, dass die Dateien nicht identisch sind" - nicht unbedingt. XLSX-Dateien sind ZIP-Dateien, in denen der Inhalt möglicherweise in einer anderen Reihenfolge gespeichert wird und derselbe Inhalt noch vorhanden ist. Aber selbst wenn Sie sie dekomprimieren und jede einzelne Datei vergleichen, enthält die XLSX-Datei XML-Dokumente, die z. B. unterschiedliche Zeilenenden aufweisen können, ohne den Inhalt zu beeinträchtigen.
Thomas Weller
5

Hashes wie MD5 oder SHA haben eine feste Länge, sagen wir es sind 300 alphanumerische Zeichen (in Wirklichkeit sind sie kürzer und verwenden nicht den gesamten alphanumerischen Zeichensatz).

Nehmen wir an, dass Dateien aus alphanumerischen Zeichen bestehen und bis zu 2 GB groß sind.

Sie können leicht erkennen, dass es weit mehr Dateien gibt (mit einer Größe von bis zu 2 GB) als mögliche Hash-Werte. Das Pigeonhole-Prinzip besagt, dass einige (verschiedene) Dateien dieselben Hashwerte haben müssen.

Wie in shattered.io 1 gezeigt , können Sie auch zwei verschiedene Dateien haben: shattered.io/static/shattered-1.pdf und shattered.io/static/shattered-2.pdf, die den gleichen SHA-1-Hashwert haben, während sie sich in einem Zustand befinden völlig anders.

1 SHA1 ist ein "stärkerer" Hashing-Algorithmus als md5

Styroporfliege
quelle
Die Wahrscheinlichkeit versehentlicher Kollisionen ist zu gering, um berücksichtigt zu werden. Das Risiko einer absichtlichen Kollision besteht auch für MD5 und ist schlimmer als für SHA-1, was hier nicht sonderlich relevant ist.
Gilles 'SO- hör auf böse zu sein'
4

NEIN. Unterschiedliche Werte garantieren, dass die Dateien unterschiedlich sind. Dieselben Werte sind keine Garantie dafür, dass die Dateien identisch sind. Es ist relativ einfach, Beispiele mit CRC16 zu finden.

Im Gleichgewicht der Wahrscheinlichkeit mit zeitgenössischen Hashing-Schemata sind sie gleich.

mckenzm
quelle
1
Es handelt sich um MD5, bei dem kein Risiko für versehentliche Kollisionen besteht. Es besteht die Gefahr von absichtlichen Kollisionen, aber das ist keine Frage der Wahrscheinlichkeiten.
Gilles 'SO- hör auf böse zu sein'
1
Es geht auch um Excel-Tabellen mit verschiedenen Namen. Wie groß können sie sein, dass ein Byte-für-Byte-Vergleich keine Option sein kann? Zwei Hashing-Schemata zusammen würden für Sicherheit sorgen.
McKenzm
2
@Gilles Alle Hashcodes bergen per Definition das Risiko versehentlicher Kollisionen. Der einzige Ausweg besteht darin, die gesamte Datei als Hashcode zu verwenden. Dein Kommentar ergibt keinen Sinn.
user207421
3

Ihre Frage ist jedoch verkehrt herum - nehmen wir an, dass der Hash die gleichen Daten enthält (was nicht zu 100% garantiert ist, aber für ein Leben lang ausreicht, um Dateien jede Sekunde zu vergleichen, um keine Kollision zu verursachen). Daraus folgt nicht zwangsläufig, dass dieselben Daten denselben Hash haben. Nein, Sie können die Daten in einer Excel-Datei nicht mit den Daten in einer anderen Excel-Datei vergleichen, indem Sie die Datei hashen, da es viele Möglichkeiten gibt, wie sich zwei Dateien unterscheiden können, ohne dass sich die zugrunde liegenden Daten unterscheiden. Ein offensichtlicher Weg - die Daten werden als XML gespeichert, jede Zelle hat einen eigenen XML-Knoten. Wenn diese Knoten in unterschiedlicher Reihenfolge gespeichert sind, sind die Daten identisch, die Datei jedoch unterschiedlich.

David Rice
quelle
3

Um die anderen Antworten zu ergänzen, finden Sie hier viele Beispiele für Dateipaare mit demselben MD5-Hash und unterschiedlichem Inhalt.

Giulio Muscarello
quelle
Eine reine Linkantwort, aber interessant.
Thomas Weller
2

Die Antwort für dieses OP wurde gegeben, könnte aber von einer Zusammenfassung profitieren.

Wenn Sie überprüfen möchten, ob zwei Dateien identisch sind, hängt vieles davon ab, ob Sie die Dateien und Hashes kontrollieren.

Wenn Sie die Hashes selbst aus den Dateien generieren und Sie sich ziemlich sicher sind, dass kein anderer die Gelegenheit / Fähigkeit / Motivation hatte, absichtlich zu versuchen, zu einer falschen Schlussfolgerung zu gelangen, dann sind fast alle Hashes - auch "bekannte, kaputte" Hashes wie MD5 und SHA1 - mit ziemlicher Sicherheit ausreichend. Aber das, ich meine , können Sie Dateien mit hohen Geschwindigkeit erzeugen Millionen von Jahren , und Sie würden immer noch unwahrscheinlich sein , mit zwei beliebigen Dateien , um am Ende der tatsächlich unterschiedlich sind , aber die gleiche Hash. Es ist mit ziemlicher Sicherheit sicher.

Dies ist das Szenario, in dem Sie schnell prüfen möchten, ob zwei Verzeichnisse auf Ihrem PC oder Dateiserver denselben Inhalt haben, ob Dateien in einem Verzeichnis exakte Duplikate usw. sind, und Sie sind sich ziemlich sicher, dass die Dateien nicht vorhanden sind wurde entwickelt / illegal modifiziert, und Sie vertrauen darauf, dass Ihre Hashing-App / Ihr Dienstprogramm korrekte Ergebnisse liefert.

Wenn Sie sich in einem Szenario befinden, in dem eine der Dateien - oder ein vorberechneter Hash - manipuliert oder manipuliert wurde, um Sie zu einer falschen Schlussfolgerung zu verleiten, benötigen Sie einen stärkeren (ununterbrochenen) Hash und / oder eine andere Sicherheit. Wenn Sie beispielsweise eine Datei herunterladen und anhand eines Hashs überprüfen, ob sie gültig ist, kann ein Angreifer möglicherweise eine fehlerhafte Datei mit dem richtigen Hash erstellen oder die Website angreifen, um einen falschen Hash zu platzieren, wenn Sie nach dem "richtigen" suchen " (erwarteter Wert. Dies ist auf umfassendere Sicherheitsprobleme zurückzuführen.

Stilez
quelle
2

In der Windows-Befehlszeile können Sie mit dem compDienstprogramm ermitteln, ob zwei Dateien identisch sind. Zum Beispiel:

comp fileone.xls filetwo.xls
Tschad
quelle
1

Wenn die Hashes identisch sind, bedeutet dies, dass der Dateiinhalt 1: 1 identisch ist?

Nein . Wenn die Hashes sind unterschiedlich, es nicht bedeutet , dass der Inhalt unterschiedlich sind. Gleiche Hashcodes bedeuten nicht den gleichen Inhalt. Ein Hashcode ist per Definition eine Reduzierung einer großen Domain auf einen kleineren Bereich: Die Implikation ist, dass Hashcodes über ungleichen Inhalt gleich sein können. Sonst hätte es keinen Sinn, sie zu berechnen.

user207421
quelle
Sonst hätte es keinen Sinn, sie zu berechnen. Wenn Sie gegen die Gesetze der Mathematik verstoßen und eine verlustfreie Komprimierungsfunktion erfunden haben, mit der zufällige Daten komprimiert werden können, die gegen das Pigeonhole-Prinzip verstoßen, wäre es sehr wertvoll, sie zu verwenden! Es wäre sehr praktisch , wenn ein 128-Bit - Hash hat eindeutig den gesamten Inhalt einer Datei darstellen. Selbst wenn es keine Dekomprimierungsfunktion gäbe, mit der der Hash zurück in die Datei konvertiert werden könnte, wäre ein mathematisch unmöglicher, kollisionsfreier Hash wünschenswert, z.
Peter Cordes
"Wenn die Hashes unterschiedlich sind, bedeutet dies, dass der Inhalt unterschiedlich ist." Nicht unbedingt. XLSX-Dateien sind ZIP-Dateien und es wäre möglich, den gleichen Inhalt in unterschiedlicher Dateireihenfolge zu speichern.
Thomas Weller
1

Diese Antwort soll eine handliche Karte von Szenarien sein, die auftreten können oder nicht, und Argumente, die Sie anwenden können. Lesen Sie die anderen Antworten, um zu erfahren, warum Hash-Funktionen auf diese Weise funktionieren.


Nachdem Sie eine Hash-Funktion ausgewählt und sich daran gehalten haben, sollten Sie folgende Kombinationen berücksichtigen:

          |    identical   |   different    |
          |   hash values  |  hash values   |
----------+----------------+----------------+
identical |   can happen,  | cannot happen, |
  files   |     common     |   impossible   |
----------+----------------+----------------+
different |   can happen,  |   can happen,  |
  files   |      rare*     |     common     |
----------+----------------+----------------+

* rare, unless whoever generates (at least one of) the files
  purposely aims at this scenario

Das Szenario, in dem identische Dateien unterschiedliche Hashwerte generieren, ist das einzige Szenario, das absolut unmöglich ist.


Zwei Argumente, die immer zutreffen:

  • Wenn die Dateien identisch sind, sind die Hashwerte mit Sicherheit identisch .
  • Wenn Hash-Werte unterschiedlich sind, sind die Dateien mit Sicherheit unterschiedlich .

Zwei Gründe, die nicht streng sind :

  • Wenn Dateien unterschiedlich sind, sind die Hash-Werte wahrscheinlich unterschiedlich.
  • Wenn Hash-Werte identisch sind, sind die Dateien wahrscheinlich identisch.
Kamil Maciorowski
quelle
0

Ja, identische Hashes bedeuten für Ihre Zwecke identische Dateien.

Wie andere Antworten verdeutlichen, ist es möglich, zwei verschiedene Dateien zu erstellen, die denselben Hash ergeben, und MD5 ist in dieser Hinsicht nicht besonders robust.

Verwenden Sie daher einen stärkeren Hashing-Algorithmus, wenn Sie eine große Anzahl von Excel-Dokumenten vergleichen möchten oder wenn Sie der Meinung sind, dass jemand den Vergleich manipulieren möchte. SHA1 ist besser als MD5. SHA256 ist wieder besser und sollte Ihnen völliges Vertrauen in Ihre spezielle Anwendung geben.

jah
quelle
-1

Die Dateien sind wahrscheinlich identisch, wenn ihre Hashes identisch sind. Sie können das Vertrauen erhöhen, indem Sie beide Dateien auf die gleiche Weise ändern (z. B. denselben Wert in dieselbe nicht verwendete Zelle einfügen) und dann die Hashes der geänderten Dateien vergleichen. Es ist schwierig, eine absichtliche Kollision für eine Datei zu erstellen, die auf eine im Voraus nicht bekannte Weise geändert wird.

ibft2
quelle
Dies funktioniert nicht, da zusätzliche Daten in Office-Dateien gespeichert sind. Sie müssen z. B. den Cursor vor dem Speichern in dieselbe Zelle setzen, genau zum richtigen Zeitpunkt speichern usw. Aber selbst dann sind XLSX-Dateien interne Zip-Dateien. Wenn dieser Algorithmus die einzelnen Dateien in einer anderen Reihenfolge speichert (für welchen Zweck auch immer), Die Datei ist identisch, aber der Hash ist nicht
Thomas Weller
-2

Lassen Sie uns dies auf praktische Weise betrachten. Anstatt "die Hashes sind identisch" zu sagen, sage ich "Ich habe ein Computerprogramm geschrieben, das die Hashes von zwei Dateien berechnet und ausgibt, ob sie gleich sind oder nicht", und ich starte das Programm mit zwei Dateien "identisch". Dafür kann es mehrere Gründe geben:

Die Dateien können identisch sein. Mein Code enthält möglicherweise Fehler (in der Praxis wurden zwei lange (256 Byte) Hashes nicht mit memcmp, sondern mit strcmp verglichen): Der Vergleich gibt "dasselbe" zurück, wenn das erste Byte in jedem Hash Null ist und die Wahrscheinlichkeit für Dies ist 1 in 65536. Möglicherweise liegt ein Hardwarefehler vor (kosmische Strahlung trifft auf eine Speicherzelle und schaltet diese um). In seltenen Fällen liegen zwei verschiedene Dateien mit identischem Hash vor (eine Hash-Kollision).

Ich würde sagen, dass bei nicht identischen Dateien die mit Abstand wahrscheinlichste Ursache ein Programmierfehler ist, dann kommt der kosmische Strahl, der eine boolesche Variable mit dem Ergebnis eines Vergleichs der Hashes von "falsch" nach "wahr" geändert hat, und viel später das Zusammentreffen einer Hash-Kollision.

Es gibt Unternehmenssicherungssysteme, die es vermeiden, identische Dateien von 10.000 Benutzern zu sichern, indem jede Datei einem Hash unterzogen und nach einer Datei gesucht wird, in der bereits ein identischer Hash auf dem Server gespeichert ist. Im Falle einer Kollision wird eine Datei nicht gesichert, was möglicherweise zu Datenverlust führen kann. Jemand hat errechnet, dass es viel wahrscheinlicher ist, dass ein Meteorit Ihren Server trifft und alle Backups zerstört, als eine Datei zu verlieren, weil die Prüfsumme mit einer anderen Datei übereinstimmt.

gnasher729
quelle