it-swarm.com.de

Wie funktioniert Hashing?

Ich habe mich für Informationssicherheit interessiert. Ich wurde kürzlich in die Idee des Hashings eingeführt. Was ich derzeit über Hashing verstehe, ist, dass es das Passwort verwendet, das ein Benutzer eingibt. Dann generiert es zufällig einen "Hash" unter Verwendung einer Reihe von Variablen und verschlüsselt alles. Wenn Sie dann dieses Passwort eingeben, um sich anzumelden, stimmt dieses Passwort mit dem Hash überein. Es gibt nur ein paar Dinge, die ich nicht verstehe.

  1. Warum ist es so schwer, diese Hashes zu knacken? Ich würde annehmen, wenn Sie die Methode gefunden haben, mit der sie verschlüsselt werden (lassen Sie uns mit einer extrem einfachen Methode wie Caesars Chiffre fortfahren, wenn Sie herausfinden, wie viele Sie verschieben müssen, können Sie dies für ganze Bücher tun). Selbst wenn es so etwas wie Zeit verwendet und es durcheinander bringt, gibt es einige wirklich große Möglichkeiten, die Optionen einzuschränken (Verwenden wir die Caesar-Chiffre, die das Jahr mod x verwendet. Sie wissen bereits, dass es realistisch gesehen zwei mögliche Jahre gibt, dann müssen Sie es einfach tun finde das zweite Puzzleteil heraus).

  2. Wenn sie zufällig generiert werden (auch wenn zwei Passwörter gleich sind, werden sie unterschiedlich ausgegeben), wie können sie feststellen, ob sie korrekt sind?

  3. Wie werden sie geknackt? Woher weiß Hash Cat, wann das Passwort erfolgreich entschlüsselt wurde?

Zugehöriges Video (beantwortet meine Frage jedoch nicht genau): https://www.youtube.com/watch?v=b4b8ktEV4Bg

79
Griffin Nowak

Schnell, Faktor 1081.

Oder wenn Sie es vorziehen, antworten Sie wie folgt: Was ist 23 mal 47?

Welches ist einfacher? Es ist einfacher, eine Multiplikation durchzuführen (befolgen Sie die Regeln nur mechanisch), als die Operanden wiederherzustellen, die nur für das Produkt gelten. Multiplikation. (Dies ist übrigens die Grundlage einiger kryptografischer Algorithmen wie RSA .)

Kryptografische Hash-Funktionen haben unterschiedliche mathematische Grundlagen, aber sie haben die gleiche Eigenschaft: Sie sind in Zukunft einfach zu berechnen (berechnen) H(x) gegebenes x), aber praktisch unmöglich, rückwärts zu berechnen (gegebenes y, berechne x so, dass H(x) = y) Tatsächlich ist eines der Anzeichen für eine gute kryptografische Hash-Funktion, dass es keinen besseren Weg gibt, x zu finden, als sie alle auszuprobieren und H(x) zu berechnen, bis Sie eine Übereinstimmung finden.

Eine weitere wichtige Eigenschaft von Hash-Funktionen ist, dass zwei verschiedene Eingaben unterschiedliche Hashes haben. Also wenn H (x1) = H (x2) können wir schließen, dass x1 = x2. Mathematisch gesehen ist dies unmöglich - wenn die Eingaben länger als die Länge des Hashs sind, müssen Kollisionen auftreten. Mit einer guten kryptografischen Hash-Funktion ist jedoch keine Möglichkeit bekannt, eine Kollision mit allen Computerressourcen der Welt zu finden.

Wenn Sie mehr über kryptografischer Hash Funktionen erfahren möchten, lesen Sie diese Antwort von Thomas Pornin . Weiter, ich werde warten.

Beachten Sie, dass eine Hash-Funktion keine Verschlüsselungsfunktion ist. Verschlüsselung bedeutet, dass Sie entschlüsseln können (wenn Sie den Schlüssel kennen). Mit einem Hash gibt es keine magische Zahl, mit der Sie zurückkehren können.

