Warum nicht einfach SHA-256?
Ein gewöhnlicher kryptografischer Hash wie ist das richtige Werkzeug für Integrität, aber das falsche Werkzeug zum Speichern von Passwörtern, und der Grund ist gerade die Eigenschaft, die ihn anderswo gut macht: Er ist schnell. Ein Angreifer, der eine Datenbank mit SHA-256-Passwort-Hashes stiehlt, kann auf handelsüblicher Hardware Milliarden Rateversuche pro Sekunde unternehmen, weil jeder Versuch nur ein schneller Hash ist. Gängige Passwörter fallen fast augenblicklich. Geschwindigkeit, die Tugend eines Allzweck-Hashes, ist hier ein Nachteil.
Passwortspeicherung braucht einen Hash, der absichtlich langsam und gegen spezialisierte Hardware widerstandsfähig ist. Drei Bausteine bewirken das: Salting, ein einstellbarer Arbeitsfaktor und Speicherhärte.
Salting: Vorberechnung schlagen
Ein Salt ist ein eindeutiger Zufallswert, der neben jedem Passwort-Hash gespeichert und in das Hashen eingemischt wird. Ohne Salts erzeugen identische Passwörter identische Hashes, sodass ein Angreifer einmalig eine riesige Tabelle gängiger Passwort-Hashes vorberechnen (eine „Rainbow Table") und jede Übereinstimmung sofort nachschlagen kann. Ein eindeutiges Salt pro Passwort macht diese Vorberechnung wertlos: Der Angreifer muss jeden Hash einzeln angreifen, und dasselbe Passwort hasht für jeden Nutzer anders. Moderne Passwort-Hash-Funktionen erzeugen und speichern das Salt für Sie.
Arbeitsfaktor: jeden Versuch teuer machen
Ein Arbeitsfaktor (oder Kostenparameter) steuert, wie viel Berechnung jeder Hash erfordert. Stellen Sie ihn so ein, dass ein einzelner Hash langsam genug ist, um bei einer rechtmäßigen Anmeldung unbemerkt zu bleiben (einige hundert Millisekunden), aber in großem Maßstab strafend wirkt. Da es ein Parameter ist, können Sie ihn über die Jahre anheben, wenn die Hardware schneller wird, und die Kosten des Ratens ungefähr konstant halten. Das ist der Regler, den ein Allzweck-Hash schlicht nicht hat.
Die drei Standardoptionen
- bcrypt ist die langjährige, gut verstandene Option, aufgebaut auf der Blowfish-Chiffre mit einem konfigurierbaren Kostenfaktor. Eine sichere Vorgabe, wo verfügbar.
- scrypt fügt Speicherhärte hinzu: Es verbraucht absichtlich eine einstellbare Menge Speicher, was Angreifer mit GPUs und Spezialchips ausbremst, da diese Berechnung weit billiger skalieren als Speicher.
- Argon2 gewann 2015 die Password Hashing Competition und ist die aktuelle Empfehlung für neue Systeme. Es ist speicherhart mit getrennten Reglern für Speicher, Zeit und Parallelität; die Variante Argon2id ist die übliche Wahl.
Jede davon ist eine vernünftige Wahl; die oberste Regel lautet, eine von ihnen zu verwenden, nie einen bloßen schnellen Hash, und nie ein eigenes Verfahren zu erfinden.
Die Erkenntnis
Nutzen Sie SHA-256 (im Hash-Werkzeug) für Prüfsummen und Integrität, wo Geschwindigkeit ein Vorteil ist. Für Passwörter greifen Sie zu bcrypt, scrypt oder Argon2, wo Langsamkeit und Speicherkosten der ganze Sinn sind. Die beiden Aufgaben sehen ähnlich aus und verlangen entgegengesetzte Werkzeuge.