Passwortspeicherung
Wenn Ihre Anwendung Benutzer authentifiziert, werden Sie höchstwahrscheinlich auch mit Passwörtern zu tun haben.
Der Umgang mit Benutzerpasswörtern ist eine äußerst sensible Angelegenheit, und eine korrekte Handhabung ist umso wichtiger.
Es ist kaum ein schlimmeres Szenario vorstellbar, als dass eine Anwendung angegriffen wird und Benutzerpasswörter im Internet landen, wo sie jeder einsehen kann. Allein der Gedanke daran lässt uns erschaudern. Wie also lassen sich Passwörter sicher und nach bewährten Standards speichern? Werfen wir einen Blick auf einige Methoden.
Verschlüsselung versus Hashing
Auf den ersten Blick mag Verschlüsselung wie eine solide Lösung für die sichere Passwortspeicherung erscheinen, doch sich allein darauf zu verlassen, kann problematisch sein.
Verschlüsselung ist von Natur aus eine Zwei-Wege-Funktion. Das bedeutet natürlich, dass ein Passwort nicht nur verschlüsselt, sondern auch entschlüsselt werden kann. Logisch, oder? Wie sonst könnten Sie überprüfen, ob das Passwort eines Benutzers mit dem in der Datenbank gespeicherten Wert übereinstimmt?
Die Möglichkeit, Passwörter zu entschlüsseln, stellt daher ein erhebliches Sicherheitsrisiko dar. Wenn jemand einen Server kompromittiert und an den verschlüsselten Passworttext gelangt, ist die Wahrscheinlichkeit groß, dass er auch die Schlüssel erhält, die zur Entschlüsselung dieser Passwörter erforderlich sind.
Hashing hingegen ist aufgrund seiner Einweg-Natur weitaus besser für Passwörter geeignet. Sobald ein Wert gehasht wurde, gibt es keine Funktion, um den Hash-Wert direkt wieder in den ursprünglichen Klartext umzuwandeln. Diese Eigenschaft macht Hashes einzigartig geeignet für den Schutz von Passwörtern.
Nicht alle Hashes sind gleich
Wenn Sie sich für das Hashing von Passwörtern zur Speicherung entschieden haben, ist es nicht damit getan, einfach eine Hash-Funktion anzuwenden und die Sache als erledigt zu betrachten.
Es gibt Hashes in unterschiedlichsten Ausführungen, von denen die meisten angesichts der Fortschritte in der Computertechnologie im letzten Jahrzehnt nicht mehr für die Passwortspeicherung geeignet sind.
Wie bereits erwähnt, können Hashes aufgrund ihrer Einweg-Natur nicht umgekehrt werden. Obwohl dies technisch korrekt ist, sind Hashes deterministisch. Das bedeutet, sie sind anfällig für Brute-Force-Angriffe, bei denen ein Angreifer mit ausreichend Zeit und Ressourcen einen Hash potenziell wieder in den ursprünglichen Klartext zurückverwandeln kann.
Aus diesem Grund unterteilen wir Hash-Funktionen in zwei Kategorien:
- Kryptografische Hashes
- Passwort-Hashes
Ein Hauptmerkmal von Passwort-Hashes ist ein „Arbeitsfaktor“ (entweder als einzelner Ganzzahlwert oder als mehrere Parameter), der den Rechenaufwand für die Erstellung des Hashes definiert.
Da CPUs und GPUs im Laufe der Jahre immer schneller geworden sind, ist es einfacher geworden, massive Brute-Force-Angriffe auf Hashes mit handelsüblicher Hardware durchzuführen. Das bedeutet, dass ein Hash mit der Zeit immer weniger sicher wird.
Der „Arbeitsfaktor“ stellt sicher, dass Hashes gemäß aktuellen Industriestandards gespeichert werden. Wenn Hardware schneller wird, erhöhen Sie den Arbeitsfaktor des Algorithmus, damit die Entschlüsselung des Hashes mehr Zeit und Aufwand erfordert – beispielsweise 100 ms auf aktueller Hardware.
In der Praxis bedeutet dies, dass der Arbeitsfaktor alle 2 bis 3 Jahre angepasst werden muss.
Sichere Programmierung in der Praxis
Entdecken Sie Richtlinien für sicheres Programmieren, um Schwachstellen wie die OWASP Top 10 zu verstehen und zu beheben, und tauchen Sie in geführte Trainingsmissionen ein, um diese in realistischen Anwendungssimulationen zu üben.