Jetzt, wo das erste Quartal des 21. Jahrhunderts zu Ende geht, ist sicher jedem bewusst, dass Passwörter digitales Gold sind und dass ihr Schutz ein wichtiger Aspekt der Gewährleistung der Datensicherheit und des Datenschutzes ist. Dennoch speichern noch längst nicht alle Unternehmen ihre Passwörter richtig.
In diesem Beitrag sehen wir uns an, wie man Benutzerpasswörter NICHT speichern sollte und welche Methoden von Diensten verwendet werden, die es mit der Sicherheit ernst meinen.
Der falsche Weg: Speichern von Passwörtern im Klartext
Die einfachste Methode besteht darin, Passwörter in einer unverschlüsselten Datenbank zu speichern. Wenn sich ein Benutzer anzumelden versucht, wird die Authentifizierung lediglich durch den Abgleich der eingegebenen Daten mit den in der Datenbank gespeicherten Daten vorgenommen.
Allerdings besteht immer die Gefahr, dass Angreifer diese Datenbank auf irgendeine Weise stehlen – zum Beispiel durch das Ausnutzen von Sicherheitslücken in der Datenbanksoftware. Alternativ könnte eine Passworttabelle von einem Mitarbeiter mit hohen Zugriffsrechten in böser Absicht gestohlen werden. Auch geleakte oder abgefangene Anmeldedaten von Mitarbeitern könnten zum Diebstahl von Kennwörtern verwendet werden. Kurz gesagt, es gibt viele Szenarien, in denen etwas schief gehen kann. Denken Sie daran: Daten, die in offener Form gespeichert sind, sind genau das – offen.
Ein angemessener Weg: verschlüsselte Passwörter
Was, wenn Sie Passwörter in verschlüsselter Form speichern? Auf den ersten Blick keine schlechte Idee, in der Praxis allerdings nicht ganz unproblematisch. Denn werden Passwörter verschlüsselt in der Datenbank gespeichert, müssen sie jedes Mal entschlüsselt werden, um sie mit den Benutzereingaben abzugleichen.
Und das bedeutet, dass der Verschlüsselungsschlüssel irgendwo in unmittelbarer Nähe sein muss. Wenn das der Fall ist, kann dieser Schlüssel zusammen mit der Kennwortdatenbank leicht in die Hände von Hackern fallen. Damit wäre der ganze Zweck verfehlt: Die Cyberkriminellen könnten diese Datenbank schnell entschlüsseln und die Kennwörter im Klartext abrufen, womit wir wieder am Anfang stünden.
Wie Kryptographen allen Ernstes scherzen, wird das Problem des Datenschutzes durch Verschlüsselung nicht gelöst – vielmehr wird es dadurch zu einem Problem der sicheren Schlüsselspeicherung. Man kann zwar einige raffinierte Schemata entwickeln, die das Risiko verringern, aber im Allgemeinen wird es nicht möglich sein, Passwörter auf diese Weise zuverlässig zu schützen.
Der bessere Weg: das Speichern von Passwort-Hashes
Die optimale Methode ist, Passwörter überhaupt nicht zu speichern. Denn was man nicht hat, kann auch nicht gestohlen werden, oder?
Aber wie kann man überprüfen, ob ein angemeldeter Benutzer das richtige Kennwort eingegeben hat? Hier kommen Hash-Funktionen ins Spiel: spezielle kryptografische Algorithmen, die beliebige Daten auf vorhersehbare, aber nicht umkehrbare Weise in eine Bitfolge fester Länge zerlegen.
Vorhersehbar bedeutet in diesem Fall, dass die gleichen Daten immer in den gleichen Hash umgewandelt werden. Und unumkehrbar will heißen, dass es völlig unmöglich ist, die gehashten Daten über den Hash wiederherzustellen. So macht es jeder Online-Dienst, der sich auch nur ein bisschen um die Daten seiner Nutzer kümmert und seinen Ruf schätzt.
Wenn man bei der Registrierung ein Passwort erstellt, wird nicht das Passwort selbst, sondern sein Hash zusammen mit dem Benutzernamen in der Datenbank gespeichert. Dieser Hash wird dann während des Anmeldevorgangs mit dem Hash des vom Benutzer eingegebenen Passworts verglichen. Wenn beide übereinstimmen, bedeutet dies, dass die Passwörter identisch sind.
Im Falle eines Datenbanklecks gelangen die Angreifer nicht in den Besitz der Passwörter, sondern ihrer Hashes, aus denen die ursprünglichen Daten nicht wiederhergestellt werden können. Selbstverständlich ist dies ein großer Fortschritt in Sachen Sicherheit, aber zum Jubeln ist es noch zu früh: Wenn Cyberkriminelle die Hashes in die Hände bekommen, könnten sie versuchen, einen Brute-Force-Angriff durchzuführen.
Der noch bessere Weg: Salted Hashes
Nachdem sie sich Zugang zu Ihrer Datenbank verschafft haben, könnten Hacker versuchen, die Passwörter per Brute-Force-Verfahren zu extrahieren. Das heißt, sie nehmen eine Zeichenkombination, berechnen ihren Hash und suchen in allen Einträgen der Datenbank nach Übereinstimmungen. Gibt es keine Übereinstimmung, wird eine andere Kombination ausprobiert und so weiter. Bei einer Übereinstimmung ist das Kennwort, das zur Berechnung des Hashwerts in der Datenbank verwendet wurde, somit bekannt.
Noch schlimmer ist, dass der Prozess des Crackens gehashter Kennwörter mit Hilfe so genannter Rainbow Tables erheblich beschleunigt werden kann. Rainbow Tables sind riesige Datenstrukturen mit vorab berechneten Hash-Funktionen für die am häufigsten vorkommenden Passwörter. So erleichtern sie die Suche nach Übereinstimmungen in der gestohlenen Datenbank. Und das alles geschieht natürlich automatisch, so dass das Knacken von Passwörtern viel zu schnell geht, als dass es angenehm wäre.
Allerdings gibt es auch eine gute Nachricht: Es ist unmöglich, die Hashes aller möglichen Zeichenkombinationen im Voraus zu berechnen – eine vollständige Regenbogentabelle für jeden Hash-Algorithmus würde mehr Speicherplatz beanspruchen, als es auf der Erde gibt. Selbst bei dem nicht allzu zuverlässigen MD5-Algorithmus würde eine solche hypothetische Tabelle stolze 340 282 366 920 938 463 463 374 607 431 768 211 456 Datensätze enthalten. Daher werden nur die häufigsten Kombinationsmöglichkeiten in Rainbow-Tabellen aufgenommen.
Um den Einsatz von Rainbow Tables zu unterbinden, haben Kryptographen eine Lösung gefunden, die sich eine weitere wichtige Eigenschaft von Hash-Funktionen zunutze macht: Selbst die kleinste Änderung im Quelltext verändert das Hash-Ergebnis bis zur Unkenntlichkeit.
Bevor ein Passwort-Hash ermittelt und in die Datenbank geschrieben wird, wird ihm eine zufällige Menge von Zeichen (Salt genannt) hinzugefügt. So werden die Hashes in der Datenbank so verändert, dass selbst die einfachsten, offensichtlichsten und am häufigsten verwendeten Kennwörter wie „12345678“ und „password“ nicht mit Hilfe von Rainbow Tables geknackt werden können.
Die einfachste Variante verwendet dasselbe Salt für alle Passwörter. Allerdings wird bei der hackresistentesten Variante für jeden einzelnen Datensatz ein eigenes Salt erstellt. Der Vorteil dieses Ansatzes ist, dass die Salts in derselben Datenbank gespeichert werden können, ohne dass ein zusätzliches Risiko besteht: selbst, wenn die Angreifer den Salt kennen, macht dies ihre Aufgabe nicht einfacher. Um die Hashes zu knacken, müssen sie nach wie vor Brute-Force-Methoden anwenden und jede einzelne Kombination durchgehen.
Je mehr Online-Dienste diese Methode der Nicht-Speicherung von Passwörtern verwenden, desto weniger wahrscheinlich wird ein potenzieller Massendiebstahl von Nutzer-Anmeldeinformationen (und die anschließenden Probleme im Zusammenhang mit dem Hacken von Konten).