Die wichtigsten empfohlenen kryptografischen Hash-Funktionen sind SHA-1 und die SHA-2 -Familie (die in verschiedenen Ausgabegrößen erhältlich ist, hauptsächlich SHA-256 und SHA-512). MD5 ist älter und jetzt veraltet, da Kollisionen bekannt sind. Letztendlich gibt es keinen mathematischen Beweis dafür, dass es sich tatsächlich um gute kryptografische Hash-Funktionen handelt, sondern nur eine weit verbreitete Überzeugung, da viele professionelle Kryptografen Jahre ihres Lebens damit verbracht haben, sie zu brechen, und es nicht geschafft haben, sie zu brechen.

Ok, das ist ein Teil der Geschichte. Jetzt ist ein Passwort-Hash nicht direkt eine kryptografische Hash-Funktion. Eine Passwort-Hash-Funktion (PHF) benötigt zwei Eingaben: das Passwort und ein Salt. Das Salt wird zufällig generiert, wenn der Benutzer sein Passwort auswählt, und es wird zusammen mit dem Hash-Passwort PHF (Passwort, Salt) gespeichert. (Was zählt, ist, dass zwei verschiedene Konten immer unterschiedliche Salze haben und die zufällige Erzeugung eines ausreichend großen Salzes eine gute Möglichkeit ist, diese Eigenschaft mit überwältigender Wahrscheinlichkeit zu erhalten.) Wenn sich der Benutzer erneut anmeldet, liest das Überprüfungssystem das Salz aus der Kennwortdatenbank , berechnet PHF (Passwort, Salt) und überprüft, ob das Ergebnis in der Datenbank gespeichert ist.

Der springende Punkt ist, dass jemand, der ein Passwort knacken möchte, er muss den Hash kennen, bevor er starten kann und jedes Konto separat angreifen muss. Das Salz macht es unmöglich, im Voraus viele Crackarbeiten durchzuführen, z. durch Generieren einer Regenbogentabelle .

Dies beantwortet (2) und (3) - der legitime Prüfer und der Angreifer finden auf die gleiche Weise heraus, ob das Passwort (vom Benutzer eingegeben oder vom Angreifer erraten) korrekt ist. Ein letzter Punkt in der Geschichte: Eine gute Passwort-Hash-Funktion hat eine zusätzliche Eigenschaft, sie muss langsam sein. Der legitime Server muss es nur einmal pro Anmeldeversuch berechnen, während ein Angreifer es einmal pro Vermutung berechnen muss, sodass die Langsamkeit den Angreifer mehr verletzt (was notwendig ist, da der Angreifer normalerweise über mehr spezialisierte Hardware verfügt).

Wenn Sie jemals Passwörter hashen müssen, erfinden Sie keine eigene Methode . Verwenden Sie eine der Standardmethoden : scrypt , bcrypt oder PBKDF2 .

Kryptografische Hash-Funktionen sind mathematische Objekte, die als "großes Mischen und Verwürfeln einiger Bits" beschrieben werden können. Sie nehmen eine Folge von Bits (möglicherweise eine sehr lange) als Eingabe und bieten eine Ausgabe fester Größe. Grob gesagt sind sie so verwirrt, dass, obwohl sie nichts Geheimnisvolles enthalten (das ist nur deterministischer Code), niemand herausfinden kann, wie man sie "invertiert" (eine passende Eingabe für eine bestimmte Ausgabe findet), außer mit der grundlegenden Methode namens "Glück" ": Versuche zufällige Eingaben, bis eine Übereinstimmung gefunden wird.

Wie es wissenschaftlich passieren kann, dass Hash-Funktionen überhaupt existieren können, ist eine gute Frage .

Hashing ist keine Verschlüsselung . Es gibt kein Geheimnis, keinen Schlüssel zum Hashing.

