Die Entwicklung des Passwort-Hashings
Möglicherweise haben Sie Ratschläge für die Auswahl von Passwort-Hashing-Algorithmen gehört, aber haben Sie darüber nachgedacht, warum sie empfohlen werden? In diesem Artikel werden wir die Entwicklung von Passwort-Hashing-Algorithmen und die Gründe dafür untersuchen.
Einführung
Passwort-Hashing, wie der Name schon sagt, ist der Prozess der Berechnung eines Hash-Werts aus einem Passwort. Der Hash-Wert wird typischerweise in einer Datenbank gespeichert und während des Anmeldevorgangs (Anmeldung) wird der Hash-Wert des vom Benutzer eingegebenen Passworts berechnet und mit dem in der Datenbank gespeicherten Hash-Wert verglichen. Wenn sie übereinstimmen, wird der Benutzer authentifiziert.
Bevor wir uns mit der Entwicklung von Passwort-Hashing-Algorithmen beschäftigen, ist es wichtig zu verstehen, warum dies notwendig ist.
Klartextpasswörter: Ein großes Sicherheitsrisiko
Stellen Sie sich vor, Sie sind ein Benutzer einer Website, auf der Sie ein Konto registriert haben. Eines Tages wird die Website gehackt und die Datenbank durchgesickert. Wenn die Website Passwörter im Klartext speichert, kann der Hacker direkt auf Ihr Passwort zugreifen. Da viele Leute Passwörter auf verschiedenen Websites wiederverwenden, kann der Hacker dieses Passwort verwenden, um unbefugten Zugang zu Ihren anderen Konten zu erhalten. Die Situation wird noch schlimmer, wenn Sie dasselbe oder ein ähnliches Passwort für Ihr E-Mail-Konto verwenden, da der Hacker Ihr Passwort zurücksetzen und alle damit verbundenen Konten übernehmen kann.
Selbst ohne einen Datenverstoß können in großen Teams alle, die Zugang zur Datenbank haben, Passwörter sehen. Im Vergleich zu anderen Informationen sind Passwörter hochsensibel und Sie möchten definitiv nicht, dass jemand Zugang zu ihnen hat.
Passwörter ohne Hashing zu speichern, ist ein Anfängerfehler. Leider werden Sie feststellen, dass große Unternehmen wie Facebook, DailyQuiz und GoDaddy alle Passwortlecks im Klartext erlebt haben. Es ist wahrscheinlich, dass viele andere Unternehmen den gleichen Fehler gemacht haben.
Codierung vs. Verschlüsselung vs. Hashing
Diese drei Begriffe werden oft verwechselt, aber sie sind unterschiedliche Konzepte.
Codierung
Die Codierung ist das erste, was man für die Passwortspeicherung ausschließen sollte. Zum Beispiel ist Base64 ein Codierungsalgorithmus, der binäre Daten in eine Zeichenkette umwandelt:
Die Kenntnis des Codierungsalgorithmus erlaubt es jedem, die codierte Zeichenkette zu decodieren und die ursprünglichen Daten abzurufen:
Für Hacker sind die meisten Codierungsalgorithmen gleichwertig zum Klartext.
Verschlüsselung
Bevor das Hashing populär wurde, wurde die Verschlüsselung zum Speichern von Passwörtern verwendet, wie z.B. mit AES. Die Verschlüsselung beinhaltet die Verwendung eines Schlüssels (oder eines Schlüsselpaares) zum Verschlüsseln und Entschlüsseln von Daten.
Das Problem mit der Verschlüsselung wird in dem Begriff "Entschlüsselung" deutlich. Die Verschlüsselung ist umkehrbar, das heißt, wenn ein Hacker den Schlüssel erhält, kann er das Passwort entschlüsseln und das Klartextpasswort abrufen.
Hashing
Der wesentliche Unterschied zwischen Hashing, Codierung und Verschlüsselung besteht darin, dass das Hashing unumkehrbar ist. Sobald ein Passwort gehasht wurde, kann es nicht wieder in seine ursprüngliche Form entschlüsselt werden.
Als Website-Besitzer müssen Sie das Passwort eigentlich nicht kennen, solange der Benutzer sich mit dem richtigen Passwort anmelden kann. Der Registrierungsprozess kann wie folgt vereinfacht werden:
- Benutzer gibt das Passwort ein.
- Der Dienst verwendet einen Hashing-Algorithmus, um den Hash-Wert des Passworts zu berechnen.
- Der Dienst speichert den Hash-Wert in der Datenbank.
Wenn der Benutzer sich anmeldet, ist der Prozess:
- Benutzer gibt das Passwort ein.
- Der Dienst verwendet den gleichen Hashing-Algorithmus, um den Hash-Wert des Passworts zu berechnen.
- Der Dienst vergleicht den Hash-Wert mit dem in der Datenbank gespeicherten Hash-Wert.
- Wenn die Hash-Werte übereinstimmen, wird der Benutzer authentifiziert.
Beide Prozesse vermeiden die Speicherung von Passwörtern im Klartext, und da das Hashing unumkehrbar ist, kann der Hacker, selbst wenn die Datenbank kompromittiert ist, nur Hash-Werte erhalten, die als zufällige Zeichenketten erscheinen.
Hashing-Algorithmen Starter-Paket
Hashing mag wie die perfekte Lösung für die Passwortspeicherung erscheinen, aber es ist nicht so einfach. Um zu verstehen, warum, lassen Sie uns die Entwicklung von Passwort-Hashing-Algorithmen betrachten.
MD5
1992 entwarf Ron Rivest den MD5-Algorithmus, einen Nachrichten-Digest-Algorithmus, der einen 128-Bit-Hash-Wert aus beliebigen Daten berechnen kann. MD5 wurde in verschiedenen Bereichen weit verbreitet, einschließlich dem Passwort-Hashing. Zum Beispiel ist der MD5-Hash-Wert von "123456":
Wie bereits erwähnt, erscheint der Hash-Wert als eine zufällige Zeichenkette und ist unumkehrbar. Außerdem ist MD5 schnell und einfach zu implementieren, was es zum beliebtesten Passwort-Hashing-Algorithmus macht.
Allerdings sind MD5's Vorteile auch seine Schwächen beim Passwort-Hashing. Seine Geschwindigkeit macht es anfällig für Brute-Force-Angriffe. Wenn ein Hacker eine Liste von gängigen Passwörtern und Ihre persönlichen Informationen hat, kann er den MD5-Hash-Wert jeder Kombination berechnen und diese mit den Hash-Werten in der Datenbank vergleichen. Zum Beispiel könnte er Ihr Geburtsdatum mit Ihrem Namen oder dem Namen Ihres Haustiers kombinieren.
Heutzutage sind Computer deutlich leistungsfähiger als früher, was es leicht macht, MD5-Passwort-Hashes zu brute forcen.
SHA-Familie
Warum also nicht einen anderen Algorithmus verwenden, der längere Hash-Werte generiert? Die SHA-Familie scheint eine gute Wahl zu sein. SHA-1 ist ein Hashing-Algorithmus, der 160-Bit-Hash-Werte erzeugt, und SHA-2 ist eine Familie von Hashing-Algorithmen, die Hash-Werte von 224-Bit, 256-Bit, 384-Bit und 512-Bit Längen erzeugen. Lassen Sie uns den SHA-256-Hash-Wert von "123456" betrachten:
Der SHA-256-Hash-Wert ist viel länger als MD5, und er ist auch unumkehrbar. Allerdings gibt es ein weiteres Problem: Wenn Sie bereits den Hash-Wert kennen, wie den oben genannten, und Sie sehen den exakten Hash-Wert in der Datenbank, wissen Sie, dass das Passwort "123456" ist. Ein Hacker kann eine Liste von gängigen Passwörtern und ihren entsprechenden Hash-Werten erstellen und sie mit den Hash-Werten in der Datenbank vergleichen. Diese Liste wird als Rainbow Table bezeichnet.
Salt
Um Rainbow-Table-Angriffe abzuwehren, wurde das Konzept des Salts eingeführt. Ein Salt ist eine zufällige Zeichenkette, die vor dem Hashing zum Passwort hinzugefügt wird. Zum Beispiel, wenn das Salt "salt" ist, und Sie wollen SHA-256 verwenden, um das Passwort "123456" mit dem Salt zu hashen, anstatt einfach:
zu machen, könnten Sie:
Wie Sie sehen können, ist das Ergebnis völlig anders als das Hashing ohne Salt. Typischerweise wird jedem Benutzer bei der Registrierung ein zufälliges Salt zugewiesen, das in der Datenbank zusammen mit dem Hash-Wert gespeichert wird. Während des Anmeldevorgangs wird das Salt verwendet, um den Hash-Wert des eingegebenen Passworts zu berechnen, der dann mit dem gespeicherten Hash-Wert verglichen wird.
Iteration
Trotz der Zugabe von Salt ist der Hash-Wert immer noch anfällig für Brute-Force-Angriffe, da die Hardware immer leistungsfähiger wird. Um es schwieriger zu machen, kann die Iteration (d.h., das mehrmalige Ausführen des Hashing-Algorithmus) eingeführt werden. Zum Beispiel könnte man anstelle von:
verwenden:
Die Erhöhung der Anzahl der Iterationen macht das Brute-Forcing schwieriger. Allerdings wirkt sich dies auch auf den Anmeldevorgang aus, der dadurch langsamer wird. Daher muss ein Gleichgewicht zwischen Sicherheit und Performance gefunden werden.
Halbzeitpause
Lasst uns eine Pause machen und die Eigenschaften eines guten Passwort-Hashing-Algorithmus zusammenfassen:
- Unumkehrbar (Präbildresistenz)
- Schwer zu brute forcen
- Resistent gegen Rainbow-Table-Angriffe
Wie Sie vielleicht bemerkt haben, sind Salt und Iteration notwendig, um all diese Anforderungen zu erfüllen. Das Problem ist, dass sowohl MD5 als auch die SHA-Familie nicht speziell für das Passwort-Hashing entwickelt wurden; sie werden häufig für Integritätschecks (oder "Nachrichten-Digest") verwendet. Das Ergebnis ist, dass jede Website ihre eigene Implementierung von Salt und Iteration haben kann, was die Standardisierung und Migration erschwert.
Passwort-Hashing-Algorithmen
Um dieses Problem zu lösen, wurden mehrere Hashing-Algorithmen speziell für das Passwort-Hashing entwickelt. Lassen Sie uns einige davon betrachten.
bcrypt
bcrypt ist ein Passwort-Hashing-Algorithmus, der von Niels Provos und David Mazières entwickelt wurde. Er wird in vielen Programmiersprachen verwendet. Hier ist ein Beispiel für einen bcrypt-Hash-Wert:
Obwohl es wie eine weitere zufällige Zeichenkette aussieht, enthält es zusätzliche Informationen. Lassen Sie uns das aufschlüsseln:
- Der erste Abschnitt
$2y
gibt den Algorithmus an, der2y
ist. - Der zweite Abschnitt
$12
gibt die Anzahl der Iterationen an, die12
sind. Das bedeutet, dass der Hashing-Algorithmus 212=4096 Mal (Iterationen) ausgeführt wird. - Der dritte Abschnitt
wNt7lt/xf8wRJgPU7kK2ju
ist das Salt. - Der letzte Abschnitt
GrirhHK4gdb0NiCRdsSoAxqQoNbiluu
ist der Hash-Wert.
bcrypt hat einige Einschränkungen:
- Die maximale Länge des Passworts ist 72 Byte.
- Das Salt ist auf 16 Byte begrenzt.
- Der Hash-Wert ist auf 184 Bits begrenzt.
Argon2
Angesichts der Debatten und Einschränkungen der bestehenden Passwort-Hashing-Algorithmen wurde 2015 ein Passwort-Hashing-Wettbewerb abgehalten. Lassen Sie uns die Details überspringen und uns auf den Gewinner konzentrieren: Argon2.
Argon2 ist ein Passwort-Hashing-Algorithmus, der von Alex Biryukov, Daniel Dinu und Dmitry Khovratovich entwickelt wurde. Es führt mehrere neue Konzepte ein:
- Speicherintensiv: Der Algorithmus ist so konzipiert, dass er schwer parallelisierbar ist, was das Brute-Forcing mit GPUs herausfordernd macht.
- Zeitintensiv: Der Algorithmus ist so konzipiert, dass er schwer zu optimieren ist, was das Brute-Forcing mit ASICs (Application-specific integrated circuits) schwierig macht.
- Beständig gegen Seitenkanalangriffe: Der Algorithmus ist so konzipiert, dass er beständig gegen Seitenkanalangriffe ist, wie z.B. Timing-Angriffe.
Es gibt zwei Hauptversionen von Argon2, Argon2i und Argon2d. Argon2i ist am sichersten gegen Seitenkanalangriffe, während Argon2d den höchsten Widerstand gegen GPU-Cracking-Angriffe bietet.
-- Argon2
Hier ist ein Beispiel für einen Argon2-Hash-Wert:
Lassen Sie uns das aufschlüsseln:
- Der erste Abschnitt
$argon2i
gibt den Algorithmus an, derargon2i
ist. - Der zweite Abschnitt
$v=19
gibt die Version an, die19
ist. - Der dritte Abschnitt
$m=16,t=2,p=1
gibt den Speicheraufwand, den Zeitaufwand und den Parallelitätsgrad an, die16
,2
und1
sind. - Der vierte Abschnitt
$YTZ5ZnpXRWN5SlpjMHBDRQ
ist das Salt. - Der letzte Abschnitt
$12oUmJ6xV5bIadzZHkuLTg
ist der Hash-Wert.
In Argon2 ist die maximale Länge des Passworts 232-1 Byte, das Salt ist auf 232-1 Byte begrenzt und der Hash-Wert ist auf 232-1 Byte begrenzt. Das sollte für die meisten Szenarien ausreichen.
Argon2 ist nun in vielen Programmiersprachen verfügbar, wie z.B. node-argon2 für Node.js und argon2-cffi für Python.
##Fazit
Im Laufe der Jahre haben Passwort-Hashing-Algorithmen eine bedeutende Entwicklung durchgemacht. Wir sind der Sicherheitsgemeinschaft für ihre jahrzehntelange Bemühung, das Internet sicherer zu machen, zu Dank verpflichtet. Dank ihrer Beiträge können Entwickler mehr Aufmerksamkeit auf den Aufbau besserer Dienste lenken, ohne sich um die Sicherheit des Passwort-Hashings sorgen zu müssen. Während eine 100%ige Sicherheit in einem System möglicherweise unerreichbar ist, können wir vielfältige Strategien einsetzen, um die damit verbundenen Risiken zu minimieren.
Wenn Sie sich die Mühe der Implementierung von Authentifizierung und Autorisierung ersparen möchten, probieren Sie gerne Logto kostenlos aus. Wir bieten sichere (wir verwenden Argon2!), zuverlässige und skalierbare Lösungen, die es Ihnen ermöglichen, sich auf den Aufbau Ihres Produkts zu konzentrieren.