# Argon2

Argon2 ist ein Passwort-Hashing-Verfahren, das neben der Authentifizierung auch zur Schlüsselableitung und für Kryptowährungen verwendet werden kann. Der Algorithmus wurde 2014 von Alex Biryukov, Daniel Dinu und Dmitry Khovratovich von der Universität Luxemburg vorgestellt und gewann 2015 die Password Hashing Competition. Argon2 ist Arbeitsspeicher-intensiv und für die x86-Architektur optimiert. Eine Kernfunktion ist eine Parallelität, die Time-Memory Tradeoffs verhindert.

## Hintergrund

Passwort-Hashing ist ein Verfahren, um aus einem Passwort einen kryptographischen Schlüssel zur Verschlüsselung zu gewinnen oder um ein Passwort für einen Authentifizierungsprozess zu speichern. Bisherige Verfahren dafür, wie bcrypt oder PBKDF2 erwiesen sich als sehr anfällig für Angriffe mit spezialisierter Hardware (custom hardware attacks), mit denen vor allem Passwort-Listen innerhalb kurzer Zeit durchprobiert werden können. Eine erste Alternative bot das 2010 veröffentlichte Verfahren Scrypt, das allerdings sehr kompliziert in der Implementierung ist, was eine Kryptoanalyse erschwert. 2013 wurde mit der Password Hashing Competition ein Auswahlverfahren ins Leben gerufen, das die Forschung zum Passwort-Hashing fördern und einen Algorithmus zur Verwendung vorschlagen sollte.

## Geschichte

2014 wurde das Verfahren Argon bei der Password Hashing Competition eingereicht. Argon basierte auf den AES-Befehlsinstruktionen des Prozessors und erreichte damit eine schnelle Ausführung, die auch durch spezialisierte Hardware nicht wesentlich übertroffen werden konnte.
Am 31. Januar 2015 (Paper v2 S. 34) wurde neben einer Modifikation von Argon auch das Verfahren Argon2 vorgestellt. Argon2 verzichtet auf AES-Befehlsinstruktionen und basiert stattdessen auf der Hashfunktion Blake2b. Da dieses neue Verfahren während der zweiten Phase der Password Hashing Competition eingereicht wurde, in der eigentlich nur geringfügige Änderungen (tweaks) erlaubt waren, musste dessen Zulassung durch das Gremium der Password Hashing Competition ausdrücklich beschlossen werden. Am 20. Juli 2015 wurde schließlich Argon2 zum Sieger des Auswahlverfahrens erklärt.

## Struktur

Argon2 erzeugt einen großen Vektor im Arbeitsspeicher, der als Matrix aufgebaut ist, um eine synchronisierte Parallelität zu ermöglichen. Die Zugriffe auf den Vektor stellen sicher, dass nur zugunsten einer sehr viel längeren Laufzeit darauf verzichtet werden kann, diesen Vektor vollständig im Arbeitsspeicher zu halten. Es wird somit verhindert, dass der Algorithmus durch spezialisierte Hardware (ASICs und andere), die über geringe Arbeitsspeicher verfügen, wesentlich schneller ausgeführt werden kann, als auf einem PC oder Server. Dazu berechnet die indexing function die Indices des Vektors, auf die zugegriffen wird. Sie ist im Falle von Argon2i unabhängig von Passwort und Salt, dafür jedoch langsamer als Argon2d und kann daher in der gleichen Zeit nur einen kleineren Vektor berechnen.
Argon2 verwendet:
* eine interne Kompressionsfunktion G mit zwei 1024-byte Inputs und einem 1024-byte output: G ist aufgebaut aus der Runden-Funktion P von Blake2b und umfasst lediglich eine Runde,
* eine interne Hashfunktion H (Blake2b).
Die Kompressionsfunktion G, die Hashfunktion H, die Blocklänge und die Anzahl der slices sind grundsätzlich austauschbar, in der Referenzimplementierung von Argon2 sind diese jedoch festgelegt.

