Zum Inhalt springen

Hashfunktion

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 12. Oktober 2006 um 13:47 Uhr durch Gorgo (Diskussion | Beiträge) (Anschauliche Erklärung: genauer; überflüssiger absatz raus). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Eine Hash-Funktion bzw. Streuwertfunktion ist eine Funktion, die zu einer Eingabe aus einer (üblicherweise) großen Quellmenge eine Ausgabe aus einer (im Allgemeinen) kleineren Zielmenge (die Hashwerte, meist eine Teilmenge der natürlichen Zahlen) erzeugt.

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 Hashtabellen, 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 Kollisionen erzeugt. Dadurch können die meisten Eingaben an Hand ihres Hashwertes unterschieden werden.

Der Name „Hash-Funktion“ stammt vom englischen Wort „to hash“, das sich als „zerhacken“ übersetzen lässt. Der deutsche Name lautet Streuwertfunktion. Speziell in der Informatik verwendet man auch die Bezeichnung Hash-Algorithmus, da die Berechnung von Funktionen mittels Algorithmen durchgeführt wird.

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.

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.

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.

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.

Weil bei einer Hash-Funktion der Wertebereich meist kleiner als der der 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.

Anwendungen

Der Hashwert kann zum Auffinden von Daten in einer Datenbank (siehe Hashverfahren) oder zum digitalen Signieren eines Dokumentes verwendet werden. Hash-Funktionen können unter Umständen auch zur Einweg-Verschlüsselung verwendet werden. (Siehe auch: Kryptologie)

Prüfsummen 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 Programmierung von Internet-Anwendungen werden Hash-Funktionen zum Erzeugen von Session-IDs genutzt, indem unter Verwendung von wechselnden Zustandswerten (wie Zeit, IP-Adresse) ein Hashwert berechnet wird.

Definition einer Hash-Funktion

Eine Abbildung heißt Hash-Funktion, wenn gilt. Insbesondere liefert eine Hashtabelle der Größe . heißt auch die Menge der Schlüssel. Die Menge repräsentiert die Daten die gehasht werden sollen. Typischerweise wird die Menge der Schlüssel 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 mit abgebildet. Die Menge sind dann die tatsächlich genutzten Schlüssel.

Das Verhältnis liefert uns den Belegungsfaktor.

Der Fall wird als Kollision bezeichnet. Eine injektive Hash-Funktion heißt perfekt, u.a. weil sie keine Kollisionen erzeugt.

Kriterien für eine gute Hash-Funktion

Der Speicherbedarf des Hash-Wertes soll deutlich kleiner sein als der der Nachricht.
Ä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.
Die Funktion sollte alle Schlüsselwerte als Ergebnis liefern.
Die Funktion muss schnell berechenbar sein, ohne großen Speicherverbrauch auskommen und sollte die Quelldaten möglichst nur einmal lesen müssen.

Zusätzliche Forderungen für kryptographisch sichere Hash-Funktionen

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.
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.

Bekannte Hash-Funktionen

Allgemeine Hash-Algorithmen

Hash-Algorithmen in der Kryptographie

Attacken

Man unterscheidet Kollisionsangriffe und die wesentlich aufwändigeren Preimage-Angriffe. 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.


Vorlage:Navigationsleiste Hash-Algorithmen