Argon2
Argon2 — победитель Password Hashing Competition (2015). Стандарт для хранения паролей. Устойчив к GPU/ASIC-брутфорсу через memory-hardness.
Варианты
- Argon2d — быстрее, но уязвим к side-channel. Для криптомайнинга/PoW.
- Argon2i — защищён от side-channel, медленнее. Для паролей на серверах.
- Argon2id — гибрид. Рекомендация OWASP по умолчанию.
Параметры
| Параметр | Что | OWASP 2025 |
|---|---|---|
m (memory) | RAM в KiB | ≥ 47104 (46 MiB) |
t (iterations) | кол-во проходов | ≥ 1 |
p (parallelism) | потоков | 1 |
Формат PHC-строки
$argon2id$v=19$m=65536,t=3,p=4$c29tZXNhbHQ$hash...
$argon2id$— вариантv=19— версия (0x13)m,t,p— параметры- соль (base64)
- хеш (base64)
Как работает (упрощённо)
- Строится матрица блоков в памяти (m KiB).
- Каждый блок зависит от предыдущих псевдослучайных блоков.
- t проходов по всей матрице.
- Финальный блок = хеш.
Для брутфорса нужна вся память — на GPU это дорого (мало памяти на ядро).
Argon2 vs альтернативы
| Argon2id | scrypt | bcrypt | PBKDF2 | |
|---|---|---|---|---|
| Memory-hard | да | да | нет | нет |
| Настройка | m, t, p | N, r, p | cost | iterations |
| OWASP реко | 1-й | 2-й | 3-й | 4-й |
| Год | 2015 | 2009 | 1999 | 2000 |
Использование
# Python
from argon2 import PasswordHasher
ph = PasswordHasher()
h = ph.hash("password")
ph.verify(h, "password")
# CLI (argon2 из libargon2)
echo -n "password" | argon2 somesalt -id -t 3 -m 16 -p 4