Hash-Funktionen haben viele Verwendungszwecke. Eine davon ist "Passwortspeicherung". Eine Hash-Funktion scheint eine gute Sache für die Speicherung von Passwörtern zu sein. Wir möchten Passwörter nicht direkt speichern (andernfalls würde ein gelegentlicher Blick des Angreifers auf unsere Datenbanken zu viele Informationen liefern; siehe dies Blog-Beitrag für eine Diskussion); Wir möchten Token zur Passwortüberprüfung speichern: etwas, das die Überprüfung eines Passworts ermöglicht (das der Benutzer vorlegt), aber das Passwort selbst nicht preisgibt. Die Idee ist also: Speichern wir den Hash des Passworts. Wenn ein Passwort überprüft werden soll, berechnen wir einfach seinen Hash und prüfen, ob es mit dem gespeicherten Wert übereinstimmt. Es ist jedoch schwierig, das Kennwort nur anhand des Hash-Werts zu erraten, da die Hash-Funktion gegen "Inversion" resistent ist (siehe oben).

Da Passwörter eine spezielle Art von Daten sind (das sind Daten, an die sich Menschen erinnern können), benötigen wir für eine angemessene Sicherheit eine "verstärkte" Hash-Funktion:

  • Wir wollen eine sehr langsam Hash-Funktion.
  • Wir wollen nicht eins Hash-Funktion, sondern viele verschiedene Hash-Funktionen, damit jedes Passwort mit seiner eigenen Hash-Funktion gehasht wird; Hier geht es darum, parallele Angriffe abzuwehren. Dieser Vorgang, bei dem eine einzelne Hash-Funktion in viele Varianten umgewandelt wird, wird als Salting bezeichnet.

Siehe diese Antwort für eine gründliche Behandlung des Themas der Hashing-Passwörter.

32
Thomas Pornin

Hashing ist eine Funktion von einer Bitfolge (normalerweise variabler Länge) zu einer anderen Bitfolge (normalerweise kleiner und von fester Länge).

Hashing wird in Datenbanken zum Abrufen von Daten und in speicherinternen Datenstrukturen verwendet, die als Hash-Tabellen bezeichnet werden. Es ermöglicht uns, beliebige Daten wie eine Zeichenfolge oder ein kompliziertes Objekt mit vielen Feldern auf eine Binärzahl zu reduzieren, die dann direkt als Index in ein Array mit geringer Dichte verwendet werden kann, um die zugehörigen Daten abzurufen (mit einigen Details für die Behandlung von Hash Kollisionen).

Die auf die obige Weise verwendeten Hashing-Funktionen sind "Cousins" von kryptografischen Hashing-Funktionen. Sie sind auf unterschiedliche Anforderungen ausgelegt. Sie müssen schnell zu berechnen sein und eine gute Verteilung erreichen.

Beim sicheren Rechnen werden kryptografische Hashes verwendet, um Daten in einen repräsentativen kleinen Bitstring zu verarbeiten. Kryptografische Funktionen haben unterschiedliche Anforderungen. Sie sind so konzipiert, dass sie schwer rückgängig zu machen sind (als "Falltür" - oder "Einweg" -Funktionen). Nicht nur das, sondern eine wichtige Voraussetzung ist, dass es schwierig sein muss, für einen bestimmten Klartext- und Hashwert einen anderen Klartext zu finden, der denselben Hash erzeugt.

Hashing kann nicht nur für Kennwörter verwendet werden, sondern auch als Prüfsumme zur Überprüfung der Datenintegrität und als Teil der Implementierung digitaler Signaturen. Um ein großes Dokument digital zu signieren, müssen wir das Dokument einfach hashen, um einen "Digest" zu erstellen (ein Name, der für die Ausgabe einer Hashing-Funktion verwendet wird, wenn etwas sehr Langes gehasht wird). Dann wird nur dieser Digest durch das Kryptosystem mit öffentlichem Schlüssel geleitet, um eine Signatur zu erzeugen. Sie können die Schwäche dort sehen: Was ist, wenn es einem Angreifer gelingt, ein Dokument mit demselben Digest zu erstellen? Dann sieht es so aus, als ob die Originalunterschrift, die über dem Originaldokument erstellt wurde, tatsächlich eine Unterschrift eines gefälschten Dokuments ist: Eine Fälschung, bei der eine Unterschrift transplantiert wurde, wurde effektiv durchgeführt.

