it-swarm.com.de

Ist es möglich, identischen SHA1-Hash zu erhalten?

Bei zwei unterschiedlichen Strings S1 und S2 (S1! = S2) ist es möglich, dass:

SHA1(S1) == SHA1(S2)

ist wahr?

  1. Wenn ja - mit welcher Wahrscheinlichkeit?
  2. Wenn nicht - warum nicht?
  3. Gibt es eine Obergrenze für die Länge einer Eingabezeichenfolge, für die die Wahrscheinlichkeit, Duplikate zu erhalten, 0 beträgt? OR ist die Berechnung von SHA1 (daher Wahrscheinlichkeit von Duplikaten) unabhängig von der Länge der Zeichenkette?

Das Ziel, das ich zu erreichen versuche, besteht darin, eine vertrauliche ID-Zeichenfolge zu hashen (möglicherweise zusammen mit einigen anderen Feldern wie der übergeordneten ID), damit ich den Hash-Wert stattdessen als ID verwenden kann (zum Beispiel in der Datenbank).

Beispiel:

Resource ID: X123
Parent ID: P123

Ich möchte die Art meiner Ressourcenkennungen nicht offenlegen, damit der Client "X123-P123" sehen kann.

Stattdessen möchte ich einen neuen Spalten-Hash ("X123-P123") erstellen. Nehmen wir an, es ist AAAZZZ. Dann kann der Kunde eine Ressource mit der ID AAAZZZ anfordern und weiß nichts über meine internen IDs usw.

77
Andriy Drozdyuk

Was Sie beschreiben, heißt Kollision. Es müssen Kollisionen vorliegen, da SHA-1 viel mehr unterschiedliche Nachrichten als Eingabe akzeptiert, um unterschiedliche Ausgaben zu erzeugen (SHA-1 kann eine beliebige Bitfolge mit bis zu 2 ^ 64 Bit aufnehmen, gibt jedoch nur 160 Bit aus, also mindestens eine Ausgabe Wert muss mehrmals auftauchen). Diese Beobachtung gilt für jede Funktion, deren Ausgabe kleiner als die Eingabe ist, unabhängig davon, ob es sich bei der Funktion um eine "gute" Hash-Funktion handelt oder nicht.

Angenommen, SHA-1 verhält sich wie ein "zufälliges Oracle" (ein konzeptionelles Objekt, das im Grunde zufällige Werte zurückgibt, mit der einzigen Einschränkung, dass bei der Eingabe v m, muss danach immer v bei Eingabe m) zurückgeben, dann sollte die Kollisionswahrscheinlichkeit für zwei beliebige Zeichenfolgen S1 und S2 sein 2 ^ (- 160). Unter der Annahme, dass sich SHA-1 wie ein zufälliges Oracle verhält, werden Sie, wenn Sie viele Eingabezeichenfolgen sammeln, Kollisionen beobachten, nachdem Sie etwa 2 ^ 80 solche Zeichenfolgen gesammelt haben.

(Das ist 2 ^ 80 und nicht 2 ^ 160, weil Sie mit 2 ^ 80 Zeichenfolgen ungefähr 2 ^ 159 Zeichenfolgenpaare erstellen können. Dies wird oft als "Geburtstagsparadoxon" bezeichnet, da es für die meisten Leute eine Überraschung darstellt, wenn es auf Kollisionen angewendet wird an Geburtstagen. Siehe die Wikipedia-Seite zum Thema.)

Nun vermuten wir stark, dass SHA-1 sich not wirklich wie ein zufälliges Oracle verhält, da der Birthday-Paradox-Ansatz der optimale Kollisionssuchalgorithmus für ein zufälliges Oracle ist. Es gibt jedoch einen veröffentlichten Angriff, der eine Kollision in etwa 2 ^ 63 Schritten finden sollte, also 2 ^ 17 = 131072-mal schneller als der Algorithmus für das Geburtstagsparadoxon. Ein solcher Angriff sollte auf einem echten zufälligen Oracle nicht möglich sein. Wohlgemerkt, dieser Angriff ist noch nicht abgeschlossen, er bleibt theoretisch (einige Leute haben versucht, aber anscheinend nicht genug CPU-Leistung gefunden ) ( Update: Ab Anfang 2017 hat jemand hat mit der oben genannten Methode ein SHA-1-Kollision berechnet, und es hat genau wie vorhergesagt funktioniert). Dennoch sieht die Theorie gut aus und es scheint wirklich, dass SHA-1 kein zufälliges Oracle ist. Entsprechend sind hinsichtlich der Kollisionswahrscheinlichkeit alle Wetten ungültig.

