Bewertungen

Cryptocurrency Grundlagen: Hashing Basics & History

Ein Hashing-Verlauf

Eine generische Hash-Funktion ist eine spezielle Art von Programmierfunktion, die verwendet wird, um Daten beliebiger Größe auf Daten von fester Größe abzubilden. Hash-Funktionen stammen aus der Notwendigkeit, Daten zu komprimieren, um den zum Speichern großer Dateien erforderlichen Speicherplatz zu reduzieren. Der am häufigsten verwendete Anwendungsfall für eine Hash-Funktion ist eine andere spezifische Datenstruktur, die als Hash-Tabelle bezeichnet wird und die häufig für die schnelle Datensuche verwendet wird. Hash-Funktionen beschleunigen die Suche in einer Tabelle oder Datenbank, indem sie genau zwei identische Hashes erkennen.

Sie helfen auch, Tags für riesige Dateien wie mp3s, PDFs oder Bilder zu minimieren, um das Arbeiten mit diesen ziemlich großen Dateitypen überschaubar zu machen. Zur schnellen Identifizierung ist eine Schlüsselanforderung von Hash-Funktionen, dass sie eine alphanumerische Zeichenkette fester Länge ausgeben.

Während der Hauptgrund für den Beginn einer Hash-Funktion aus der Notwendigkeit resultierte, Inhalte zu komprimieren, wurde ein sekundärer Nutzen bald zu einem Hauptbestandteil von Hashing: einzigartig eindeutige Identifikatoren. Idealerweise sollten beim Hashing mehrerer Nachrichten niemals zwei verschiedene Nachrichten denselben Hashwert zurückgeben. Zwei verschiedene Hash-Nachrichten, die zu demselben Ausgabe-Hash führen, werden als -Kollision bezeichnet.

Aus der Sicht der Datenbankverwaltung würde dies bedeuten, dass zwei verschiedene Objekte in derselben Zelle gespeichert werden - nicht gut, wenn man eindeutige eindeutige Identifikatoren definieren möchte. Wenn wir eine Hash-Funktion mit unendlichen Eingängen in Betracht ziehen (was bedeutet, dass wir jeden String hashen können), können wir genau ableiten, warum Kollisionen tatsächlich unvermeidlich sind.

Pigeonhole-Prinzip

Innerhalb der Kryptographiemathematik gibt es ein Konzept, das -Schubladeprinzip genannt wird, das besagt, dass wenn wir (n) Elemente in (m) Räume einfügen, n> m dann gibt es prinzipiell mindestens einen Raum (m), der von mehr als zwei Elementen (n) besetzt ist.

Zum Beispiel überprüfen fünf Individuen ihre Mäntel in einem von drei verfügbaren Mantelcubbies. Da nach dem Schubladprinzip die Anzahl der gelagerten Mäntel (n) größer ist als die verfügbaren Fächer (m), ist gewährleistet, dass mindestens ein Fach mehr als einen einzigen Mantel enthält.

Typischerweise interessieren sich Softwareingenieure für Hash-Funktionen mit einer unendlichen Domäne (das heißt, sie nehmen als Eingabezeichenfolgen alle möglichen Längen an) und einen endlichen Bereich. Auch hier gilt: Da unser Bereich (n) kleiner ist als unser Bereich (m), folgt wiederum, dass bei mindestens eine Kollision existieren muss. Eine effektive Hash-Funktion versucht daher nur, die Anzahl der Kollisionen zu minimieren - warum dies wichtig wird, wird in einem Moment klarer, aber jetzt lassen Sie uns zur Geschichte der Hashes zurückkehren.

Während die Hash-Funktionen ausschließlich aus den Anforderungen der Datenbankpflege und -verwaltung stammten, die vor allem die Geschwindigkeit begünstigten, entwickelte sich ihr Nutzen schnell.Ein spezieller Zweig von Hash-Funktionen, die Privatsphäre, Sicherheit und Transparenz bevorzugten, trat bald in das Feld ein; ein Zweig von Hash-Funktionen, die im Fokus dieses Artikels bleiben werden: kryptografische Hash-Funktionen.

Kryptographisches Hashing