Mit dem Kennwort-Hashing können Systeme die Nur-Text-Version eines Kennworts nicht speichern, können jedoch überprüfen, ob der Benutzer, der versucht, einen Eintrag zu erhalten, dieses Kennwort kennt. Durch Hashing können Systeme nicht nur die Klartextkennwörter nicht speichern (was sehr sorgfältig geschützt werden müsste), sondern es besteht auch die Möglichkeit, dass die Kennwörter auch dann sicher sind, wenn die Hashes öffentlich zugänglich gemacht werden (ähnlich wie bei der Krypto mit öffentlichen Schlüsseln) Systeme können öffentliche Schlüssel offenlegen). In der Praxis sind Hashes dennoch vor öffentlichem Zugriff geschützt: Zum Beispiel /etc/shadow - Dateien auf Unix-ähnlichen Systemen, die weltweit lesbare /etc/passwd - Dateien ergänzen.

Die Hashing-Funktion ist alles andere als zufällig. Die Randomisierung wird jedoch verwendet, um Angreifer zu vereiteln, die große Wörterbücher mit Kennwörtern und Hashes erstellen, die es ihnen ermöglichen, einen Hash-Code nachzuschlagen und das entsprechende Kennwort abzurufen.

Um ein Passwort sicherer zu hashen, können wir einfach einige zufällige Bits hinzufügen, die als "Salz" bezeichnet werden. Unterschiedliche Salze, die demselben Passwort hinzugefügt werden, führen natürlich zu unterschiedlichen Hashes (hoffentlich mit wenigen oder keinen Kollisionen).

Wenn das zufällige Salz beispielsweise 32 Bit breit ist, bedeutet dies, dass ein Kennwort theoretisch auf über vier Milliarden verschiedene Arten gehasht werden kann, was es sehr unpraktisch macht, ein vorberechnetes Wörterbuch aller möglichen Hashes einer großen Anzahl von Kennwörtern zu haben.

Wenn der Benutzer authentifiziert wird, weiß er natürlich nichts über dieses Salz. Das ist in Ordnung, da das Salz zusammen mit dem Hash im Benutzerprofil gespeichert wird (häufig kombiniert mit dem Hash zu einem einzigen kompakten Bitstring). Wenn die Passworteingabe des Benutzers überprüft wird, wird das Salt zu dem von ihm eingegebenen Passwort hinzugefügt, sodass das Hashing mit dem richtigen Salt durchgeführt wird. Wenn das Passwort korrekt ist, stimmt der Hash überein, da das verwendete Salz auch das richtige ist und aus dem Benutzerprofil gezogen wurde.

Auf diese Weise wird Zufälligkeit in das Passwort-Hashing einbezogen, während es weiterhin funktioniert.

Was es schwierig macht, Hashes zu knacken, ist, dass sie aus "Falltür" - oder "Einweg" -Funktionen aufgebaut sind. In der Mathematik gibt es viele Beispiele für solche Dinge. Eine einfache Ergänzung ist beispielsweise eine Falltür. Wenn wir einige ganze Zahlen hinzufügen, um eine Summe zu erzeugen, ist es unmöglich, die ursprünglichen Zahlen wiederherzustellen, da nur die Summe bekannt ist.

Passwort-Hashes sind keine verschlüsselten Passwörter. Wenn ein Angreifer den Hash und das Salt eines Passworts hat und zufällig das Passwort errät, kann er dies leicht bestätigen, genau so wie es die Login-Authentifizierungssoftware tut: Sie führt das Passwort plus Salt über die Hashing-Funktion und aus sieht, dass der richtige Hash auftaucht.

19
Kaz

Einer der Schlüssel zum Hashing ist, dass es Informationen wegwirft. Sie können einen Hash nicht rückgängig machen, da das erforderliche Wissen weg ist. Hier sind einige Beispiele für funktionsfähige (aber ziemlich wertlose) Hashing-Funktionen. Wenn Sie mir ein Passwort geben, könnte ich Folgendes tun:

  • Zählen Sie die Anzahl der Vokale
  • Nehmen Sie den Code ASCII für jeden Buchstaben und XOR alle zusammen)
  • Nehmen Sie die CRC32-Prüfsumme der binären Darstellung des Passworts (dies ist tatsächlich ein echter Hash, nur kein kryptografischer)

