„Hashfunktion“ – Versionsunterschied
[ungesichtete Version] | [gesichtete Version] |
Gorgo (Diskussion | Beiträge) →Anschauliche Erklärung: genauer; überflüssiger absatz raus |
→Blockchain: Präzisierung |
||
(500 dazwischenliegende Versionen von mehr als 100 Benutzern, die nicht angezeigt werden) | |||
Zeile 1: | Zeile 1: | ||
[[Datei:Hash table 4 1 1 0 0 1 0 LL.svg|mini|hochkant=1.1|Eine Hashfunktion, die Namen auf [[Ganzzahl]]en abbildet. Für die Namen „John Smith“ und „Sandra Dee“ gibt es eine Kollision.]] |
|||
{{Redundanztext|--[[Benutzer:Siehe-auch-Löscher|Siehe-auch-Löscher]] 16:30, 5. Jul 2006 (CEST)|Juli 2006|Hash-Wert|Hash-Funktion}} |
|||
Eine '''Hash-Funktion''' bzw. '''Streuwertfunktion''' ist eine [[Funktion (Mathematik)|Funktion]], die zu einer Eingabe aus einer (üblicherweise) großen [[Definitionsmenge|Quellmenge]] eine Ausgabe aus einer (im Allgemeinen) kleineren Zielmenge (die [[Hashwert]]e, meist eine Teilmenge der [[natürliche Zahlen|natürlichen Zahlen]]) [[Abbildung (Mathematik)|erzeugt]]. |
|||
Eine '''Hashfunktion''' oder '''Streuwertfunktion''' ist eine [[Funktion (Mathematik)|Abbildung]], die eine große [[Definitionsmenge|Eingabemenge]], die ''[[Schlüssel (Datenbank)|Schlüssel]]'', auf eine kleinere [[Zielmenge]], die Hashwerte, abbildet. Eine Hashfunktion ist daher im Allgemeinen nicht [[Injektivität|injektiv]]. Die Eingabemenge kann Elemente unterschiedlicher Längen enthalten, die Elemente der Zielmenge haben dagegen meist eine feste Länge. |
|||
Hash-Funktionen unterscheiden sich in der Definitionsmenge ihrer Eingaben, der Zielmenge der möglichen Ausgaben und im Einfluss von Mustern und Ähnlichkeiten verschiedener Eingaben auf die Ausgabe. Hash-Funktionen werden in [[Hashtabelle]]n, der [[Kryptologie]] und der [[Datenverarbeitung]] verwendet. Eine gute Hash-Funktion zeichnet sich dadurch aus, dass sie für die Eingaben, für die sie entworfen wurde, wenig [[Kollisionsfreiheit|Kollisionen]] erzeugt. Dadurch können die meisten Eingaben an Hand ihres Hashwertes unterschieden werden. |
|||
Der Name |
Der Name ''Hashfunktion'' stammt vom englischen Verb ''to hash'', das sich mit „zerhacken“ übersetzen lässt. Der deutsche Name lautet ''Streuwertfunktion''. Beide Namen deuten darauf hin, dass diese Funktionen normalerweise darauf angelegt sind, die Daten zu „verstreuen“ und zu „zerhacken“ (siehe auch [[Zerhacker (Funktechnik)|Zerhacker]] in der Funktechnik). Speziell in der Informatik verwendet man auch den Begriff '''Hash-Algorithmus''' ({{enS|hash algorithm}}), da Hashfunktionen oftmals in Form eines [[Algorithmus]] spezifiziert werden, der die Berechnung der [[Mathematische Funktion|mathematischen Funktion]] beschreibt. |
||
Die Hash- oder Streuwerte sind meist [[Skalare Variable|skalare]] Werte aus einer begrenzten Teilmenge der [[Natürliche Zahl|natürlichen Zahlen]]. Eine gute Hashfunktion liefert dabei für die Eingabedaten Werte derart, dass zwei unterschiedliche Eingaben auch zu unterschiedlichen Ausgabewerten führen. |
|||
==Anschauliche Erklärung== |
|||
Bei einer Hash-Funktion geht es allgemein darum, zu einer lange Eingabe (zum Beispiel einen Text) eine kurze, möglichst eindeutige Identifikation (den Hash-Wert des Textes) zu finden. |
|||
Eine Kollision tritt dann auf, wenn unterschiedlichen Eingabedaten derselbe Hashwert zugeordnet wird. Da die Menge der möglichen Hashwerte meist kleiner ist als die der möglichen Eingaben, sind solche Kollisionen dann prinzipiell unvermeidlich, weshalb es Verfahren zur Kollisionserkennung geben muss. Eine gute Hashfunktion zeichnet sich dadurch aus, dass sie für die Eingaben, für die sie entworfen wurde, möglichst wenige Kollisionen erzeugt. Für bekannte und beschränkte Eingabemengen können auch [[Perfekte Hash-Funktion|perfekte]] (kollisionsfreie) Hashfunktionen gefunden werden. |
|||
Das ist etwa dann sinnvoll, wenn man zwei ''große ähnliche'' Dateien vergleichen will: Anstatt die 25 Seiten eines Textes durchzusehen, ob auch wirklich jeder Buchstabe gleich ist, schauen wir auf die kurzen Hash-Werte der beiden Dokumente und sehen sofort, ob diese beiden gleich oder verschieden sind. |
|||
In der Datenspeicherung kann ein Hashwert verwendet werden, um die Speicherstelle der angefragten Daten zu berechnen, z. B. in einer [[Hashtabelle]]. Bei [[Prüfsumme]]n verwendet man Hashwerte, um Übertragungsfehler zu erkennen. Ein Hashwert wird deshalb auch als {{enS|Fingerprint}} bezeichnet, da er eine ''nahezu eindeutige'' Kennzeichnung einer größeren Datenmenge darstellt, so wie ein [[Fingerabdruck]] einen Menschen nahezu eindeutig identifiziert. In der [[Kryptologie]] werden spezielle [[kryptographische Hashfunktion]]en verwendet, bei denen zusätzlich gefordert wird, dass es praktisch unmöglich ist, Kollisionen absichtlich zu finden. |
|||
Das kann man praktisch anwenden, wenn wir eine Datei aus dem Internet herunterladen und der Autor den Hash-Wert angegeben hat: Um zu prüfen, ob es Übertragungsfehler gegeben hat, müssen wir die Datei nicht etwa ein zweites Mal komplett herunterladen, sondern nur den Hash-Wert bilden und diesen mit der Angabe des Autors vergleichen. |
|||
== Definition == |
|||
Ein Beispiel für eine einfache Hash-Funktion für Zahlen wäre, von der Zahl (Eingabe) die letzte Ziffer als Hash-Wert zu benutzen. Somit würde 97 den Wert 7 ergeben, 153 würde zu 3, selbst eine große Zahl wie 238.674.991 würde verkleinert zu 1. Der Wertebereich der unendlich großen Quellmenge würde also auf den Wertebereich von 0-9 abgebildet. |
|||
Eine Abbildung <math>h\colon K \rightarrow S</math> heißt ''Hashfunktion'', wenn <math>|K|\geq\ |S|</math> gilt. Insbesondere liefert <math>h</math> eine [[Hashtabelle]] der Größe <math>|S|</math>. Die Menge <math>K</math> repräsentiert die Daten, die ''gehasht werden sollen'', und wird auch die Menge der Schlüssel genannt; die Menge <math>S</math> ist die Menge der möglichen Hashwerte. Typischerweise wird die Menge der Hashwerte als Anfangsstück der natürlichen Zahlen gewählt: <math>S \subseteq \left\{ 0, \dotsc, m-1 \right\}</math>. Diese Menge heißt dann auch [[Adressraum]]. |
|||
Typischerweise wird in der Praxis immer nur eine kleine Teilmenge der Schlüssel <math>K' {}\subseteq{}K</math> mit <math>h</math> abgebildet. Die Menge <math>S':=\{h(k) | k\in K' \}</math> sind dann die tatsächlich genutzten Hashwerte. |
|||
Weil bei einer Hash-Funktion der [[Wertebereich]] meist kleiner als der der [[Definitionsmenge|Quellmenge]] ist, können mehrere verschiedene Eingaben die gleiche Ausgabe erzeugen. Das leuchtet bei unserem Beispiel unmittelbar ein: 11 und 21 liefern beide 1. Das ist die Schwachstelle von Hash-Funktionen und wird als Kollision bezeichnet. Durch die Wahl einer geeigneten Funktion kann die Wahrscheinlichkeit solcher Kollisionen deutlich vermindert werden und man gewinnt für die praktische Anwendung eine hinreichende Sicherheit. Jedoch ist die Wahrscheinlichkeit für Kollisionen sehr groß, wenn schon einige Daten gespeichert wurden, vgl. auch [[Geburtstagsparadoxon]]. Man muss sich für den Fall einer Kollision somit auch immer eine Strategie der Kollisionsauflösung überlegen. |
|||
Das Verhältnis <math>\beta = \frac{\left| S' \right|}{\left| S \right|} </math> liefert den Belegungsfaktor. |
|||
Der Fall <math>k \not= k' \land h(k) = h(k')</math> wird als Kollision bezeichnet. Eine [[Injektivität|injektive]] Hashfunktion heißt perfekt, u. a. weil sie keine Kollisionen erzeugt. |
|||
== Kriterien == |
|||
* Geringe Wahrscheinlichkeit von Kollisionen der Hashwerte für den Eingabewertebereich, also möglichst eine [[Gleichverteilung]] der Hashwerte auf die erwarteten Eingabewerte. |
|||
* ''[[Surjektivität]]'' – Kein Ergebniswert (Hashwert) soll unmöglich sein, jedes Ergebnis (jeder Hashwert im definierten Wertebereich) soll tatsächlich vorkommen können. |
|||
* ''[[Effizienz (Informatik)|Effizienz]]'' – Die Funktion muss schnell berechenbar sein, ohne großen Speicherverbrauch auskommen (der Speicherbedarf des Hashwertes soll deutlich kleiner sein als jener des Schlüssels / Eingabewertes) und sollte die Quelldaten (Eingabewerte) möglichst nur einmal lesen müssen. |
|||
Folgende Kriterien spielen je nach Anwendung eine unterschiedliche Rolle: |
|||
* falls die Hashfunktion einen [[sortieren|sortiert]]en Zugriff in der Hashtabelle einer Datenbank erlauben soll: ''[[Ordnungsrelation|ordnungs]]<nowiki />erhaltend'' |
|||
* bei kryptologischen Hashfunktionen: ''[[Chaos]]'' oder ''[[Lawineneffekt (Kryptographie)|Lawineneffekt]]'' – Die Hashfunktion soll eine gute [[Diffusion (Kryptologie)|Diffusion]] besitzen; ähnliche Quellelemente (Eingabewerte) sollen zu völlig verschiedenen Hashwerten führen. Im Idealfall verändert das Umkippen eines [[Bit]]s in der Eingabe durchschnittlich die Hälfte aller Bits im resultierenden Hashwert. |
|||
* bei kryptologischen Hashfunktionen: ''[[Konfusion (Kryptologie)|Konfusion]]'' – Vom Hashwert sollen keine Rückschlüsse auf den Eingabewert gemacht werden können. |
|||
* bei kryptologischen Hashfunktionen: ''Un[[Umkehrfunktion|umkehrbarkeit]]'' – Es soll kein praktisches Verfahren möglich sein, das aus einem Hashwert den Eingabewert bestimmt. |
|||
== Anwendungen == |
== Anwendungen == |
||
Hashfunktionen werden typischerweise angewendet, um |
|||
* einem komplexen Objekt eine [[Speicheradresse]] zuzuweisen. Zum Beispiel könnte „Max Mustermann“ im Ordner M abgelegt werden, dem ersten Buchstaben des Nachnamens. |
|||
* eine kurze [[Prüfsumme]] zu dem Objekt zu berechnen. Beispiel sind die Prüfsumme einer [[Internationale Standardbuchnummer|ISBN]] und die [[zyklische Redundanzprüfung]] zur Erkennung von Übertragungsfehlern von Dateien. |
|||
* einen Inhalt nahezu eindeutig, aber mit wenig [[Speicherplatz]] zu identifizieren, ohne etwas über den Inhalt zu verraten, zum Beispiel in der [[Kryptographie]]. |
|||
Je nach Anwendung hat man unterschiedliche Anforderungen an die Funktion. Gruppiert man beispielsweise eine Adresskartei nach dem ersten Buchstaben des Nachnamens, so spart man sich offensichtlich bei der Suche viel Zeit, denn man braucht nur einen von 26 Teilen zu durchsuchen. Diese Hashfunktion ist für den Menschen sehr praktisch, da sie sehr einfach zu berechnen ist, jedoch würde ein Computerprogramm andere Verfahren verwenden, um ein Adressbuch zu organisieren. Für das Programm ist es nämlich wichtig, möglichst wenige Kollisionen zu haben. Es gibt aber offenbar viele Namen, die mit demselben Anfangsbuchstaben beginnen, und sie kommen ungleichmäßig oft vor. Legt man also beispielsweise Personalakten nach diesem Prinzip ab, so hat man oftmals viele Akten im Ordner mit dem Buchstaben S, während der Ordner Q leer bleibt. |
|||
Der Hashwert kann zum Auffinden von Daten in einer [[Datenbank]] (''siehe'' [[Hashverfahren]]) oder zum [[digitale Signatur|digitalen Signieren]] eines Dokumentes verwendet werden. Hash-Funktionen können unter Umständen auch zur Einweg-Verschlüsselung verwendet werden. (Siehe auch: [[Kryptologie]]) |
|||
Die [[Quersumme#Einstellige (oder iterierte) Quersumme|einstellige Quersumme]] ist eine sehr einfache Hashfunktion. Sie ordnet einer beliebigen Zahl eine einstellige Zahl zu, so wird beispielsweise 25 auf 2 + 5 = 7 abgebildet. Als Prüfsumme ist diese Quersumme aber nicht gut geeignet, da die Vertauschung von Ziffern – ein typischer Fall beim Abtippen von langen Zahlen – nicht erkannt wird. So hat auch die Zahl 52 dieselbe Quersumme 5 + 2 = 7. Prüfsummen wie bei der ISBN eines Buches oder die [[CRC-32]]-Prüfsumme einer Datei, z. B. beim Prüfen einer aus dem Internet heruntergeladenen Datei auf Übertragungsfehler, eignen sich besser, derartige Fehler zu erkennen. |
|||
[[Prüfsumme]]n erzeugen ebenfalls eine Abbildung auf eine reduzierte Datenmenge – stellen somit auch eine Hash-Funktion dar –, hier mit dem Ziel, die Datenintegrität bei Störeinflüssen oder absichtlichen Manipulationen sicherzustellen. Absichtliche Manipulationen sind jedoch nur begrenzt feststellbar, solange die Hash-Funktion gewissen Ansprüchen genügt (''siehe'' [[Kollisionsfreiheit]] und [[Unumkehrbarkeit]]). |
|||
Bei der Identifikation von Inhalten mit [[Kryptographische Hashfunktion|kryptographischen Hashfunktionen]] ist es nicht nur wichtig, dass sich der gesamte Hashwert mit allen Bits bei jeder kleinen Modifikation scheinbar zufällig ändert und dass es fast unmöglich ist, einen zweiten Inhalt mit demselben Hashwert zu erzeugen, um einen Komplettaustausch des Inhaltes zu vermeiden. Ebenso wichtig ist es, dass der Inhalt nicht aus dem Hashwert [[Rekonstruktion|rekonstruiert]] werden kann. Hat man zwei Dokumente ausgetauscht und möchte beispielsweise am Telefon die erfolgreiche Übertragung überprüfen, so reicht es, am Telefon die Korrektheit des Hashwertes zu überprüfen. Wird das Gespräch [[Abhören|abgehört]], so wird dabei nichts über den Inhalt der Nachricht verraten, selbst falls Teile des Inhalts bereits bekannt sein sollten. |
|||
Bei der Programmierung von Internet-Anwendungen werden Hash-Funktionen zum Erzeugen von [[Session-ID]]s genutzt, indem unter Verwendung von wechselnden Zustandswerten (wie Zeit, IP-Adresse) ein Hashwert berechnet wird. |
|||
=== Datenbanken === |
|||
== Definition einer Hash-Funktion == |
|||
[[Datenbankmanagementsystem]]e verwenden Hashfunktionen, um Daten in großen Datenbeständen mittels [[Hashtabelle]]n zu suchen. Darüber wird ein [[Datenbankindex]] realisiert. |
|||
Eine Abbildung <math>h: K \rightarrow S</math> heißt ''Hash-Funktion'', wenn <math>|K|\geq\ |S|</math> gilt. |
|||
Insbesondere liefert <math>h</math> eine [[Hashtabelle]] der Größe <math>|S|</math>. |
|||
<math>S</math> heißt auch die ''Menge der Schlüssel''. Die Menge <math>K</math> repräsentiert die Daten die ''gehasht werden sollen''. Typischerweise wird die Menge der Schlüssel als Anfangsstück der natürlichen Zahlen gewählt: <math>S \subseteq \left\{ 0, \ldots, m-1 \right\}</math> |
|||
Diese Menge heißt dann auch ''Adressraum''. |
|||
Mittels Hashfunktionen kann zudem die [[Denormalisierung #Fragmentierung|Fragmentierung]] von Datensätzen realisiert werden. Dabei wird die Hashfunktion auf den [[Primärschlüssel]] des betreffenden Objektes angewandt. Das Ergebnis referenziert dann seinen Speicherort. |
|||
Typischerweise wird in der Praxis immer nur eine kleine Teilmenge <math>K' {}\subseteq{}K</math> mit <math>h</math> abgebildet. Die Menge <math>S':=\{h(k) | k\in K' \}</math> sind dann die tatsächlich genutzten Schlüssel. |
|||
Auch für vergleichsweise kleine Datenmengen werden Hashfunktionen benutzt, beispielsweise in [[Kompressionsalgorithmus|Kompressionsalgorithmen]] wie [[LZW]]. |
|||
Das Verhältnis <math>\beta = \frac{\left| S' \right|}{m} </math> liefert uns den Belegungsfaktor. |
|||
=== Blockchain === |
|||
Der Fall <math>k \not= k' \land h(k) = h(k')</math> wird als [[Kollision]] bezeichnet. Eine [[Injektivität (Mathematik)|injektive]] Hash-Funktion heißt perfekt, u.a. weil sie keine Kollisionen erzeugt.<br> |
|||
Darüber hinaus spielen Hashfunktionen eine zentrale Rolle in der [[Blockchain]]-Technologie. In Blockchains wie [[Bitcoin]] oder [[Ethereum]] werden kryptographische Hashfunktionen genutzt, um Transaktionen und Blöcke miteinander zu verknüpfen. Jeder Block enthält den Hash des vorherigen Blocks, was die Integrität der gesamten Kette sicherstellt. Bereits eine minimale Änderung an einem Block würde den Hashwert verändern und damit die Verknüpfung zwischen zwei Blöcken ungültig machen. So wird sichergestellt, dass einmal gespeicherte Daten nicht nachträglich manipuliert werden können, ohne dass dies auffällt.<ref>{{Internetquelle |autor=Felix Rieger |url=https://kryptozukunft.com/2025/03/10/hashwert-einfach-erklart-der-digitale-fingerabdruck-der-blockchain/ |titel=Hashwert |datum=2025-03-10 |sprache=de |abruf=2025-03-24}}</ref> |
|||
=== Prüfsummen === |
|||
==Kriterien für eine gute Hash-Funktion== |
|||
{{Hauptartikel|Prüfsumme}} |
|||
[[Prüfsumme]]n sind ein einfaches Mittel, um die Plausibilität zur Erkennung von Veränderungen an übertragenen Daten zu erhöhen. Nur die Teilmenge der Datenvarianten, die bei Berechnung der Prüfsumme das gleiche Ergebnis wie das der Original-Daten erzeugen, kann noch als Verfälschung unerkannt bleiben. Mit mehreren verschiedenen passend erzeugten Prüfsummen kann die Wahrscheinlichkeit einer Kollision stark reduziert werden. |
|||
* [[Datenreduktion]] |
|||
:Der Speicherbedarf des Hash-Wertes soll deutlich kleiner sein als der der Nachricht. |
|||
* [[Chaotisch]] |
|||
:Ähnliche Quellelemente sollen zu völlig verschiedenen Hash-Werten führen. Im Idealfall verändert das Umkippen eines Bits in der Eingabe durchschnittlich die Hälfte aller Bits im resultierenden Hash-Wert. |
|||
* [[Surjektiv]] |
|||
:Die Funktion sollte alle Schlüsselwerte als Ergebnis liefern. |
|||
* [[Effizienz]] |
|||
:Die Funktion muss schnell berechenbar sein, ohne großen Speicherverbrauch auskommen und sollte die Quelldaten möglichst nur einmal lesen müssen. |
|||
Ein Fehler ist immer feststellbar, wenn die berechnete Prüfsumme der empfangenen Daten sich von der übertragenen Prüfsumme, also der der Originaldaten, unterscheidet. Falls ein Fehler festgestellt wird, kann die Verfälschung auch ausschließlich in der Prüfsumme enthalten sein. Die Eignung verschiedener Hashfunktionen zur Prüfsummenberechnung hängt von deren Kollisionswahrscheinlichkeit ab. |
|||
===Zusätzliche Forderungen für kryptographisch sichere Hash-Funktionen=== |
|||
* [[Kollisionsfreiheit]] |
|||
:Es darf nicht effizient möglich sein, zwei Quellelemente mit demselben Hash-Wert zu finden. Andererseits sind Kollisionen bei der Adressberechnung in Datenbanken nicht zu vermeiden, so dass eine entsprechende Behandlungs-Strategie verfügbar sein muss. |
|||
* [[Unumkehrbarkeit]] |
|||
:Zu der Funktion gibt es keine effizient berechenbare [[inverse Funktion]], mit der es möglich wäre, für ein gegebenes Zielelement ein passendes Quellelement zu finden. |
|||
Wenn die Prüfsumme vor gezielten Manipulationen der Daten schützen soll, wird eine [[kryptographische Hashfunktion]] verwendet, da hier nur mit sehr hohem Rechenaufwand eine Kollision gefunden werden kann. |
|||
== Bekannte Hash-Funktionen == |
|||
*[[Divisions-Rest-Methode]] |
|||
*[[Doppel-Hashing]] |
|||
*[[Multiplikative Methode]] |
|||
*[[Mittquadratmethode]] |
|||
*[[Zerlegungsmethode]] |
|||
*[[Ziffernanalyse]] |
|||
*[[Quersumme]] |
|||
==== Beispiele ==== |
|||
== Allgemeine Hash-Algorithmen == |
|||
Hashwerte haben unter anderem bei [[Peer-to-Peer|P2P]]-Anwendungen aus verschiedenen Gründen eine wichtige Aufgabe. Die Hashwerte werden hier sowohl zum Suchen und Identifizieren von Dateien als auch zum Erkennen und Prüfen von übertragenen Dateifragmenten verwendet. So lassen sich große Dateien zuverlässig in kleinen Segmenten austauschen. |
|||
*[[Parität (EDV)|Parität]] |
|||
*[[Prüfziffer]] |
|||
*[[Fehlerkorrekturverfahren]] |
|||
*[[Quersumme]] |
|||
*[[Prüfsumme]] |
|||
*[[Modulo|Modulo-Funktion]] |
|||
*[[Zyklische Redundanzprüfung]] |
|||
*[[Adler-32]] |
|||
*[[Hash-Wert]] |
|||
*[[Merkles Meta-Verfahren]] |
|||
Zur Anwendung in P2P-Netzen kommen vor allem gestufte Hashfunktionen, bei denen für kleinere Teile einer Datei der Hashwert und dann aus diesen Werten ein Gesamtwert berechnet wird. Bei den Netzwerken [[Gnutella2|G2]] und [[Direct Connect]] sind dies zum Beispiel [[Tiger-Tree-Hash]]-Funktionen. |
|||
== Hash-Algorithmen in der Kryptographie == |
|||
*[[MD2]], [[MD4]], [[MD5]] |
|||
*[[Sicherer Hash-Algorithmus|SHA]] |
|||
*[[RIPEMD-160]] |
|||
*[[Tiger (Hash-Funktion)|Tiger]] |
|||
*[[HAVAL]] |
|||
*[[Whirlpool (Algorithmus)|Whirlpool]] |
|||
Das Auffinden von Dateien anhand des Hashwertes ihres Inhaltes ist zumindest in den USA als Softwarepatent geschützt. Der Inhaber verfolgt Programme und Firmen, die auf Basis dieses Systems die Suche von Dateien ermöglichen. Sogar Firmen, die im Auftrag der [[Recording Industry Association of America]] oder der [[Motion Picture Association]] Anbieter von unlizenzierten Inhalten ermitteln wollen, sind betroffen. |
|||
== Attacken == |
|||
Man unterscheidet [[Kollisionsangriff]]e und die wesentlich aufwändigeren [[Preimage-Angriff]]e. Bei einem Kollisionsangriff geht es darum, zwei beliebige Eingaben zu finden, die sich auf den gleichen Hash-Wert abbilden lassen. Bei einem Preimage-Angriff muss hingegen zu einer vorgegebenen Eingabe eine andere Eingabe mit gleichem Hash-Wert gefunden werden. |
|||
Bei der Programmierung von Internet-Anwendungen werden Hashfunktionen zum Erzeugen von [[Session-ID]]s genutzt, indem unter Verwendung von wechselnden Zustandswerten (wie Zeit, IP-Adresse) ein Hashwert berechnet wird. |
|||
== Weblinks == |
|||
* [http://www.cacr.math.uwaterloo.ca/hac/about/chap9.pdf CRC Press - Handbook of Applied Cryptography (Kapitel 9)] |
|||
* [http://www.jonelo.de/java/jacksum/index_de.html Jacksum, ein Open Source Programm zur Berechnung und Verifizierung von Hash-Werten (Plattformunabhängig, 44 Algorithmen, Kommandozeile)] |
|||
* [http://www.dominik-reichl.de/opensource.shtml#vishash VisualHash, ein Open Source Programm zur Berechnung von Hash-Werten (.NET 1.1, 25 Algorithmen, mit grafischer Benutzeroberfläche)] |
|||
* [http://users.cs.cf.ac.uk/Paul.Rosin/CM0212/DEMOS/HashApplet/HashApplet.html Hashing Animation Tool] |
|||
* [http://serversniff.de/hash.php Serversniff.de berechnet >40 verschiedene Hashes und Checksummen aus Strings und Dateien] |
|||
=== Kryptologie === |
|||
{{Hauptartikel|Kryptographische Hashfunktion}} |
|||
[[Kryptographische Hashfunktion]]en sind [[Kollisionssicherheit|kollisionsresistente]] [[Einwegfunktion]]en. Diese Eigenschaften sind notwendig für [[Kryptographie|kryptographische]] Anwendungszwecke wie beispielsweise die Sicherstellung der [[Integrität (Informationssicherheit)|Integrität]] von Daten. Weitere Anwendungsbeispiele sind [[Digitale Signatur|digitale Signaturverfahren]] oder [[Schlüsselableitung]]. Bei letzterem wird aus einem [[Passwort]] ein Hashwert erzeugt, der entweder der sicheren, unumkehrbaren Speicherung von Passwörtern dient oder als [[Schlüssel (Kryptologie)|Schlüssel]] für ein Verschlüsselungsverfahren verwendet wird. |
|||
{{Vorlage:Navigationsleiste Hash-Algorithmen}} |
|||
== Hash-Algorithmen == |
|||
In der Praxis können oft [[Heuristik|heuristische]] Techniken angewendet werden, um eine gute Hashfunktion zu erstellen. Qualitative Informationen über die Verteilung der Schlüssel können in diesem Entwurfsprozess nützlich sein. Generell sollte eine Hashfunktion von jedem einzelnen Bit des Schlüssels abhängen, so dass sich zwei Schlüssel, die sich nur in einem Bit oder einer Bitfolge unterscheiden, unabhängig davon, ob die Folge am Anfang, am Ende oder in der Mitte des Schlüssels oder vorhanden ist, den gesamten Schlüssel-Hash auf verschiedene Werte abbildet. Daher ist eine Hashfunktion, die einfach einen Teil eines Schlüssels extrahiert, nicht geeignet. Wenn zwei Schlüssel einfach Permutationen voneinander sind, z. B. 256 und 625, sollten sie ebenfalls in unterschiedliche Werte gehasht werden. |
|||
Heuristische Methoden sind Hashing durch Division und Hashing durch Multiplikation.<ref name=":0">GeeksforGeeks: [https://www.geeksforgeeks.org/what-are-hash-functions-and-how-to-choose-a-good-hash-function/ What are Hash Functions and How to choose a good Hash Function?]</ref> |
|||
=== Hashing durch Division === |
|||
{{Hauptartikel|Divisionsrestmethode}} |
|||
Bei dieser Methode wird ein Schlüssel einem Hashwert zugeordnet, indem der [[Division mit Rest|Rest]] des Schlüssels bei [[Division mit Rest|Division]] durch die Größe der [[Hashtabelle]] berechnet wird. Das heißt, die Hashfunktion <math>h </math> ist definiert als |
|||
:<math>h(\mathrm{key}) = \mathrm{key} \ \mathrm{mod} \ \mathrm{tablesize} </math> |
|||
Weil nur eine einzige Divisionsoperation erforderlich ist, ist das Hashing durch Division ziemlich schnell. Wenn die Divisionsmethode verwendet wird, sollten bestimmte Werte für die Größe der Hashtabelle vermieden werden. Sie sollte keine Potenz einer Zahl sein. Wenn <math>\mathrm{tablesize} = r^p </math> ist, dann ist der Hashwert <math>h(\mathrm{key}) </math> immer gleich den letzten Bits von <math>\mathrm{key} </math>. Wenn wir nicht wissen, dass alle <math>p </math>-Bit-Muster niedriger Ordnung gleich wahrscheinlich sind, ist es besser, die Hashfunktion so zu gestalten, dass sie von allen Bits des Schlüssels abhängt. Es hat sich gezeigt, dass die besten Ergebnisse mit der Divisionsmethode erzielt werden, wenn die Größe der Hashtabelle eine [[Primzahl]] ist. Eine Primzahl, die nicht zu nah bei einer [[Zweierpotenz]] liegt, ist oft eine gute Wahl für die Größe der Hashtabelle.<ref name=":0" /> |
|||
=== Hashing durch Multiplikation === |
|||
{{Hauptartikel|Multiplikative Methode}} |
|||
Bei dieser Methode wird der Schlüssel <math>k </math> mit einer konstanten [[Reelle Zahl|reellen Zahl]] <math>c </math> im Bereich <math>0 < c < 1 </math> [[Multiplizieren|multipliziert]] und die Nachkommastellen von <math>k \cdot c </math> genommen. Dann wird dieser Wert mit der Größe der [[Hashtabelle]] multipliziert und mithilfe der [[Abrundungsfunktion und Aufrundungsfunktion|Abrundungsfunktion]] der ganzzahlige Teil davon berechnet. Die Hashfunktion <math>h </math> kann dargestellt werden als |
|||
:<math>h(\mathrm{key}) = \mathrm{floor}(\mathrm{tablesize} \cdot (\mathrm{key} \cdot c \ \mathrm{mod} \ 1)) </math> |
|||
Ein Vorteil besteht darin, dass die Größe der Hashtabelle nicht kritisch ist. Sie ist typischerweise eine [[Zweierpotenz]], weil die Hashfunktion dann schneller implementiert werden kann. Obwohl diese Methode mit jeder [[Reelle Zahl|reellen Zahl]] <math>c </math> funktioniert, funktioniert sie mit einigen Werten besser als mit anderen.<ref name=":0" /> |
|||
=== Bekannte Hashfunktionen === |
|||
Weitere bekannte Hashfunktionen sind zum Beispiel |
|||
* [[Brent-Hashing]] |
|||
* [[Doppel-Hashing]] |
|||
* [[Mittquadratmethode]] |
|||
* [[Zerlegungsmethode]] |
|||
* [[Ziffernanalyse]] |
|||
==== Gitterbasierte Hashfunktionen ==== |
|||
* [[Ajtai (Hash)|Ajtai]] |
|||
* [[Micciancio]] |
|||
* [[Peikert-Rosen]] |
|||
* [[Schnelle Fourier-Transformation]] (FFT-Hashfunktion<ref>C. P. Schnorr, Serge Vaudenay: ''Parallel FFT-hashing''. In: Fast Software Encryption, pp 149–156, 1993</ref>) |
|||
* [[LASH (Hashfunktion)|LASH]]<ref>K. Bentahar, D. Page, J. H. Silverman, M.-J. O. Saarinen, N.P. Smart: ''LASH''. 2nd NIST Cryptographic Hash Workshop, 2006</ref> |
|||
==== Prüfsummen ==== |
|||
* [[Fletcher’s Checksum]] |
|||
* [[Adler-32]] |
|||
* [[Zyklische Redundanzprüfung|CRC (Zyklische Redundanzprüfung)]] |
|||
* [[Paritätsbit|Parität]] |
|||
* [[Quersumme]] |
|||
==== Weitere nicht-kryptographische Hashfunktionen ==== |
|||
{| class="wikitable" |
|||
|- |
|||
! Hashfunktion || Geschwindigkeit || Entwickler || Jahr |
|||
|- |
|||
| xxHash || style="text-align:right" | 5,4{{0}} GB/s || Yann Collet || 2012 |
|||
|- |
|||
| MurmurHash 3a || style="text-align:right" | 2,7{{0}} GB/s || Austin Appleby || 2008 |
|||
|- |
|||
| SBox || style="text-align:right" | 1,4{{0}} GB/s || Bret Mulvey || 2007 |
|||
|- |
|||
| Lookup3 || style="text-align:right" | 1,2{{0}} GB/s || Bob Jenkins || 2006 |
|||
|- |
|||
| CityHash64 || style="text-align:right" | 1,05 GB/s || Geoff Pike & Jyrki Alakuijala || 2011 |
|||
|- |
|||
| [[FNV (Informatik)|FNV]] || style="text-align:right" | 0,55 GB/s || Fowler, Noll, Vo || 1991 |
|||
|- |
|||
| SipHash/HighwayHash<ref>J. Wassenberg, J. Alakuijala: Fast strong hash functions: SipHash/HighwayHash ([https://github.com/google/highwayhash github.com])</ref>|| || Jan Wassenberg & Jyrki Alakuijala || 2016 / 2012 |
|||
|} |
|||
==== Kryptographische Hashfunktionen ==== |
|||
* [[MD2]], [[MD4]], [[MD5]] |
|||
* [[Secure Hash Algorithm]] (SHA) |
|||
* [[RIPEMD-160]] |
|||
* [[Tiger (Hashfunktion)|Tiger]] |
|||
* [[HAVAL]] |
|||
* [[Whirlpool (Algorithmus)|Whirlpool]] |
|||
===== Passwort-Hashfunktionen ===== |
|||
* [[LM-Hash]] |
|||
* [[PBKDF2]] |
|||
* [[Bcrypt]] |
|||
* [[Scrypt]] |
|||
* [[Argon2]] |
|||
== Literatur == |
|||
* {{Literatur |
|||
|Autor=[[Donald E. Knuth]] |
|||
|Titel=[[The Art of Computer Programming]] |
|||
|Band=Volume 3 |
|||
|Auflage=2. |
|||
|Verlag=Addison-Wesley |
|||
|Ort= |
|||
|Datum=1998 |
|||
|ISBN=0-201-89685-0 |
|||
|Seiten=513 ff.}} |
|||
* {{Literatur |
|||
|Autor=Thomas H. Cormen, [[Charles E. Leiserson]], [[Ronald L. Rivest]], Clifford Stein |
|||
|Titel=Algorithmen. Eine Einführung |
|||
|Auflage=2. |
|||
|Verlag=Oldenbourg |
|||
|Ort=München/Wien |
|||
|Datum=2007 |
|||
|ISBN=978-3-486-58262-8 |
|||
|Seiten=221 ff.}} |
|||
* {{Literatur |
|||
|Autor=Lianhua Chi, Xingquan Zhu |
|||
|Titel=Hashing Techniques: A Survey and Taxonomy |
|||
|Sammelwerk=ACM Computing Surveys (CSUR) |
|||
|Band=50 |
|||
|Nummer=1 |
|||
|Datum=2017-04 |
|||
|ArtikelNr=11 |
|||
|DOI=10.1145/3047307}} |
|||
== Weblinks == |
|||
{{Wiktionary}} |
|||
* [http://www.cacr.math.uwaterloo.ca/hac/about/chap9.pdf CRC Press – ''Handbook of Applied Cryptography'' (Kapitel 9)] (PDF; 471 kB) |
|||
* [http://www.cdc.informatik.tu-darmstadt.de/reports/reports/Sidi_Mohamed_El_yousfi_Alaoui.diplom.pdf Konstruktion von Hashfunktionen] (PDF; 841 kB) |
|||
* [http://multidec.web-lab.at/hash.php Online Generator] für Hashberechnungen (md, sha, ripemd, whirlpool, tiger, snefru, gost, adler, crc, fnv, joaat, haval) |
|||
== Einzelnachweise == |
|||
[[Kategorie:Kryptologie]] |
|||
<references /> |
|||
[[Kategorie:Algorithmus]] |
|||
[[Kategorie:Diskrete Mathematik]] |
|||
[[Kategorie:Hash|!Hashfunktion]] |
|||
[[ca:Hashing]] |
|||
[[cs:Hašovací funkce]] |
|||
[[da:Hashfunktion]] |
|||
[[en:Hash function]] |
|||
[[es:Hashing]] |
|||
[[fi:Hajautusalgoritmi]] |
|||
[[fr:Fonction de hachage]] |
|||
[[he:פונקציה חד כיוונית]] |
|||
[[it:Hash]] |
|||
[[ja:ハッシュ関数]] |
|||
[[ko:해시 함수]] |
|||
[[lt:Maišos funkcija]] |
|||
[[nl:Hashfunctie]] |
|||
[[pl:Funkcja haszująca]] |
|||
[[pt:Hash]] |
|||
[[ru:Хеширование]] |
|||
[[sl:Sekljalna funkcija]] |
|||
[[uk:Хешувальна функція]] |
|||
[[zh:散列函數]] |
Aktuelle Version vom 4. April 2025, 09:52 Uhr

Eine Hashfunktion oder Streuwertfunktion ist eine Abbildung, die eine große Eingabemenge, die Schlüssel, auf eine kleinere Zielmenge, die Hashwerte, abbildet. Eine Hashfunktion ist daher im Allgemeinen nicht injektiv. Die Eingabemenge kann Elemente unterschiedlicher Längen enthalten, die Elemente der Zielmenge haben dagegen meist eine feste Länge.
Der Name Hashfunktion stammt vom englischen Verb to hash, das sich mit „zerhacken“ übersetzen lässt. Der deutsche Name lautet Streuwertfunktion. Beide Namen deuten darauf hin, dass diese Funktionen normalerweise darauf angelegt sind, die Daten zu „verstreuen“ und zu „zerhacken“ (siehe auch Zerhacker in der Funktechnik). Speziell in der Informatik verwendet man auch den Begriff Hash-Algorithmus (englisch hash algorithm), da Hashfunktionen oftmals in Form eines Algorithmus spezifiziert werden, der die Berechnung der mathematischen Funktion beschreibt.
Die Hash- oder Streuwerte sind meist skalare Werte aus einer begrenzten Teilmenge der natürlichen Zahlen. Eine gute Hashfunktion liefert dabei für die Eingabedaten Werte derart, dass zwei unterschiedliche Eingaben auch zu unterschiedlichen Ausgabewerten führen.
Eine Kollision tritt dann auf, wenn unterschiedlichen Eingabedaten derselbe Hashwert zugeordnet wird. Da die Menge der möglichen Hashwerte meist kleiner ist als die der möglichen Eingaben, sind solche Kollisionen dann prinzipiell unvermeidlich, weshalb es Verfahren zur Kollisionserkennung geben muss. Eine gute Hashfunktion zeichnet sich dadurch aus, dass sie für die Eingaben, für die sie entworfen wurde, möglichst wenige Kollisionen erzeugt. Für bekannte und beschränkte Eingabemengen können auch perfekte (kollisionsfreie) Hashfunktionen gefunden werden.
In der Datenspeicherung kann ein Hashwert verwendet werden, um die Speicherstelle der angefragten Daten zu berechnen, z. B. in einer Hashtabelle. Bei Prüfsummen verwendet man Hashwerte, um Übertragungsfehler zu erkennen. Ein Hashwert wird deshalb auch als englisch Fingerprint bezeichnet, da er eine nahezu eindeutige Kennzeichnung einer größeren Datenmenge darstellt, so wie ein Fingerabdruck einen Menschen nahezu eindeutig identifiziert. In der Kryptologie werden spezielle kryptographische Hashfunktionen verwendet, bei denen zusätzlich gefordert wird, dass es praktisch unmöglich ist, Kollisionen absichtlich zu finden.
Definition
[Bearbeiten | Quelltext bearbeiten]Eine Abbildung heißt Hashfunktion, wenn gilt. Insbesondere liefert eine Hashtabelle der Größe . Die Menge repräsentiert die Daten, die gehasht werden sollen, und wird auch die Menge der Schlüssel genannt; die Menge ist die Menge der möglichen Hashwerte. Typischerweise wird die Menge der Hashwerte als Anfangsstück der natürlichen Zahlen gewählt: . Diese Menge heißt dann auch Adressraum.
Typischerweise wird in der Praxis immer nur eine kleine Teilmenge der Schlüssel mit abgebildet. Die Menge sind dann die tatsächlich genutzten Hashwerte.
Das Verhältnis liefert den Belegungsfaktor.
Der Fall wird als Kollision bezeichnet. Eine injektive Hashfunktion heißt perfekt, u. a. weil sie keine Kollisionen erzeugt.
Kriterien
[Bearbeiten | Quelltext bearbeiten]- Geringe Wahrscheinlichkeit von Kollisionen der Hashwerte für den Eingabewertebereich, also möglichst eine Gleichverteilung der Hashwerte auf die erwarteten Eingabewerte.
- Surjektivität – Kein Ergebniswert (Hashwert) soll unmöglich sein, jedes Ergebnis (jeder Hashwert im definierten Wertebereich) soll tatsächlich vorkommen können.
- Effizienz – Die Funktion muss schnell berechenbar sein, ohne großen Speicherverbrauch auskommen (der Speicherbedarf des Hashwertes soll deutlich kleiner sein als jener des Schlüssels / Eingabewertes) und sollte die Quelldaten (Eingabewerte) möglichst nur einmal lesen müssen.
Folgende Kriterien spielen je nach Anwendung eine unterschiedliche Rolle:
- falls die Hashfunktion einen sortierten Zugriff in der Hashtabelle einer Datenbank erlauben soll: ordnungserhaltend
- bei kryptologischen Hashfunktionen: Chaos oder Lawineneffekt – Die Hashfunktion soll eine gute Diffusion besitzen; ähnliche Quellelemente (Eingabewerte) sollen zu völlig verschiedenen Hashwerten führen. Im Idealfall verändert das Umkippen eines Bits in der Eingabe durchschnittlich die Hälfte aller Bits im resultierenden Hashwert.
- bei kryptologischen Hashfunktionen: Konfusion – Vom Hashwert sollen keine Rückschlüsse auf den Eingabewert gemacht werden können.
- bei kryptologischen Hashfunktionen: Unumkehrbarkeit – Es soll kein praktisches Verfahren möglich sein, das aus einem Hashwert den Eingabewert bestimmt.
Anwendungen
[Bearbeiten | Quelltext bearbeiten]Hashfunktionen werden typischerweise angewendet, um
- einem komplexen Objekt eine Speicheradresse zuzuweisen. Zum Beispiel könnte „Max Mustermann“ im Ordner M abgelegt werden, dem ersten Buchstaben des Nachnamens.
- eine kurze Prüfsumme zu dem Objekt zu berechnen. Beispiel sind die Prüfsumme einer ISBN und die zyklische Redundanzprüfung zur Erkennung von Übertragungsfehlern von Dateien.
- einen Inhalt nahezu eindeutig, aber mit wenig Speicherplatz zu identifizieren, ohne etwas über den Inhalt zu verraten, zum Beispiel in der Kryptographie.
Je nach Anwendung hat man unterschiedliche Anforderungen an die Funktion. Gruppiert man beispielsweise eine Adresskartei nach dem ersten Buchstaben des Nachnamens, so spart man sich offensichtlich bei der Suche viel Zeit, denn man braucht nur einen von 26 Teilen zu durchsuchen. Diese Hashfunktion ist für den Menschen sehr praktisch, da sie sehr einfach zu berechnen ist, jedoch würde ein Computerprogramm andere Verfahren verwenden, um ein Adressbuch zu organisieren. Für das Programm ist es nämlich wichtig, möglichst wenige Kollisionen zu haben. Es gibt aber offenbar viele Namen, die mit demselben Anfangsbuchstaben beginnen, und sie kommen ungleichmäßig oft vor. Legt man also beispielsweise Personalakten nach diesem Prinzip ab, so hat man oftmals viele Akten im Ordner mit dem Buchstaben S, während der Ordner Q leer bleibt.
Die einstellige Quersumme ist eine sehr einfache Hashfunktion. Sie ordnet einer beliebigen Zahl eine einstellige Zahl zu, so wird beispielsweise 25 auf 2 + 5 = 7 abgebildet. Als Prüfsumme ist diese Quersumme aber nicht gut geeignet, da die Vertauschung von Ziffern – ein typischer Fall beim Abtippen von langen Zahlen – nicht erkannt wird. So hat auch die Zahl 52 dieselbe Quersumme 5 + 2 = 7. Prüfsummen wie bei der ISBN eines Buches oder die CRC-32-Prüfsumme einer Datei, z. B. beim Prüfen einer aus dem Internet heruntergeladenen Datei auf Übertragungsfehler, eignen sich besser, derartige Fehler zu erkennen.
Bei der Identifikation von Inhalten mit kryptographischen Hashfunktionen ist es nicht nur wichtig, dass sich der gesamte Hashwert mit allen Bits bei jeder kleinen Modifikation scheinbar zufällig ändert und dass es fast unmöglich ist, einen zweiten Inhalt mit demselben Hashwert zu erzeugen, um einen Komplettaustausch des Inhaltes zu vermeiden. Ebenso wichtig ist es, dass der Inhalt nicht aus dem Hashwert rekonstruiert werden kann. Hat man zwei Dokumente ausgetauscht und möchte beispielsweise am Telefon die erfolgreiche Übertragung überprüfen, so reicht es, am Telefon die Korrektheit des Hashwertes zu überprüfen. Wird das Gespräch abgehört, so wird dabei nichts über den Inhalt der Nachricht verraten, selbst falls Teile des Inhalts bereits bekannt sein sollten.
Datenbanken
[Bearbeiten | Quelltext bearbeiten]Datenbankmanagementsysteme verwenden Hashfunktionen, um Daten in großen Datenbeständen mittels Hashtabellen zu suchen. Darüber wird ein Datenbankindex realisiert.
Mittels Hashfunktionen kann zudem die Fragmentierung von Datensätzen realisiert werden. Dabei wird die Hashfunktion auf den Primärschlüssel des betreffenden Objektes angewandt. Das Ergebnis referenziert dann seinen Speicherort.
Auch für vergleichsweise kleine Datenmengen werden Hashfunktionen benutzt, beispielsweise in Kompressionsalgorithmen wie LZW.
Blockchain
[Bearbeiten | Quelltext bearbeiten]Darüber hinaus spielen Hashfunktionen eine zentrale Rolle in der Blockchain-Technologie. In Blockchains wie Bitcoin oder Ethereum werden kryptographische Hashfunktionen genutzt, um Transaktionen und Blöcke miteinander zu verknüpfen. Jeder Block enthält den Hash des vorherigen Blocks, was die Integrität der gesamten Kette sicherstellt. Bereits eine minimale Änderung an einem Block würde den Hashwert verändern und damit die Verknüpfung zwischen zwei Blöcken ungültig machen. So wird sichergestellt, dass einmal gespeicherte Daten nicht nachträglich manipuliert werden können, ohne dass dies auffällt.[1]
Prüfsummen
[Bearbeiten | Quelltext bearbeiten]Prüfsummen sind ein einfaches Mittel, um die Plausibilität zur Erkennung von Veränderungen an übertragenen Daten zu erhöhen. Nur die Teilmenge der Datenvarianten, die bei Berechnung der Prüfsumme das gleiche Ergebnis wie das der Original-Daten erzeugen, kann noch als Verfälschung unerkannt bleiben. Mit mehreren verschiedenen passend erzeugten Prüfsummen kann die Wahrscheinlichkeit einer Kollision stark reduziert werden.
Ein Fehler ist immer feststellbar, wenn die berechnete Prüfsumme der empfangenen Daten sich von der übertragenen Prüfsumme, also der der Originaldaten, unterscheidet. Falls ein Fehler festgestellt wird, kann die Verfälschung auch ausschließlich in der Prüfsumme enthalten sein. Die Eignung verschiedener Hashfunktionen zur Prüfsummenberechnung hängt von deren Kollisionswahrscheinlichkeit ab.
Wenn die Prüfsumme vor gezielten Manipulationen der Daten schützen soll, wird eine kryptographische Hashfunktion verwendet, da hier nur mit sehr hohem Rechenaufwand eine Kollision gefunden werden kann.
Beispiele
[Bearbeiten | Quelltext bearbeiten]Hashwerte haben unter anderem bei P2P-Anwendungen aus verschiedenen Gründen eine wichtige Aufgabe. Die Hashwerte werden hier sowohl zum Suchen und Identifizieren von Dateien als auch zum Erkennen und Prüfen von übertragenen Dateifragmenten verwendet. So lassen sich große Dateien zuverlässig in kleinen Segmenten austauschen.
Zur Anwendung in P2P-Netzen kommen vor allem gestufte Hashfunktionen, bei denen für kleinere Teile einer Datei der Hashwert und dann aus diesen Werten ein Gesamtwert berechnet wird. Bei den Netzwerken G2 und Direct Connect sind dies zum Beispiel Tiger-Tree-Hash-Funktionen.
Das Auffinden von Dateien anhand des Hashwertes ihres Inhaltes ist zumindest in den USA als Softwarepatent geschützt. Der Inhaber verfolgt Programme und Firmen, die auf Basis dieses Systems die Suche von Dateien ermöglichen. Sogar Firmen, die im Auftrag der Recording Industry Association of America oder der Motion Picture Association Anbieter von unlizenzierten Inhalten ermitteln wollen, sind betroffen.
Bei der Programmierung von Internet-Anwendungen werden Hashfunktionen zum Erzeugen von Session-IDs genutzt, indem unter Verwendung von wechselnden Zustandswerten (wie Zeit, IP-Adresse) ein Hashwert berechnet wird.
Kryptologie
[Bearbeiten | Quelltext bearbeiten]Kryptographische Hashfunktionen sind kollisionsresistente Einwegfunktionen. Diese Eigenschaften sind notwendig für kryptographische Anwendungszwecke wie beispielsweise die Sicherstellung der Integrität von Daten. Weitere Anwendungsbeispiele sind digitale Signaturverfahren oder Schlüsselableitung. Bei letzterem wird aus einem Passwort ein Hashwert erzeugt, der entweder der sicheren, unumkehrbaren Speicherung von Passwörtern dient oder als Schlüssel für ein Verschlüsselungsverfahren verwendet wird.
Hash-Algorithmen
[Bearbeiten | Quelltext bearbeiten]In der Praxis können oft heuristische Techniken angewendet werden, um eine gute Hashfunktion zu erstellen. Qualitative Informationen über die Verteilung der Schlüssel können in diesem Entwurfsprozess nützlich sein. Generell sollte eine Hashfunktion von jedem einzelnen Bit des Schlüssels abhängen, so dass sich zwei Schlüssel, die sich nur in einem Bit oder einer Bitfolge unterscheiden, unabhängig davon, ob die Folge am Anfang, am Ende oder in der Mitte des Schlüssels oder vorhanden ist, den gesamten Schlüssel-Hash auf verschiedene Werte abbildet. Daher ist eine Hashfunktion, die einfach einen Teil eines Schlüssels extrahiert, nicht geeignet. Wenn zwei Schlüssel einfach Permutationen voneinander sind, z. B. 256 und 625, sollten sie ebenfalls in unterschiedliche Werte gehasht werden.
Heuristische Methoden sind Hashing durch Division und Hashing durch Multiplikation.[2]
Hashing durch Division
[Bearbeiten | Quelltext bearbeiten]Bei dieser Methode wird ein Schlüssel einem Hashwert zugeordnet, indem der Rest des Schlüssels bei Division durch die Größe der Hashtabelle berechnet wird. Das heißt, die Hashfunktion ist definiert als
Weil nur eine einzige Divisionsoperation erforderlich ist, ist das Hashing durch Division ziemlich schnell. Wenn die Divisionsmethode verwendet wird, sollten bestimmte Werte für die Größe der Hashtabelle vermieden werden. Sie sollte keine Potenz einer Zahl sein. Wenn ist, dann ist der Hashwert immer gleich den letzten Bits von . Wenn wir nicht wissen, dass alle -Bit-Muster niedriger Ordnung gleich wahrscheinlich sind, ist es besser, die Hashfunktion so zu gestalten, dass sie von allen Bits des Schlüssels abhängt. Es hat sich gezeigt, dass die besten Ergebnisse mit der Divisionsmethode erzielt werden, wenn die Größe der Hashtabelle eine Primzahl ist. Eine Primzahl, die nicht zu nah bei einer Zweierpotenz liegt, ist oft eine gute Wahl für die Größe der Hashtabelle.[2]
Hashing durch Multiplikation
[Bearbeiten | Quelltext bearbeiten]Bei dieser Methode wird der Schlüssel mit einer konstanten reellen Zahl im Bereich multipliziert und die Nachkommastellen von genommen. Dann wird dieser Wert mit der Größe der Hashtabelle multipliziert und mithilfe der Abrundungsfunktion der ganzzahlige Teil davon berechnet. Die Hashfunktion kann dargestellt werden als
Ein Vorteil besteht darin, dass die Größe der Hashtabelle nicht kritisch ist. Sie ist typischerweise eine Zweierpotenz, weil die Hashfunktion dann schneller implementiert werden kann. Obwohl diese Methode mit jeder reellen Zahl funktioniert, funktioniert sie mit einigen Werten besser als mit anderen.[2]
Bekannte Hashfunktionen
[Bearbeiten | Quelltext bearbeiten]Weitere bekannte Hashfunktionen sind zum Beispiel
Gitterbasierte Hashfunktionen
[Bearbeiten | Quelltext bearbeiten]- Ajtai
- Micciancio
- Peikert-Rosen
- Schnelle Fourier-Transformation (FFT-Hashfunktion[3])
- LASH[4]
Prüfsummen
[Bearbeiten | Quelltext bearbeiten]Weitere nicht-kryptographische Hashfunktionen
[Bearbeiten | Quelltext bearbeiten]Hashfunktion | Geschwindigkeit | Entwickler | Jahr |
---|---|---|---|
xxHash | 5,4 | GB/sYann Collet | 2012 |
MurmurHash 3a | 2,7 | GB/sAustin Appleby | 2008 |
SBox | 1,4 | GB/sBret Mulvey | 2007 |
Lookup3 | 1,2 | GB/sBob Jenkins | 2006 |
CityHash64 | 1,05 GB/s | Geoff Pike & Jyrki Alakuijala | 2011 |
FNV | 0,55 GB/s | Fowler, Noll, Vo | 1991 |
SipHash/HighwayHash[5] | Jan Wassenberg & Jyrki Alakuijala | 2016 / 2012 |
Kryptographische Hashfunktionen
[Bearbeiten | Quelltext bearbeiten]- MD2, MD4, MD5
- Secure Hash Algorithm (SHA)
- RIPEMD-160
- Tiger
- HAVAL
- Whirlpool
Passwort-Hashfunktionen
[Bearbeiten | Quelltext bearbeiten]Literatur
[Bearbeiten | Quelltext bearbeiten]- Donald E. Knuth: The Art of Computer Programming. 2. Auflage. Volume 3. Addison-Wesley, 1998, ISBN 0-201-89685-0, S. 513 ff.
- Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein: Algorithmen. Eine Einführung. 2. Auflage. Oldenbourg, München/Wien 2007, ISBN 978-3-486-58262-8, S. 221 ff.
- Lianhua Chi, Xingquan Zhu: Hashing Techniques: A Survey and Taxonomy. In: ACM Computing Surveys (CSUR). Band 50, Nr. 1, April 2017, 11, doi:10.1145/3047307.
Weblinks
[Bearbeiten | Quelltext bearbeiten]- CRC Press – Handbook of Applied Cryptography (Kapitel 9) (PDF; 471 kB)
- Konstruktion von Hashfunktionen (PDF; 841 kB)
- Online Generator für Hashberechnungen (md, sha, ripemd, whirlpool, tiger, snefru, gost, adler, crc, fnv, joaat, haval)
Einzelnachweise
[Bearbeiten | Quelltext bearbeiten]- ↑ Felix Rieger: Hashwert. 10. März 2025, abgerufen am 24. März 2025.
- ↑ a b c GeeksforGeeks: What are Hash Functions and How to choose a good Hash Function?
- ↑ C. P. Schnorr, Serge Vaudenay: Parallel FFT-hashing. In: Fast Software Encryption, pp 149–156, 1993
- ↑ K. Bentahar, D. Page, J. H. Silverman, M.-J. O. Saarinen, N.P. Smart: LASH. 2nd NIST Cryptographic Hash Workshop, 2006
- ↑ J. Wassenberg, J. Alakuijala: Fast strong hash functions: SipHash/HighwayHash (github.com)