Vorlesung Informatik 2 - Teil B: Theorie

3.6 Hashfunktion

Eine Hash Funktion bildet eine große Menge Menge von Schlüsseln S auf eine kleine Menge von Hashwerten H ab. Dabei versucht man, Kollisionen, also zwei Schlüssel mit gleichem Hashwert, zu vermeiden (Ein-Weg-Funktion).

Der Hashwert wird im Englischen auch als fingerprint oder checksum bezeichnet.

In der Praxis haben die Schlüssel meist unterschiedliche Länge währen die Hashwerte eine feste Länge haben.

Einfachstes Beispiel sind Prüfsummen, wie z.B. die Prüfziffer bei den ISBN-Nummern von Büchern, bei Geldscheinen oder der IBAN  - dort sind die 2 Ziffern hinter der Länderkennung die Prüfziffern.

Kryptographische Hashfunktionen sollen verhindern, dass man aus dem Hashwert den Schlüssel rekonstruieren kann. Gebräuchliche Verfahren sind:

  • SHA (Secure Hash Algorithm) in der Variante  SHA-1 mit 160 Bit, SHA-2 mit 256 und 512 Bit und SHA-3 mit 224/256/384/512 Bit. Nur die SHA-3 Varianten sowie SHA-2 mit 512 Bit gelten derzeit als sicher.
  • MD5 (Message Digest Algorithm) mit 128 Bit, der als unsicher gilt aber für viele Zwecke noch verwendet wird.

In Linux sind die Befehle md5sum, sha224sum, sha256sum, sha384sum und sha512sum standardmäßig vorhanden. 

Unter Windows gibt es den Befehl certutil -hashfile bzw. in der Powershell Get-FileHash. 

Das Programm Open-Hashtool (Sourceforge) bietet ebenfalls 

Häufig stellt man dem Schlüssel noch eine geheime Zeichenfolge voran (Salt), um zu verhindern, dass gleiche Schlüssel zum gleichen Hashwert führen.  

Anwendungen:

  • Speicherung von Passwörtern: Statt Passwörter im Klartext zu speichern, wird ein Hashwert, möglichst mit Salt gespeichert. Ein Angreifer, der die Passwort Liste erbeutet, hat somit keinen Zugriff auf die Passwörter selbst. Auch die Mitarbeiter des Providers oder der Bank kennen die Passwörter selbst nicht.
  • Digitale Signatur: Absicherung Datenübertragung.
  • Hash-Tabelle: Verfahren zur effizienten Speicherung von Daten (Map), siehe nächstes Kapitel.

In Java erbt jede Klasse die Methode hashCode():int von der Basisklasse Object, die einen 32-Bit Haswert liefert.

Lehrvideo  (YouTube)