Kryptografische Hash-Funktionen, wie der Name schon sagt, begünstigen die Erhaltung absolut störungsfreier Nachrichten. Während die Minimierung von Kollisionen für andere Hash-Funktionen eine gute Praxis darstellt, ist die Minimierung von Kollisionen für spezifisch kryptografische Funktionen eine Anforderung von . Anstatt das Dienstprogramm für ein schnelle Datenbank oder Tabellennachschlag Szenario zu maximieren, kryptographische Hash-Funktionen werden mit einem kontradiktorischen Szenario im Verstand errichtet: ein, in dem ein Code-Breaker (Kryptoanalysator) aktiv nach einer Kollision zu verursachen versuchen. Wir werden nun Standard-Hash-Funktionsnotationen definieren und Hash-Funktionsprinzipien innerhalb der Kryptographie-Perspektive etablieren.

Hash-Funktionsnotation

Eine generische kryptografische Hash-Funktion hat zwei Eingaben: die zu komprimierende oder Hash-Nachricht (x) und einen öffentlichen Schlüssel, der die Ausgabe unseres Hashs fester Länge in alphanumerischen Zeichen darstellt . Unser Hash-Ergebnis wird als Message Digest oder einfach Digest (x *) bezeichnet. Das sieht ungefähr so ​​aus: H (s, x) = x *

Lassen Sie uns über diese Notation hinweg blättern, indem Sie ein reales Beispiel mit einer Hash-Funktion namens MD5 durchlaufen. Angenommen, wir möchten MD5 verwenden, um eine "Hello World! "Schnur. Wir wissen auch, dass MD5 standardmäßig immer eine Folge von 128 Bits (0 und 1) ausgibt. Diese Schreibweise würde wie folgt aussehen:

H (128, x) = ed076287532e86365e841e92bfc50d8c

Tatsächlich, wenn Sie fortfahren und versuchen, die MD5-Hash-Funktion "Hello World! "Sie selbst sollten den exakt gleichen resultierenden Hash sehen. Genial. Gehen wir nun zur Festlegung der Notation für eine Kollision vor; zusätzlich zu den vorherigen Variablen H, s, x, & x * führen wir nun eine zweite Nachricht ein (x '). Numerisch tritt eine Kollision auf, wenn das Hashing von zwei verschiedenen Nachrichten (x & x ') zu genau demselben Nachrichtenauszug (x *) führt:

Wenn H (128, x) = H (128, x') unsere Hash-Funktion (H) soll eine Kollision bei x & x haben.

Wir haben jetzt die Notation für den aktuellen Standard der Hash-Funktion Kryptographie festgelegt; Wenn ein Gegner (rechnerisch) einen Zusammenstoß verursachen kann, wird

eine Hash-Funktion nicht mehr als praktisch sicher angesehen. Gedanken schließen bis zum nächsten Mal

Die letzte mathematische Definition ist, wo die faszinierende catch-22 für Hashfunktionalität praktiziert. Hash-Funktionen entstehen aus der Notwendigkeit, standardisierte einheitliche Daten für die Bequemlichkeit der Speicherung zu komprimieren und auszugeben, was bedeutet, dass sie pseudozufällige Strings mit einer festen Länge von

ausspeien. Um eine vollständig kollisionsresistente Hash-Funktion zu erstellen, müsste jede einzelne Nachricht (x) eine Hash-Ausgabe der Länge haben, die der Eingabe entspricht. Ohne Hashes fester Länge verlieren wir unsere Fähigkeit, sie als bequeme Datenstruktur zu verwenden, aber durch die Zuweisung einer festen Länge machen wir unsere Hash-Funktion nicht vollständig kollisionsfrei. PS - Ich bin sicher, dass einige von Ihnen Smart Cookies bemerkt, dass in unserem MD5 Beispiel haben wir eine Hash-Funktion notiert, die eine Zeichenfolge der Länge zurückgibt 128

noch unsere „Hallo Welt! "Hash hat eine alphanumerische Zeichenfolge 32 zurückgegeben. Kommen Sie nächstes Mal wieder und wir werden tiefer in Hash-Funktionen gehen, um zu erklären, wo dieser Unterschied auftrat. Ähnliche