it-swarm.com.de

Wie kommt es, dass MD5-Hashwerte nicht umkehrbar sind?

Ein Konzept, über das ich mich schon immer gewundert habe, ist die Verwendung kryptographischer Hashfunktionen und -werte. Ich verstehe, dass diese Funktionen einen Hashwert generieren können, der einzigartig ist und praktisch nicht rückgängig gemacht werden kann. Ich habe mich jedoch immer gefragt:

Auf meinem Server produziere ich in PHP:

md5("stackoverflow.com") = "d0cc85b26f2ceb8714b978e07def4f6e"

Wenn Sie dieselbe Zeichenfolge durch eine MD5-Funktion ausführen, erhalten Sie dasselbe Ergebnis bei der Installation von PHP. Ein Prozess wird verwendet, um aus einem Startwert einen Wert zu erzeugen.

Bedeutet das nicht, dass es eine Möglichkeit gibt, das Geschehene zu dekonstruieren und den Hashwert umzukehren? 

Was ist an diesen Funktionen, die es unmöglich machen, die resultierenden Zeichenfolgen zurückzuverfolgen?

86
barfoon

Das Eingabematerial kann unendlich lang sein, wobei die Ausgabe immer 128 Bit lang ist. Dies bedeutet, dass eine unbegrenzte Anzahl von Eingabestrings dieselbe Ausgabe erzeugt.

Wenn Sie eine Zufallszahl auswählen und durch 2 teilen, aber nur den Rest aufschreiben, erhalten Sie entweder eine 0 oder eine 1 - gerade oder eine ungerade Zahl. Ist es möglich, diese 0 oder 1 zu nehmen und die ursprüngliche Nummer zu erhalten?

194
Cody Brocious

Wenn Hash-Funktionen wie MD5 umkehrbar wären, wäre dies ein Wendepunkt in der Geschichte der Datenkomprimierungsalgorithmen gewesen! Es ist leicht zu erkennen, dass, wenn MD5 umkehrbar wäre, beliebige Datenblöcke beliebiger Größe durch nur 128 Bit ohne Informationsverlust dargestellt werden könnten. Somit hätten Sie die ursprüngliche Nachricht aus einer 128-Bit-Nummer unabhängig von der Größe der ursprünglichen Nachricht rekonstruieren können.

49
Autodidact

Im Gegensatz zu dem, was die am häufigsten vorgestellten Antworten hier hervorheben, wird die Nichtinjektivität (dh es gibt mehrere Strings, die auf denselben Wert hashing sind) einer kryptographischen Hash-Funktion durch den Unterschied zwischen großer (potentiell unendlicher) Eingangsgröße und festem Wert hervorgehoben Ausgabegröße ist nicht der wichtige Punkt - eigentlich bevorzugen wir Hash-Funktionen, bei denen diese Kollisionen so selten wie möglich auftreten.

Betrachten Sie diese Funktion (in der PHP -Notation als Frage):

function simple_hash($input) {
     return bin2hex(substr(str_pad($input, 16), 0, 16));
}

Dies fügt einige Leerzeichen an, wenn die Zeichenfolge zu kurz ist, und nimmt dann die ersten 16 Bytes der Zeichenfolge und codiert sie als Hexadezimalzeichen. Es hat die gleiche Ausgabegröße wie ein MD5-Hash (32 hexadezimale Zeichen oder 16 Bytes, wenn der bin2hex-Teil weggelassen wird).

print simple_hash("stackoverflow.com");

Dies wird ausgegeben:

737461636b6f766572666c6f772e636f6d

Diese Funktion hat auch die gleiche Nicht-Injektivitätseigenschaft wie Cody's Antwort für MD5: Wir können Strings beliebiger Größe übergeben (sofern sie in unseren Computer passen), und es werden nur 32 Hexadezimalzahlen ausgegeben. Natürlich kann es nicht injektiv sein.

In diesem Fall ist es jedoch trivial, eine Zeichenfolge zu finden, die demselben Hash entspricht (einfach hex2bin auf Ihren Hash anwenden, und Sie haben ihn). Wenn Ihre ursprüngliche Zeichenfolge die Länge 16 hatte (wie in unserem Beispiel), erhalten Sie sogar diese ursprüngliche Zeichenfolge. Für MD5 sollte nichts dergleichen möglich sein, selbst wenn Sie wissen, dass die Länge der Eingabe recht kurz war (außer, dass Sie alle möglichen Eingaben ausprobieren, bis wir eine passende finden, beispielsweise einen Brute-Force-Angriff).

