Argon2id erklärt: Was m, t und p bedeuten und welche Werte Sie wählen

Argon2id ist eine Passwort-Hashfunktion, die jeden Rate-Versuch zwingt, eine bestimmte Menge Speicher zu nutzen. Das macht massenhaftes Raten auf GPUs teuer. Sie legen Speicher (m), Durchläufe (t) und Lanes (p) fest. RFC 9106 empfiehlt m=2 GiB, t=1, p=4 oder bei weniger Speicher m=64 MiB, t=3, p=4. Das Minimum von OWASP ist m=19 MiB, t=2, p=1. Ein schwaches Passwort fällt trotzdem.

Interessiert Sie die Vault-Seite? Wardterm bewahrt Ihre Server, Schlüssel und Passwörter in einem Vault auf, der auf Ihrem Gerät verschlüsselt wird. Zeigen

Aktualisiert am . Kommandozeilenwerkzeug argon2 und argon2-cffi 25.1.0 in einer Python-venv, auf einem Apple-M6-Mac.

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

NameBedeutungWirkung
mSpeicher in KiBDie wichtigste Verteidigung. Erhöhen Sie zuerst diesen Wert.
tDurchläufe über den SpeicherMehr Zeit pro Versuch.
pLanes für parallele ThreadsEin Gerät mit mehr Kernen füllt den Speicher schneller. Es fügt keinen Speicher hinzu.
SaltZufallswert pro PasswortGleiches Passwort, anderer Hash. Nicht geheim, wird im Klartext gespeichert. 16 Bytes genügen für alle Zwecke, sagt der RFC.
Tag-LängeGröße der Ausgabe16 Bytes genügen für die meisten Zwecke. 32 ist üblich, wenn daraus ein Schlüssel wird.

Welche Werte Sie verwenden

QuellemtpZeit auf unserem Mac
RFC 9106, erste Empfehlung2 GiB141,43 s
RFC 9106, zweite Empfehlung, für weniger Speicher64 MiB340,11 s
OWASP, Minimum in der Zusammenfassung19 MiB210,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

Alle Anleitungen