In jedem dieser Fälle kann ich den Prozess nicht umkehren. Stattdessen muss ich den Prozess erneut ausführen, wenn Sie mir das Kennwort später erneut geben, um festzustellen, ob die von mir durchgeführte Berechnung übereinstimmt.

Zum Beispiel: Wenn Sie mir zunächst das Passwort "Affe" geben, kann ich die Nummer 3 (3 Vokale) speichern. Wenn ich später versuche, das Passwort "Drache" zu authentifizieren, führe ich dieselbe Prüfung erneut durch und finde 2, die nicht mit 3 übereinstimmt. Ich weiß also, dass Sie mir das falsche Passwort gegeben haben. Aber wenn Sie mir das Passwort "melissa" geben, würde ich fälschlicherweise annehmen, dass Sie das richtige Passwort eingegeben haben. Dies ist eine Hash-Kollision .

Das Regelwerk, das Sie anwenden, um die Nummer zu ermitteln, die ein bestimmtes Passwort darstellt, ist Ihre Hash-Funktion . Diese werden als "Einweg" -Funktionen betrachtet, da Sie sie nicht umkehren sollten. Hochwertige Hash-Funktionen sollen die Anzahl potenzieller Kollisionen begrenzen, sodass Sie sich nicht um dieses Problem kümmern müssen. Einen Schritt weiter sind kryptografische Hash-Funktionen so konzipiert, dass es schwierig ist, eine Zeichenfolge zu erstellen, die mit einer bestimmten Ausgabe übereinstimmt (und möglicherweise absichtlich Kollisionen erzeugt). . Sie sollen auch die Menge an Informationen begrenzen, die Sie über eine bestimmte Eingabe nur aus der Hash-Ausgabe abrufen können.

Daher können Sie nur feststellen, welches Kennwort mit einem bestimmten kryptografischen Hash übereinstimmt, indem Sie alle Möglichkeiten ausprobieren, bis Sie auf eines stoßen, das funktioniert. Weitere Gegenmaßnahmen (Salz, BPKDF2 usw.) erschweren diesen Vermutungsprozess noch mehr, indem die Person, die das Kennwort errät, bei jedem Versuch durch mehr Rahmen springt.

Beachten Sie, dass ich völlig beschönigt habe, wie eine kryptografische Hash-Funktion es schwierig macht, ein funktionierendes Passwort zu finden (auch wenn es nicht das ursprüngliche ist). Dies wird als " Preimage-Angriff " bezeichnet. Im obigen trivialen Beispiel ist das Aufstellen von "melissa" als Kandidatenkennwort mit 3 Vokalen ein Beispiel für einen solchen Angriff.

Kryptografische Hash-Funktionen tun dies normalerweise, indem sie die Eingabe durch mehrere "Runden" eines bestimmten Prozesses ausführen, wobei die Ausgabe jeder Runde Teil der Eingabe zur nächsten wird. Um die Eingabe der ersten Runde herauszufinden, müssten Sie die Eingabe der zweiten Runde herausfinden, was wiederum erfordert, dass Sie die Eingabe der dritten Runde usw. herausfinden, was bedeutet, dass jede Komponente erraten wird muss durch eine lange und komplexe Reihe von Berechnungen überprüft werden. Thomas Pornin hat eine hübsche erschöpfende Erklärung , wie dieser Widerstand funktioniert; ziemlich nützliche Lektüre, wenn Sie es wirklich verstehen wollen.