Die wichtigsten Annahmen für eine kryptographische Hash-Funktion sind:

  • es ist schwer, einen String zu finden, der einen bestimmten Hash erzeugt (Preimage-Widerstand).
  • es ist schwierig, eine andere Zeichenfolge zu finden, die denselben Hashwert wie eine gegebene Zeichenfolge erzeugt (zweiter Vorbildwiderstand).
  • es ist schwierig, ein Paar von Strings mit demselben Hash (Kollisionswiderstand) zu finden.

Offensichtlich erfüllt meine simple_hash-Funktion keine dieser Bedingungen. (Eigentlich, wenn wir den Eingaberaum auf "16-Byte-Strings" beschränken, wird meine Funktion injektiv und ist somit sogar nachweisbar resistent und kollisionssicher.)

Es gibt jetzt Kollisionsangriffe auf MD5 (z. B. ist es möglich, ein Stringspaar mit demselben Präfix zu erzeugen, das den gleichen Hashwert hat, mit ziemlich viel Arbeit, aber nicht unmöglich, viel Arbeit), so dass Sie es nicht verwenden sollten MD5 für alles Wichtige .. Es gibt noch keinen Vorab-Angriff, aber die Angriffe werden besser.

Um die eigentliche Frage zu beantworten:

Was ist das an diesen Funktionen, die das .__ macht. resultierende Zeichenfolgen, die nicht nachvollzogen werden können?

Was MD5 (und andere Hash-Funktionen, die auf der Merkle-Damgard-Konstruktion aufbauen) effektiv funktionieren, ist das Anwenden eines Verschlüsselungsalgorithmus mit der Nachricht als Schlüssel und einem festen Wert als "Klartext", wobei der resultierende Chiffretext als Hash verwendet wird. (Zuvor wird die Eingabe aufgefüllt und in Blöcke aufgeteilt. Jeder dieser Blöcke wird verwendet, um die Ausgabe des vorherigen Blocks zu verschlüsseln, XORed mit seiner Eingabe, um Rückwärtsberechnungen zu verhindern.)

Moderne Verschlüsselungsalgorithmen (einschließlich derjenigen, die in Hash-Funktionen verwendet werden) sind so gestaltet, dass sie die Wiederherstellung des Schlüssels erschweren, selbst wenn sowohl Klartext als auch Geheimtext (oder sogar wenn der Gegner einen von ihnen auswählt) ..__ im Allgemeinen durch Ausführen vieler Bitverschiebungsoperationen auf eine Weise, dass jedes Ausgangsbit durch jedes Schlüsselbit (mehrere Male) und auch jedes Eingangsbit bestimmt wird. Auf diese Weise können Sie nur leicht nachvollziehen, was im Inneren passiert, wenn Sie den vollständigen Schlüssel und die Eingabe oder Ausgabe kennen.

Bei MD5-ähnlichen Hash-Funktionen und einem Präimage-Angriff (mit einem Einzelblock-Hash-String zur Vereinfachung) haben Sie nur die Eingabe und Ausgabe Ihrer Verschlüsselungsfunktion, nicht jedoch den Schlüssel (dies ist das, wonach Sie suchen).

27
Paŭlo Ebermann

Cody Brocious hat die richtige Antwort. Streng genommen können Sie eine Hash-Funktion nicht "invertieren", da viele Zeichenfolgen demselben Hash zugeordnet sind. Beachten Sie jedoch, dass entweder das Finden eines one - Strings, der einem bestimmten Hash zugeordnet wird, oder das Finden von zwei - Strings, die dem gleichen Hash (dh einer Kollision ) zugeordnet werden, große Durchbrüche bedeuten würde für einen Kryptoanalytiker. Die große Schwierigkeit beider Probleme ist der Grund, warum gute Hash-Funktionen in der Kryptographie nützlich sind. 

17

MD5 erstellt keinen eindeutigen Hashwert. Das Ziel von MD5 ist es, schnell einen Wert zu erzeugen, der sich aufgrund einer geringfügigen Änderung der Quelle erheblich ändert. 

Z.B., 

"hello" -> "1ab53"
"Hello" -> "993LB"
"ZR#!RELSIEKF" -> "1ab53"

(Natürlich ist das keine tatsächliche MD5-Verschlüsselung) 

Die meisten Hashes (wenn nicht alle) sind auch nicht eindeutig. Vielmehr sind sie eindeutig genug, sodass eine Kollision höchst unwahrscheinlich ist, aber immer noch möglich ist. 

12
Trevel