Was Ihre dritte Frage betrifft: Für eine Funktion mit einer n - Bit-Ausgabe gibt es zwangsläufig Kollisionen, wenn Sie mehr als 2 ^ n unterschiedliche Nachrichten eingeben können dh wenn die maximale Länge der Eingangsnachricht größer als n ist. Mit einer Schranke m kleiner als n ist die Antwort nicht so einfach. Wenn sich die Funktion wie ein zufälliges Oracle verhält, verringert sich die Wahrscheinlichkeit einer Kollision mit m und nicht linear, sondern mit einem steilen Cutoff um m = n/2 . Dies ist die gleiche Analyse wie das Geburtstagsparadoxon. Mit SHA-1 bedeutet dies, dass bei m <80 wahrscheinlich keine Kollision vorliegt, während m> 80 mindestens eine existiert Kollision sehr wahrscheinlich (mit m> 160 wird dies zu einer Gewissheit).

Beachten Sie, dass es einen Unterschied zwischen "Es liegt eine Kollision vor" und "Sie finden eine Kollision" gibt. Auch wenn eine Kollision muss vorliegt, haben Sie bei jedem Versuch Ihre 2 ^ (- 160) -Wahrscheinlichkeit. Was der vorige Absatz bedeutet, ist, dass eine solche Wahrscheinlichkeit ziemlich bedeutungslos ist, wenn Sie nicht (konzeptionell) 2 ^ 160 Paare von Zeichenketten versuchen können, z. weil Sie sich auf Zeichenfolgen mit weniger als 80 Bit beschränken.

118
Thomas Pornin

Ja, es ist möglich, weil das Pigeon Hole-Prinzip .

Die meisten Hashes (auch sha1) haben eine feste Ausgabelänge, während die Eingabe eine beliebige Größe hat. Wenn Sie es also lange genug versuchen, können Sie sie finden.

Kryptografische Hash-Funktionen (wie die sha-Familie, die md-Familie usw.) sollen solche Kollisionen jedoch minimieren. Der beste bekannte Angriff benötigt 2 ^ 63 Versuche, um eine Kollision zu finden. Die Chance ist 2 ^ (- 63), was in der Praxis 0 ist.

33
Henri

git verwendet SHA1-Hashes als IDs und es sind noch keine SHA1-Kollisionen im Jahr 2014 bekannt. Der SHA1-Algorithmus ist offensichtlich magisch. Ich denke, es ist eine gute Wette, dass es für Zeichenfolgen Ihrer Länge keine Kollisionen gibt, wie sie inzwischen entdeckt worden wären. Wenn Sie jedoch Magie nicht vertrauen und kein Wettmann sind, können Sie zufällige Zeichenfolgen generieren und diese mit Ihren IDs in Ihrer Datenbank verknüpfen. Wenn Sie jedoch SHA1-Hashes verwenden und als erster eine Kollision feststellen, können Sie Ihr System so ändern, dass zu diesem Zeitpunkt zufällige Zeichenfolgen verwendet werden, wobei die SHA1-Hashes als "zufällige" Zeichenfolgen für Legacy-IDs beibehalten werden.

6
Vladimir Kornea

Eine Kollision ist in einer Hash-Funktion fast immer möglich. SHA1 war bisher ziemlich sicher bei der Erzeugung unvorhersehbarer Kollisionen. Wenn Kollisionen vorhergesagt werden können, ist es nicht erforderlich, die ursprüngliche Hash-Eingabe zu kennen, um dieselbe Hash-Ausgabe zu generieren.

Beispielsweise wurden im vergangenen Jahr Angriffe gegen MD5 gegen die Signatur von SSL-Serverzertifikaten durchgeführt, wie beispielsweise in der Podcast-Episode 179 Security Now . Auf diese Weise konnten erfahrene Angreifer ein falsches SSL-Serverzertifikat für eine betrügerische Website generieren und scheinen die reaol Sache zu sein. Aus diesem Grund wird dringend empfohlen, den Kauf von MD5-signierten Zertifikaten zu vermeiden.

4
spoulson

Was Sie sprechen, nennt man eine Kollision. Hier ist ein Artikel über SHA1-Kollisionen: http://www.rsa.com/rsalabs/node.asp?id=2927

Edit: Also hat mich ein anderer Beantworter geschlagen, das Taubenlochprinzip LOL zu erwähnen, aber um dies zu verdeutlichen, wird es das Taubenlochprinzip genannt, denn wenn Sie einige Löcher haben, in die Brieftauben nisten können, haben Sie mehr Tauben als Löcher , dann müssen sich einige der Tauben (ein Eingabewert) ein Loch teilen (der Ausgabewert).

3
AaronLS