====== Kryptographische Hashfunktion ======
**Einwegfunktionen (hash functions):** \\
**Einwegfunktionen** sind umkehrbare Funktionen, die sich sehr einfach berechnen lassen, deren Umkehrung aber extrem aufwändig ist. \\ \\
Ein anschauliches Beispiel ist die Verwendung eines Papier-Telefonbuchs zur Verschlüsselung von Namen ([[https://de.wikipedia.org/wiki/Einwegfunktion|Idee aus Wikipedia]]): Kennt man einen Namen, so lässt sich damit recht einfach die zugehörige Telefonnummer finden. Zu einer Telefonnummer lässt sich aber nur mit hohem Aufwand der Name ermitteln.
\\ \\
Eine **Kryptographische Hashfunktion** ist ein Algorithmus, mit dem der man eine Menge langer Schlüssel in eine Menge kurzer Hashwerte umwandeln kann, so dass letztere möglichst eindeutig sind. Die kryptographische Hashfunktion muss dabei so beschaffen sein, dass sich **aus den Hashwerten möglichst keine Rückschlüsse auf die Schlüssel ziehen lassen**. \\ \\
Die derzeit am häufigsten verwendet Hashfunktion ist **SHA**. Eine weitere sehr bekannte - aber veraltete und als unsicher eingestufte - Hashfunktion ist **md5**. Hier eine [[http://www.sha1-online.com/|schöne Seite zum Ausprobieren verschiedener Hashfunktionen.]]
===== Beispiel: SHA256 =====
Eine bekannte Hashfunktion ist SHA256. Hier eine [[https://emn178.github.io/online-tools/sha256.html|Webseite, auf der Sie die Funktion online ausprobieren können.]]
* Wie ändert sich der Hashwert, wenn Sie auch nur ein einzelnes Zeichen des Ausgangstextes ändern?
* Wie ändert sich die Länge des Hashes abhängig von der Länge des Textes?
* Suchen Sie im Netz eine Quelle, in der erklärt wird, wie SHA256 funktioniert!
==== Anwendung: Speichern von Passwörtern als salted hash ====
Immer wieder kommt es zu erfolgreichen Hackerangriffen gegen Server großer Firmen, wie beispielsweise [[https://www.heise.de/news/Hacktivisten-knacken-Datenbank-von-Sony-Pictures-1254485.html|2011, als Hacker Vollzugriff auf die Datenbank von Sony Pictures erlangten.]] Neben dem wirtschaftlichen Schaden durch Zugriff auf interne Firmendaten entsteht oft ein massiver Schaden für Millionen von Kunden, wenn es den Hackern gelingt, Zugriff auf deren Benuternamen, Mailadressen und Passwörter zu erlangen. Oft verwenden Nutzer für verschiedene Accounts nämlich dasselbe Passwort, so dass es Hackern gelingt, auf deren Daten bei ganz anderen Servern Zugriff zu erlangen. \\ \\
Damit Hacker auch bei Vollzugriff auf einen Server keinen Zugriff auf Passwörter erlangen können, speichert man diese nicht im Klartext, sondern als **salted hash**. Das funktioniert folgendermaßen:
{{ :signatur:pasted:20231129-092448.png?500 }}
{{ :signatur:pasted:20231129-092513.png?500 }}
Aus den **salted hash**-Werten, die in der Datenbank gespeichert sind, lassen sich nur mit unverhältnismäßig hohem Aufwand wieder Klartextpasswörter errechnen. Daher sind die Passwörter der User selbst dann nicht gefährdet, wenn Hacker auf die Datenbank mit den salted hashes Zugriff erlangen.
Warum ist das **salt** nötig? Es würde doch reichen, die Hashes der Passwörter zu speichern? \\ \\
//**Tipp:** Recherchieren Sie zur Beantwortung dieser Frage, was "rainbow tables" sind.//