Ein guter Weg, um sich einen Hash-Algorithmus vorzustellen, ist die Größenänderung eines Bilds in Photoshop. Angenommen, Sie haben ein Bild mit 5000x5000 Pixeln und dann die Größe auf nur 32x32. Was Sie haben, ist immer noch eine Darstellung des Originalbildes, aber es ist viel kleiner und hat gewissermaßen Teile der Bilddaten "weggeworfen", damit sie in die kleinere Größe passen. Wenn Sie also das 32x32-Bild auf 5000x5000 verkleinern möchten, erhalten Sie nur ein verschwommenes Durcheinander. Da ein 32x32-Bild jedoch nicht so groß ist, wäre theoretisch denkbar, dass ein anderes Bild verkleinert werden könnte, um exakt dieselben Pixel zu erzeugen!

Das ist nur eine Analogie, aber es hilft zu verstehen, was ein Hash tut.

8
nbevans

Eine Hash-Kollision ist viel wahrscheinlicher als Sie denken. Werfen Sie einen Blick auf das Geburtstagsparadox , um besser zu verstehen, warum das so ist.

4
Gamic

Da die Anzahl der möglichen Eingabedateien größer als die Anzahl der 128-Bit-Ausgänge ist, ist es unmöglich, jedem MD5-Hash eindeutig eine eindeutige Zuweisung zuzuweisen.

Kryptographische Hash-Funktionen werden zur Überprüfung der Datenintegrität oder digitaler Signaturen verwendet (der Hash wird aus Effizienzgründen signiert). Das Ändern des Originaldokuments sollte daher bedeuten, dass der Originalhash nicht mit dem geänderten Dokument übereinstimmt.

Diese Kriterien werden manchmal verwendet:

  1. Vorbildwiderstand: Für eine gegebene Hash-Funktion und einen gegebenen Hash sollte es schwierig sein, einen Eingang zu finden, der den angegebenen Hash für diese Funktion hat.
  2. Zweiter Vorbildwiderstand: Für eine gegebene Hash-Funktion und Eingabe sollte es schwierig sein, eine zweite, andere Eingabe mit demselben Hash zu finden.
  3. Kollisionswiderstand: Für eine gegebene Funktion muss es schwierig sein, zwei verschiedene Eingänge mit demselben Hash zu finden. 

Diese Kriterien werden so gewählt, dass es schwierig ist, ein Dokument zu finden, das mit einem bestimmten Hash übereinstimmt. Andernfalls könnten Dokumente gefälscht werden, indem das Original durch ein Dokument ersetzt wird, das mit Hash übereinstimmt. (Selbst wenn der Ersatz ein Unsinn ist, kann der bloße Ersatz des Originals zu Störungen führen.)

Nummer 3 impliziert Nummer 2.

Insbesondere für MD5 hat sich gezeigt, dass es fehlerhaft ist: So brechen Sie MD5 und andere Hash-Funktionen .

4
Geoglyph

Chinesische Wissenschaftler haben einen Weg gefunden, der als "gewählte Präfixkollisionen" bezeichnet wird, um einen Konflikt zwischen zwei verschiedenen Strings zu erzeugen.

Hier ist ein Beispiel: http://www.win.tue.nl/hashclash/fastcoll_v1.0.0.5.exe.Zip
Der Quellcode: http://www.win.tue.nl/hashclash/fastcoll_v1.0.0.5_source.Zip

2
gameboy90

Aber hier kommen Rainbow-Tische ins Spiel ... Im Prinzip wird nur eine große Anzahl von Werten separat gehasht und das Ergebnis wird auf der Festplatte gespeichert. Dann ist das Umkehrbit "nur", um in einer sehr großen Tabelle nachzuschlagen.

Offensichtlich ist dies nur für eine Teilmenge aller möglichen Eingabewerte möglich, aber wenn Sie die Grenzen des Eingabewerts kennen, kann er möglicherweise berechnet werden.

2
martinlund

Da die meisten bereits gesagt haben, dass MD5 für Datenströme mit variabler Länge zu einem Datenblock mit fester Länge gehasht werden soll, wird ein einzelner Hash von vielen Eingabedatenströmen gemeinsam genutzt.

Wenn Sie jedoch jemals die Originaldaten aus der Prüfsumme herausfinden mussten, z. B. wenn Sie den Hash eines Passworts haben und das Originalpasswort herausfinden müssen, ist es oft schneller, den Hash einfach zu googeln (oder was auch immer Sie suchen) für die Antwort als brutal erzwingen. Ich habe mit dieser Methode ein paar Passwörter gefunden.

1
Tim Matthews