11
tylerl
  1. Bestimmen Sie den konstanten Wert von z, der diese Gleichung erfüllt: xy ^ 7 + yz ^ 5 + x ^ 3z = 0. Benötigen Sie Hilfe? OK, x = 32. Kannst du es immer noch nicht lösen? Dann sollten Sie die Antwort überhaupt nicht kennen.

    Der Wert von y, der dies auf eine einzelne Variablengleichung reduziert und die Lösung für diese einzelne Variable für jeden Schüler der 6. Klasse trivial macht (möglicherweise benötigt er einen Taschenrechner), ist ein Geheimnis, das ich nur mit Personen geteilt habe, denen ich vertraue. Ohne sie könnte z alles sein; sein Wert ist abhängig von y und kann daher ohne ein konstantes, bekanntes y nicht zufriedenstellend gelöst werden. Wenn Sie Ihren Wert nicht kennen, liegt es daran, dass ich Ihnen nicht genug vertraut habe, um ihn Ihnen privat zu geben.

    Dies ist das Grundprinzip der Kryptographie; Die mathematische Formel oder ein anderer deterministischer Prozess ist gut dokumentiert, und eine oder mehrere der möglichen Variablen der Formel dürfen auch öffentlich bekannt sein, so dass sich die beiden Parteien auf eine Möglichkeit einigen können, ihre Chiffren so einzurichten, dass sie jeweils entschlüsselt werden können was der andere verschlüsselt. Zwei Variablen bleiben jedoch geheim. Wenn Sie einen kennen, können Sie den anderen entdecken. Derjenige, den Sie kennen sollten, ist der Schlüssel, und derjenige, den Sie mit dem Schlüssel entdecken können, ist die Nachricht.

    Für einen Hash ist es etwas anders. Für einen Hash muss kein Geheimnis aufbewahrt werden, um ein anderes zu bewahren. Stattdessen arbeiten Hashes auf einer irreversiblen mathematischen Transformation. für jedes H(x) = y ist kein H bekannt-1(y) = x, außer zu versuchen H(x) für alle möglichen x, bis Sie y erhalten. Normalerweise liegt dies daran, dass mehrere Zwischenergebnisse der Gleichung nicht eindeutig sind, z. B. die Berechnung des Quadrats Die Wurzel einer positiven Zahl erzeugt technisch sowohl ein positives als auch ein negatives Ergebnis, da jede Zahl mit sich selbst multipliziert werden könnte, um das Ergebnis zu erzeugen. Die Umkehrung eines Moduls ist ähnlich mehrdeutig, die durch x mod 3 erzeugte Zahl 1 hätte erzeugt werden können durch jedes x = 3k + 1. Diese Arten von "Einweg" -Transformationen werden so kombiniert, dass der Versuch, die inverse Hash-Funktion zu berechnen, unendliche Möglichkeiten erzeugt; der einfachere (einfachste) Weg, sie zu lösen, besteht daher darin, einfach alle zu versuchen Mögliche Eingabe, bis eine Ausgabe übereinstimmt. Dies dauert noch lange.

  2. Hashes sind nicht zufällig. Wie ich bereits sagte, sind Hashes das Ergebnis einer irreversiblen mathematischen Operation. Diese Operation muss immer noch deterministisch sein; Bei einer konstanten Eingabe ist die Ausgabe konstant, unabhängig davon, wie oft Sie die Operation ausführen. Es gibt keine zufällige Komponente.

    Wo Sie verwirrt gewesen sein könnten, ist der Begriff für das, was ein Hash simuliert, nämlich ein zufälliges Oracle. Stellen Sie sich eine Black Box vor, in der sich ein kleiner Mann mit einem fotografischen Gedächtnis und einer mystischen Methode zur Erzeugung perfekt zufälliger Zahlen befindet. Sie schreiben etwas auf ein Stück Papier und schieben es durch einen Schlitz, in den der Mann es bekommt. Er liest es und eines von zwei Dingen passiert. Entweder hat er es noch nicht gelesen. In diesem Fall generiert er eine neue Zufallszahl und gibt sie Ihnen, wobei er sowohl Ihre Nachricht als auch die Nummer in sein Gedächtnis schreibt. Oder er hat genau diese Nachricht zuvor gelesen. In diesem Fall erinnert er sich an die Nummer, die er beim ersten Lesen generiert hat, und gibt Ihnen diese Nummer. Der Zufallszahlengenerator erzeugt niemals eine Zahl, die er bereits erzeugt hat, er hat eine unendliche mögliche Größe und das Gedächtnis des kleinen Mannes ist unbegrenzt und unfehlbar. Daher wird der kleine Mann niemals denken, dass er zuvor eine Nachricht gelesen hat, wenn er dies nicht getan hat, niemals vergessen, dass er zuvor eine Nachricht gelesen hat, und wird daher niemals zwei verschiedene Zahlen für genau dieselbe Nachricht oder dieselbe Nummer für zwei verschiedene produzieren Mitteilungen.

    Dies versuchen Hash-Funktionen zu simulieren. Sie können diesen kleinen Mann nicht mit dem fotografischen Speicher modellieren, da dies unendlichen Speicherplatz und unbegrenzte, universelle Verfügbarkeit erfordern würde, selbst für Geräte, die auf keine andere Weise mit einem anderen Gerät verbunden sind. Stattdessen stützen sie sich auf eine deterministische, aber zufällige -suchende Berechnung, die die Nachricht in ihren Hashwert "verdaut". Dieselbe Hash-Funktion erzeugt bei gleicher Nachricht denselben Digest. Diese Funktionen sind jedoch in der Anzahl der Hash-Werte begrenzt, die sie zurückgeben dürfen. Dies schafft die Möglichkeit von sogenannten Hash-Kollisionen. Es gibt mehr mögliche Nachrichten als Hash-Werte. Früher oder später (hoffentlich später) erzeugen zwei verschiedene Nachrichten denselben Hash.

  3. Hashes können aus drei grundlegenden Gründen geknackt werden. Erstens, weil sie eine deterministische, mathematische Ableitung ihrer Nachricht sind, finden Mathematiker (und damit Angreifer) schließlich eine mathematische Beziehung zwischen einer Nachricht und ihrem Hash oder zwischen zwei Nachrichten und ihren resultierenden Hashes. Was einmal zufällig aussah, ist nicht mehr so. Dies würde eine Reihe von Angriffen ermöglichen, die auf der Art der gefundenen Schwäche beruhen. Wenn es eine algorithmische Möglichkeit gibt, bei gegebener Nachricht und ihrem Hash eine kollidierende Nachricht zu generieren, ist dies ein Problem. Wenn es eine Möglichkeit gibt, eine Nachricht zu manipulieren und den resultierenden Hash vorherzusagen, ist dies ein anderes Problem. Wenn es tatsächlich eine Möglichkeit gibt, den Hash umzukehren und eine Nachricht aus dem Hash zu erzeugen, die beim erneuten Hashing denselben Hash erzeugt, ist dies ein ernstes Problem.

    Zweitens erzeugen zwei Nachrichten denselben Hash, da Hashes früher oder später eine begrenzte Digest-Größe haben. Das bedeutet, dass ein Angreifer nicht die Nachricht the finden muss, mit der Sie einen bestimmten Hash erzeugen. Alles, was er tun muss, ist zu finden a Nachricht, die den gleichen Hash erzeugt. Die Chancen dafür sind gering, theoretisch eine Chance von so vielen möglichen Hashes, aber immer noch besser als eine im Unendlichen.

    Schließlich gibt es zwar viele mögliche Nachrichten, aber eine weitaus geringere Anzahl von wahrscheinlich Nachrichten. Die Nachrichten, die wir normalerweise an Hash-Funktionen senden, haben normalerweise eine gewisse Struktur (basierend auf Sprache, Inhalt, elektronischer Formatierung und Zweck), was bedeutet, dass wir bei einem bestimmten Teil der Nachricht andere Teile der Nachricht genauer erraten können. In informationswissenschaftlichen Begriffen bedeutet dies, dass Nachrichten, die in Hashes konvertiert werden, häufig eine niedrigere Entropie haben als die Hash-Funktion selbst; Einfach ausgedrückt kann eine Hash-Funktion, die 256-Bit-Digests erzeugt, theoretisch jede Permutation dieser Bits erzeugen, 2 ^ 256. Wenn es jedoch beispielsweise nur 10.000 mögliche Nachrichten gibt, die jemals von einem auf Angriffe untersuchten System in diese Hash-Funktion eingegeben werden könnten, werden nur 10.000 der 2 ^ 256 möglichen Hash-Werte jemals gesehen, und was noch wichtiger ist, eine Der Angreifer müsste im schlimmsten Fall nur alle 10.000 möglichen Eingaben versuchen, um die zu finden, die den gesuchten Hash-Wert erzeugt.

5
KeithS