In diesem Beitrag wird beschrieben, was das sogenannte Hashing ist, wofür es gut ist und wie es verwendet werden kann.
Die Idee des Hashing besteht darin, aus einem Datensatz einen fixen Wert zu berechnen. Für diese Berechnung sind Hashfunktionen zuständig. Mathematisch gesehen sind Hashfunktionen nicht invertierbare Funktionen. Das heißt man kann aus einem Ergebnis nicht auf seine "Eingabe" zurückschließen. Zudem ist die Ursprungsmenge größer als die Abbildmenge. Eine weitere besonderheit ist, dass die Hashwerte immer gleich lang sind, egal wielange die Eingabemenge beträgt.
Damit eine Funktion für das Hashing zur Debatte steht, müssen zwei Anforderungen erfüllt sein.
Nicht umkehrbar : Zu einem vorgegebenen Hashwert
h
ist es unmöglich eine NachrichtM
zu finden, für dieH(M)=h
gilt.Schwache Kollisionsresitenz : Zu einer vorgegebenen Nachricht
M1
ist es unmöglich, eine weitere NachrichtM2 != M1
zu finden, für dieH(M1) = H(M2)
gilt. Anders formuliert: es soll zu zwei unterschiedlichen Eingaben nicht derselbe Hashwert berechnet werden.
Zwei bekannte Familien für das Hashing sind MD5 und die SHAxxx-Familie, wobei MD5 und auch die älteren SHA1xx nicht mehr verwendet werden sollten.
"[...] Der Hash-Algorithmus MD5 ist veraltet und weist bekannte Schwächen auf, die auch bereits anhand praktischer Beispiele demonstriert werden konnten. Auch der Hash-Algorithmus SHA-1 ist nicht mehr für alle Einsatzzwecke geeignet. [...] [1]
Um eine Hashfunktion nach der sponge construction zu konstruieren, sollten folgende Parameter gewählt werden [2].
- Eine Zustandslänge
b
oder auch Bitvektor genannt. Ein Vektor voller 0 und 1, welcher mit einer Nachrichtm
XOR-Verknüpft wird. - Eine Funktion
f:{0,1}^b -> {0,1}^b
- Eine Bitrate
r
und ein padding-Verfahren, wie die Eingabem
auf eine Länge gebracht wird, die ein Vielfaches vonr
ist. - Die Ergebnislänge
s
.
Wofür braucht man denn dieses Hashing?
Integrität
Anders als bei der Verschlüsselung, wo der Wert u.a. auf Vertraulichkeit gelegt wird, geht es beim Hashing um die Sicherstellung der Integrität von Daten. Somit kann sichergestellt werden, dass eine Datei nicht manipuliert wird.Adressierung
Zum anderen kann Hashing auch für eine Adressierung von Daten benutzt werden. Das Prinzip der Adressierung wird häufig in Programmiersprachen in Form von Hashtables, Hashmaps o.Ä. zur Verfügung gestellt. Wir werden die Adressierung nicht weiter betrachten, stattdessen schauen wir uns mal ein praktisches Beispiel an.Berechnung eines Hashwertes
Wir legen mal eine Textdatei an und schreiben dort was rein.
Nun manipulieren wir diese Datei, indem wir ein zusätzliches Leerzeichen vor dem Wort "Hashwert" einfügen. (Das wird doch wohl nicht auffallen).
Wir berechnen den Hashwert dieser Datei einmal vor- und nach der Manipulation. Dazu wurde das Hashingverfahren SHA256 gewählt.
Man kann Anhand der beiden Hashwerte sehen, dass Sie ungleich sind. Die Manipulation fällt also auf, auch wenn sie noch so minimal ist.
Authentisierung
Noch ein weiteres Einsatzgebiet von Hashing ist die Passwort-Authentisierung. Registriert man sich auf einer sicheren Webseite (auf HTTPS achten!), so muss man sein Passwort als Klartext eingeben. Dieses wird verschlüsselt an den Server übertragen. Dort wird von den Passwort ein Hashwert berechnet. Um den Hashwert entgültig in eine Datenbank zu speichern, muss das Passwort erneut eingegeben werden, damit (hoffentlich) derselbe Hashwert erneut berechnet wird. Sollte dies der Fall sein, dann war die Registrierung erfolgreich.Quelle(n)
[1] https://www.bsi.bund.de/DE/Themen/ITGrundschutz/ITGrundschutzKataloge/Inhalt/_content/g/g04/g04035.html
[2] https://keccak.team/sponge_duplex.html
Edit : alternativer Link zu Quelle [1] : https://webcache.googleusercontent.com/search?q=cache:hEsXot3R0-MJ:https://www.bsi.bund.de/DE/Themen/ITGrundschutz/ITGrundschutzKataloge/Inhalt/_content/g/g04/g04035.html+&cd=1&hl=de&ct=clnk&gl=de (Google webcache, letzer Zugriff : 15.08.2019; 16:05)