per definitionem Hash (kryptografisches Hash) -Funktion: sollte nicht invertierbar sein, sollte keine Kollisionen haben (am wenigsten möglich).

regd deine frage: es ist ein weg hash. input (unabhängig von der Länge) erzeugt eine Ausgabe mit fester Größe (es wird basierend auf algo aufgefüllt (512-Bit-Grenze für MD5)). Die Informationen werden komprimiert (verloren) und können praktisch nicht aus umgekehrten Transformationen generiert werden.

zusätzliche Informationen zu MD5: Es ist anfällig für Kollisionen. diesen Artikel vor kurzem durchgegangen, http://www.win.tue.nl/hashclash/Nostradamus/

Öffnet den Quellcode für Krypto-Hash-Implementierungen (MD5 und SHA) unter Mozilla-Code . (Freebl-Bibliothek).

0
FL4SOF

Jetzt werden MD5-Hashes für einen Tag oder alle anderen Hashes für alle möglichen Zeichenfolgen vorberechnet und für einen einfachen Zugriff gespeichert. Obwohl MD5 theoretisch nicht umkehrbar ist, können Sie bei Verwendung solcher Datenbanken jedoch feststellen, welcher Text zu einem bestimmten Hashwert geführt hat.

Versuchen Sie beispielsweise den folgenden Hash-Code unter http://gdataonline.com/seekhash.php , um herauszufinden, welchen Text ich verwendet habe, um den Hash zu berechnen

aea23489ce3aa9b6406ebb28e0cda430
0
Babar

Der beste Weg, um zu verstehen, was die meisten Antworten bedeuten, besteht darin, den MD5-Algorithmus tatsächlich umzustellen. Ich erinnere mich, dass ich vor einigen Jahren versucht habe, den Algorithmus MD5crypt wiederherzustellen, nicht, um die ursprüngliche Nachricht wiederherzustellen, weil es eindeutig unmöglich ist, sondern nur eine Nachricht zu generieren, die denselben Hash erzeugt wie der ursprüngliche Hash. Dies würde mir zumindest theoretisch die Möglichkeit bieten, sich bei einem Linux-Gerät anzumelden, auf dem der Benutzer gespeichert ist: password in der Datei/etc/passwd, wobei die generierte Nachricht (password) verwendet wird, anstatt das ursprüngliche zu verwenden. Da beide Nachrichten den gleichen resultierenden Hash haben würden, würde das System mein (aus dem ursprünglichen Hash generiertes) Passwort als gültig erkennen. Das hat überhaupt nicht funktioniert. Wenn ich mich recht erinnere, tötete mich die Verwendung von salt in der ersten Nachricht nach einigen Wochen. Ich musste nicht nur eine gültige Anfangsnachricht erzeugen, sondern auch eine gesalzene gültige Anfangsnachricht, die ich nie tun konnte. Aber das Wissen, das ich aus diesem Experiment erhielt, war Nizza.

0
Vinicius

f (x) = 1 ist irreversibel. Hash-Funktionen sind nicht irreversibel.

Das ist eigentlich erforderlich damit sie ihre Funktion erfüllen können, zu bestimmen, ob jemand eine unverfälschte Kopie der gehashten Daten besitzt. Dies bringt Anfälligkeit für Brute-Force-Angriffe mit sich, die heutzutage vor allem gegen MD5 recht mächtig sind.

Es gibt auch hier und anderswo Verwirrung bei Leuten, die über mathematisches Wissen verfügen, aber wenig chiffrierendes Wissen. Mehrere Chiffren XOR einfach die Daten mit dem Schlüsselstrom, und so könnte man sagen, dass ein Geheimtext allen Klartexten dieser Länge entspricht, da Sie einen beliebigen Schlüsselstrom verwenden könnten.

Dies ignoriert jedoch, dass ein vernünftiger Klartext, der aus dem Startwert password erzeugt wird, sehr viel wahrscheinlicher ist als ein anderer, der durch den Startwert Wsg5Nm^[email protected]$IH$TYqiWvK!%&Ue&nk55ak%BX%9!NnG%32ftud%YkBO$U6o erzeugt wird, und zwar in dem Maße, dass jeder, der behauptet, dass der zweite eine Möglichkeit ist, darüber ausgelacht wird.

Wenn Sie versuchen, sich zwischen den beiden potenziellen Kennwörtern password und Wsg5Nm^bkI4EgxUO zu entscheiden, ist es auf die gleiche Weise nicht so schwierig, wie es einige Mathematiker glauben lassen.

0
Olathe