### Konkrete Instanzen

Argon2d kann Angriffen mit spezialisierter Hardware besser vorbeugen, ist jedoch verwundbar für Cache-Timing-Attacks. Die Autoren schlagen diese Variante für Kryptowährungen und Backend-Server vor.
Argon2i ist für Szenarien geeignet, in denen Angreifer möglicherweise Zugang zur CPU haben, in der Argon2 ausgeführt wird. Die Autoren schlagen als Anwendungsgebiete Passwort-Hashing und Schlüsselableitungen vor. In einem Internet-Draft vom August 2017 wurde für diese Szenarien die Variante Argon2id empfohlen.
Argon2i und Argon2d unterscheiden sich in der Art, in der die Indices des Vektors berechnet werden: Argon2d berechnet die Indices abhängig von Passwort und Salt, Argon2i berechnet die Indices unabhängig von Passwort und Salt (gegebenenfalls abhängig von öffentlichen Input-Parametern).
Mit der Version v1.2.1 vom Februar 2016 wurde die Instanz Argon2id als optionale Instanz eingeführt, in der beide Instanzen kombiniert werden. Diese Variante weist in Bezug auf eine Verwundbarkeit mit Cache-Timing-Attacks eine hybride Struktur auf, ähnlich wie die Verfahren Lyra2 und Pomelo.

### Empfohlene Parameter

Die Auswahl der Parameter richtet sich nach dem System, auf dem Argon2 ausgeführt wird. Die Autoren legen keine Standard-Parameter fest. Jedoch befinden sich im RFC 9106, der Argon2 standardisiert, zwei Empfehlungen.
* Variante: Argon2id
* Parallelismus p: Doppelte Anzahl der Prozessorkerne.
* Erste Empfehlung
** Iterationen t: 1
** Arbeitsspeicher: 2 GiB
** für alle Umgebungen geeignet
* Zweite Empfehlung
** Iterationen t: 3
** Arbeitsspeicher: 64 MiB
** für Umgebungen, in denen Arbeitsspeicher begrenzt ist
Für bestimmte Anwendungen schlagen die Autoren folgende Werte für Rechenzeit und Arbeitsspeicheranforderung vor:
* Argon2d für Krypto-Währungen: 0,1 s, mit einem Kern (p = 2), 256 MB RAM.
* Argon2d für Backend-Server-Authentifizierung: 0,5 s, mit 4 Kernen (p = 8), 4 GB RAM.
* Argon2i für Schlüsselableitung für Festplattenverschlüsselung: 3s, mit 2 Kernen (p = 4), 6 GB RAM.
* Argon2i für Frontend-Server-Authentifizierung: 0,5 s, mit 2 Kernen (p = 4), 1 GB RAM.

## Sicherheit

Im Januar 2016 wurde eine Kryptoanalyse der Variante Argon2i veröffentlicht, die eine Ausführung mit weniger Arbeitsspeicher (Faktor 2,72 – 4) bei gleicher Rechenzeit erlaubt. Mit der 2017 veröffentlichten Version 1.3 wurde auf diese Analyse reagiert.
Im August 2016 erweiterten Joël Alwen and Jeremiah Blocki ihren zuvor veröffentlichten Angriff auf die neue Version von Argon2i. Sie konnten zeigen, dass durch ihren Angriff unter bestimmten Annahmen über zukünftig verfügbare Hardware die Energiekomplexität von Argon2i ohne Parallelismus (p=1) drastisch gesenkt werden könnte.
Auf die Variante Argon2d sowie auf die hybride Form Argon2id wurde bisher kein praktizierbarer Angriff veröffentlicht.

## Lizenz

Argon2 steht unter der CC0 zur Verfügung, mithin also unter Public Domain (so auch explizit aufgeführt auf der PHC-Site, Stand 12. Februar 2020, siehe Links).