Warum Speicher wichtig ist
Wenn ein Angreifer Passwort-Hashes oder einen verschlüsselten Vault stiehlt, rät er offline, so schnell seine Hardware es zulässt. Eine GPU hat Tausende kleine Kerne, eine Funktion mit wenig Speicherbedarf wie PBKDF2 läuft daher auf vielen davon gleichzeitig.
Argon2 braucht für jeden Versuch einen Speicherblock, und der lässt sich nicht billig überspringen. Speicher ist auf einer GPU knapp. Als reine Rechnung, nicht als Benchmark: Eine Karte mit 24 GiB fasst bei 256 MiB pro Versuch etwa 96 Versuche gleichzeitig und bei 19 MiB etwa 1.290. PBKDF2 setzt keine solche Grenze.
Es gibt drei Varianten. Argon2d widersteht GPUs am besten, aber sein Speicherzugriff hängt vom Passwort ab, was über Seitenkanäle durchsickern kann. Argon2i vermeidet das, auf Kosten eines Teils der GPU-Resistenz. Argon2id beginnt in der ersten Hälfte des ersten Durchlaufs wie Argon2i und arbeitet danach wie Argon2d. RFC 9106 empfiehlt es als Standard.
Die Parameter
| Name | Bedeutung | Wirkung |
|---|---|---|
m | Speicher in KiB | Die wichtigste Verteidigung. Erhöhen Sie zuerst diesen Wert. |
t | Durchläufe über den Speicher | Mehr Zeit pro Versuch. |
p | Lanes für parallele Threads | Ein Gerät mit mehr Kernen füllt den Speicher schneller. Es fügt keinen Speicher hinzu. |
| Salt | Zufallswert pro Passwort | Gleiches Passwort, anderer Hash. Nicht geheim, wird im Klartext gespeichert. 16 Bytes genügen für alle Zwecke, sagt der RFC. |
| Tag-Länge | Größe der Ausgabe | 16 Bytes genügen für die meisten Zwecke. 32 ist üblich, wenn daraus ein Schlüssel wird. |
Welche Werte Sie verwenden
| Quelle | m | t | p | Zeit auf unserem Mac |
|---|---|---|---|---|
| RFC 9106, erste Empfehlung | 2 GiB | 1 | 4 | 1,43 s |
| RFC 9106, zweite Empfehlung, für weniger Speicher | 64 MiB | 3 | 4 | 0,11 s |
| OWASP, Minimum in der Zusammenfassung | 19 MiB | 2 | 1 | 0,02 s |
OWASP nennt mehrere Einstellungen, die es als gleichwertig im Schutz ansieht, etwa 46 MiB mit t=1 und 12 MiB mit t=3. Das sind alles Minimalwerte für einen Server, der viele Benutzer anmelden muss. Eine App, die auf Ihrem eigenen Gerät einen einzigen Schlüssel ableitet, kann sich viel mehr leisten, weil ein Benutzer nur einmal pro Entsperren darauf wartet.
Ein guter Weg zur Wahl: Nehmen Sie so viel Speicher, wie jedes unterstützte Gerät entbehren kann, halten Sie t bei 3 oder darunter und prüfen Sie die Zeit auf Ihrem langsamsten Gerät. Denken Sie daran: Geht einem Telefon der Speicher aus, scheitert das Entsperren.
Zum Ausprobieren
Das Kommandozeilenprogramm argon2 installieren Sie unter macOS mit brew install argon2, sonst mit sudo apt install argon2. Der Speicher wird mit -k in KiB angegeben. Der Salt muss mindestens 8 Zeichen haben. Verwenden Sie auf diese Weise keine echten Passwörter, denn sie können in der Shell-Historie bleiben:
$ printf 'correct horse battery staple' | argon2 examplesalt12345 -id -t 3 -k 262144 -p 1 -l 32
Type: Argon2id
Iterations: 3
Memory: 262144 KiB
Parallelism: 1
Hash: e2c39f45f62dd7bddc5b6eff815f32fae69748a05f4c6f9875dd0e06bb9b2934
Encoded: $argon2id$v=19$m=262144,t=3,p=1$ZXhhbXBsZXNhbHQxMjM0NQ$4sOfRfYt173cW27/gV8y+uaXSKBfTG+Ydd0OBrubKTQ
0.356 seconds
Verification ok
Der kodierte String enthält alles, was man später zum Prüfen eines Passworts braucht: die Variante, die Version (v=19 ist 1.3), die Parameter, den Salt und den Hash, die beiden letzten in Base64. Sie können die Parameter also später erhöhen, und alte Hashes lassen sich weiter prüfen.
In Python, mit argon2-cffi in einer virtuellen Umgebung:
from argon2 import PasswordHasher, Type
ph = PasswordHasher(time_cost=3, memory_cost=262144, parallelism=1,
hash_len=32, salt_len=16, type=Type.ID)
stored = ph.hash("correct horse battery staple")
ph.verify(stored, "correct horse battery staple") # True; a wrong password raises VerifyMismatchError
ph.check_needs_rehash(stored) # False until you raise the parameters
Die Bibliothek erzeugt einen zufälligen Salt für Sie. Schreiben Sie keine eigene Salt-Verwaltung.
Argon2id oder PBKDF2
PBKDF2 wiederholt einen Hash sehr oft und braucht fast keinen Speicher. OWASP verlangt 600.000 Iterationen mit HMAC-SHA256, was auf unserem Mac 0,04 Sekunden dauerte. Für Sie ist das eine angenehme Wartezeit, aber jeder Versuch lässt sich billig parallel ausführen. Verwenden Sie PBKDF2, wenn ein Standard wie FIPS es verlangt, sonst Argon2id.
Ein schwaches Passwort fällt trotzdem
Argon2id macht jeden Versuch langsamer. Es macht ein schlechtes Passwort nicht gut. Angreifer probieren zuerst gängige Passwörter, ein Passwort weit oben auf ihrer Liste braucht also sehr wenige Versuche.
Wie ein Vault Passwort, Argon2id und einen separaten Schlüssel kombiniert, erklärt was Ende-zu-Ende-Verschlüsselung bei einem Passwort-Vault bedeutet.
Fragen
Welche Argon2-Variante sollte ich nehmen?
Argon2id. RFC 9106 empfiehlt sie als Standard, weil sie sowohl gegen Rateversuche auf GPUs als auch gegen Seitenkanalangriffe hilft.
Was bedeutet $argon2id$v=19$m=65536,t=3,p=4?
Argon2id, Version 1.3, 65536 KiB (64 MiB) Speicher, 3 Durchläufe und 4 Lanes. Danach folgen Salt und Hash in Base64.
Ist Argon2id besser als bcrypt?
Für neue Systeme ja. OWASP nennt Argon2id zuerst und behält bcrypt für Altsysteme. bcrypt nutzt wenig, fest vorgegebenen Speicher, und die meisten Implementierungen lesen nur die ersten 72 Byte des Passworts.
Quellen
- RFC 9106: Argon2 Memory-Hard Function
- OWASP Password Storage Cheat Sheet
- RFC 8018: PKCS #5, einschließlich PBKDF2
- Dokumentation von argon2-cffi