Passwortspeicherung
Wenn Ihre Anwendung Benutzer authentifiziert, ist es wahrscheinlich, dass sie auch mit Passwörtern zu tun haben wird.
Der Umgang mit Benutzerpasswörtern ist eine große Sache, und der richtige Umgang mit ihnen ist eine noch größere Sache.
Man kann sich kaum ein schlimmeres Szenario vorstellen, als dass eine Anwendung angegriffen wird und die Passwörter der Benutzer im Internet für alle sichtbar werden. Uns persönlich schaudert es bei dem Gedanken. Wie also können Kennwörter sicher und gemäß den besten Praktiken gespeichert werden? Schauen wir uns ein paar Möglichkeiten an.
Verschlüsselung versus Hashing
Oberflächlich betrachtet könnte man meinen, dass die Verschlüsselung eine gute Lösung für die sichere Speicherung von Passwörtern ist, aber sich ganz darauf zu verlassen, könnte problematisch sein.
Verschlüsselung ist von Natur aus eine zweiseitige Funktion, was natürlich bedeutet, dass ein Passwort nicht nur verschlüsselt, sondern auch entschlüsselt werden kann. Vollkommen logisch, oder? Wie könnten Sie sonst überprüfen, ob das Kennwort eines Benutzers mit dem in der Datenbank gespeicherten übereinstimmt?
Die Fähigkeit, Passwörter zu entschlüsseln, ist also auch eine große Gefahr. Wenn jemand einen Server kompromittiert und an den Chiffriertext eines Passworts gelangt, ist die Wahrscheinlichkeit groß, dass er auch an das Schlüsselmaterial gelangt, das zur Entschlüsselung dieser Passwörter benötigt wird.
Hashing hingegen eignet sich aufgrund seiner Einbahnstraßenfunktion viel besser für Kennwörter. Sobald Sie etwas gehasht haben, gibt es keine Funktion, um den verschlüsselten Text direkt in den ursprünglichen Klartext zurückzuverwandeln. Aufgrund dieser Eigenschaft eignen sich Hashes hervorragend für den Schutz von Kennwörtern.
Nicht alle Hashes sind gleich
Wenn Sie sich für die Speicherung von Kennwörtern durch Hashing entschieden haben, ist es auch nicht so einfach, eine Hash-Funktion anzuwenden und die Sache zu beenden.
Hashes gibt es in allen Formen und Größen, von denen die meisten angesichts der Fortschritte in der Computertechnologie in den letzten zehn Jahren nicht gerade für die Speicherung von Kennwörtern geeignet sind.
Wie bereits erwähnt, können Hashes nicht rückgängig gemacht werden, da es sich um eine Einwegfunktion handelt. Das ist zwar technisch gesehen richtig, aber Hashes sind auch deterministisch, was bedeutet, dass sie auch anfällig für Brute-Forcing-Taktiken sind, die es einem Angreifer ermöglichen, einen Hash in den ursprünglichen Klartext umzukehren, wenn er genug Zeit und Ressourcen hat.
Aus diesem Grund unterteilen wir Hash-Funktionen in zwei Kategorien:
- Kryptographische Hashes
- Passwort-Hashes
Ein Hauptmerkmal von Passwort-Hashes ist, dass sie einen "Arbeitsfaktor" haben (entweder durch eine einzelne ganze Zahl oder mehrere Parameter), der den Aufwand für die Berechnung des Hashes definiert.
Da CPUs und GPUs im Laufe der Jahre immer schneller geworden sind, ist es einfacher geworden, massive Brute-Force-Angriffe gegen Hashes auf Consumer-Hardware durchzuführen, was bedeutet, dass ein Hash mit der Zeit immer unsicherer werden kann.
Der "Arbeitsfaktor" wird verwendet, um sicherzustellen, dass Hashes auf eine Weise gespeichert werden, die den Branchentrends entspricht. Wenn die Hardware schneller wird, erhöht man den Arbeitsfaktor des Algorithmus, um sicherzustellen, dass die Entschlüsselung des Hashes mehr Zeit und Mühe erfordert. Sagen wir, als Beispiel, 100ms auf moderner Hardware.
Dies bedeutet, dass der Arbeitsfaktor in der Praxis möglicherweise alle 2-3 Jahre erhöht werden muss.