Hashing erschwert es Angreifern, gespeicherte Passwörter zu entschlüsseln – wenn es richtig eingesetzt wird. [...]
Hashfunktionen spielen eine wichtige Rolle in der IT-Sicherheit – speziell, wenn es um die Speicherung von Passwörtern geht. Das sollten Sie zum Thema wissen.
Hashing – Definition
Hashing bezeichnet einen kryptografischen Prozess, der dazu genutzt werden kann, die Authentizität und Integrität diverser Datentypen zu validieren. Hashfunktionen kommen vor allem in Authentifizierungssystemen zur Anwendung – hier bieten sie den Vorteil, dass keine Passwörter im Plaintext-Format gespeichert werden müssen. Werden Hashfunktionen falsch eingesetzt, können schwerwiegende Datenlecks die Folge sein. Schlimmer ist nur, wenn Hashing überhaupt nicht zum Einsatz kommt.
Hashfunktion vs. Verschlüsselung
Im Gegensatz zur Verschlüsselung, die rückgängig gemacht werden kann, ist Hashing eine Einbahnstraße. Der Output einer Hashfunktion ist ein Gebilde aus verschiedenen Zeichen mit fixer Länge – der Hashwert.
Hashwerte müssen nicht unbedingt geheim gehalten werden, da eine Rückverwandlung in den Ursprungszustand nicht möglich ist. Ein wichtiger Punkt dabei: Jeder Datensatz, auf den eine Hashfunktion angewendet wird, erzeugt einen einzigartigen Hashwert. Verfügen zwei verschiedene Inputs über denselben Hashwert, liegt eine „Collision“ vor. Je nachdem, wie kompliziert es ist, diese per Rechenoperation aufzuspüren, kann eine Hashfunktion aus Security-Perspektive als wirkungslos eingestuft werden.
Sollen Passwörter in Datenbanken gespeichert werden, ist Hashing so gut wie immer der Verschlüsselung vorzuziehen: Im Fall einer Kompromittierung fallen den Angreifern keine Kennwörter im Klartextformat in die Hände. „Verschlüsselung sollte nur eingesetzt werden, wenn eine Möglichkeit zur Wiedererlangung des Originalpassworts bestehen muss“, empfiehlt das Open Web Application Security Project (OWASP) auf seiner Webseite.
Hashing – Einsatzzwecke
Hashing kommt in großem Stil in Authentifizierungssystemen zum Einsatz: Legt ein Benutzer ein neues Konto an, wird das Passwort von der Applikation mit einer Hashfunktion versehen und das Ergebnis – der Hashwert – in einer Datenbank gespeichert. Bei jeder folgenden Authentifizierung wird dieser Prozess wiederholt und der Hashwert mit dem in der Datenbank vorliegenden abgeglichen. Stimmen Sie überein, hat der Benutzer das richtige Passwort eingegeben.
Gerät ein Passwort in Vergessenheit, gehört eine Identitätsüberprüfung zum Passwortwiederherstellungsprozess. Dazu wird für gewöhnlich eine E-Mail mit einem einzigartigen Link an die Adresse verschickt, mit der der Account erstellt wurde. Beim Klick auf diesen Link wird ein neues Passwort erzeugt oder gewählt – und damit ein neuer Hashwert in der Datenbank. Führt der Recovery-Prozess hingegen dazu, dass das alte Passwort im Klartextformat an die E-Mail-Adresse geschickt oder im Browser angezeigt wird, liegt ein Implementierungsfehler vor – Security Best Practices wurden in einem solchen Fall ignoriert.
Die Verwendung von Hashing allein reicht also nicht – die Hashfunktion muss auch richtig implementiert werden, ansonsten besteht die Gefahr, dass Angreifer mit Brute-Force-Angriffen Erfolg haben. Fehler können hier zum Beispiel auftreten, wenn veraltete Hashing-Algorithmen wie MD5 oder SHA-1 verwendet werden.
Hashfunktionen – Algorithmen
Die Internet Engineering Taskforce (IETF) empfiehlt in einem aktuellen Entwurf für die Speicherung von Passwörtern den Einsatz folgender Hashing-Algorithmen:
- Argon2
- Bcrypt
- Scrypt
- PBKDF2
Neben dem Algorithmus kommt es jedoch auch auf andere Faktoren an. Zum Beispiel die Passwortlänge: Ein Minimum von acht Zeichen ist beispielsweise wichtig, weil so Dictionary-Angriffe wesentlich schwieriger werden.
Jede Hashfunktion kann darüber hinaus so implementiert werden, dass der Hashing-Algorithmus mehrfach auf das Passwort angewendet wird („Work Factor“). Das sorgt für höhere Sicherheit, benötigt aber auch mehr Rechenpower. Für die Wahl des richtigen „Work Factor“ gibt es laut OWASP keine goldene Regel: „Die Wahl des idealen ‚Work Factor‘ hängt von der Performance des Servers und der Zahl der Nutzer auf der Applikation ab. Um ihn zu ermitteln, sind Tests mit verschiedenen Servern nötig. Als Faustregel lässt sich festhalten, dass die Berechnung eines Hashwertes nicht länger als eine Sekunde in Anspruch nehmen sollte – in Umgebungen mit hohem Traffic noch wesentlich weniger.“
Hashing – Methoden
Zu den Best Practices in Sachen sichere Passwortspeicherung gehört auch das sogenannte „Salting„. Hierbei wird eine zufällig generierte Zeichenfolge – der „Salt“ – mit jedem Passwort kombiniert und gemeinsam mit dem Hashwert abgespeichert. Das verhindert beispielsweise Rainbow-Table-Attacken, sorgt aber auch dafür, dass Angreifer Passwortduplikate in Datenbanken nicht entdecken können: Auch wenn zwei verschiedene User dasselbe Passwort gewählt haben, sorgt Salting dafür, dass diese Hashwerte sich unterscheiden. Wirkungsvolle Salts sollten mindestens 16 Zeichen aufweisen, um Brute-Force-Methoden rein mathematisch den Garaus zu bereiten.
Ein zusätzlicher Security Layer kann durch den Einsatz von „Pepper“ erzeugt werden. Hierbei werden alle Passwörter mit einer zufällig erzeugten Zeichenfolge (32 Zeichen) kombiniert. Im Gegensatz zum Salt, der für jedes Passwort individuell erzeugt wird, ist der „Pepper“ für alle Passwörter gleich – und sollte deshalb auch nicht in der Datenbank abgespeichert werden. Stattdessen kann er in einem Application Configuration File oder einem Hardware-Sicherheitsmodul abgelegt werden.
Das Ziel: Auch wenn ein Angreifer in Besitz der kompletten Datenbank inklusive der Salts kommt, wird es ohne Pepper schwierig, die Hash-Werte zu knacken.
Hashfunktionen – Upgrades
Applikationen, die einen unsicheren oder schwachen Hashing-Algorithmus verwenden, sollten umgehend auf den aktuellen Stand gebracht werden. Die alten Hashwerte können dabei als Input für den neuen Algorithmus genutzt werden – sozusagen in Form eines Re-Hashing-Prozesses. Dabei sollten Sie sich aber darüber bewusst sein, dass die resultierenden Hashwerte nicht so sicher sind, wie solche, die aus dem ursprünglichen User Input erzeugt wurden. Deshalb wird gemeinhin empfohlen, Hashes erst dann mit einem modernen Algorithmus zu regenerieren, wenn sich die User das nächste Mal einloggen.
Die goldene Regel für alle Entwickler, wenn es um Kryptografie im Allgemeinen geht: Verzichten Sie auf selbstentwickelte Algorithmen. Die standardisierten und verbreiteten sind das Ergebnis jahrelanger Forschungsarbeit und werden auch von anderen Forschern und Experten auf Herz und Nieren getestet.
*Lucian Constantin arbeitet als Korrespondet für den IDG News Service.
Be the first to comment