Argon2
Argon2 — функція формування ключа, розроблена Алексом Бірюковим (Шаблон:Lang-en), Даніелем Діну (Шаблон:Lang-en) і Дмитром Ховратовичем (Шаблон:Lang-en) з Університету Люксембургу в 2015 роціШаблон:Sfn.
Це сучасний простий алгоритм, спрямований на високу швидкість заповнення пам'яті та ефективне використання декількох обчислювальних блоківШаблон:Sfn. Алгоритм випущений під ліцензією Creative Commons.
Історія
У 2013 році був оголошений конкурс Шаблон:Iw для створення нової функції хешування паролів. До нового алгоритму висувалися вимоги щодо обсягу використовуваної пам'яті, кількості проходів по блоках пам'яті і по стійкості до криптоаналізу.
У 2015 році Argon2 був оголошений переможцем конкурсуШаблон:Sfn. З того часу алгоритм зазнав 4 серйозні зміни. Виправлені частина описів алгоритмів генерації деяких блоків і помилки, додані рекомендовані параметриШаблон:SfnШаблон:Sfn.
Вхідні дані
Argon2 використовує основні та додаткові параметри для хешування:
Основні:
- Повідомлення (пароль) , довжиною від до .
- Сіль S, довжиною від до .
Додаткові:
- Ступінь паралелізму будь-яке ціле число від до — кількість потоків, на яку можна розпаралелити алгоритм.
- Довжина тегу , довжиною від до .
- Об'єм пам'яті , ціле число кілобайтів від до .
- Кількість ітерацій Шаблон:Sfn
Версії алгоритму
Існують дві версії алгоритму:
- Argon2d — підходить для захисту цифрової валюти та інформаційних систем, що не піддаються атакам по стороннім каналам.
- Argon2i — забезпечує високий захист від trade-off атак, але працює повільніше версії d через кілька проходів по пам'ятіШаблон:Sfn.
Опис

Argon2 працює за наступним принципом:
- Проводиться хешування пароля з використанням хеш-функції Blake2b.
- Результат хешування записується в блоки пам'яті.
- Блоки пам'яті перетворюються з використанням функції стиснення .
- В результаті роботи алгоритму генерується ключ (Шаблон:Lang-en).
Заповнення блоків пам'яті
, ,де
— функція індексування, — масив пам'яті, — функція стиснення, — повідомлення(пароль), — хеш-функція Blake2b.
Функції індексування залежить від версії алгоритму Argon2:
- Argon2d — залежить від попереднього блоку
- Argon2i — значення, яке визначається генератором випадкових чисел.
У разі послідовного режиму роботи функція стиснення застосовується раз. Для версії Argon2d на -му кроці на вхід функції подається блок з індексом , обумовлений попереднім блоком м. Для версії Argon2i береться значення генератора випадкових чисел ( у режимі лічильника).
У разі паралельного режиму (алгоритм розпаралелюється на тредів) дані розподіляться по блокам матриці , де перші блоки — результат хешування вхідних даних, а наступні задаються функцією стиснення за попередніми блоками і опорного блоку :
, де — кількість блоків пам'яті розміром 1024 байта, — хеш-функція, що приймає на вхід 32-бітове представлення вхідних параметрів на виході якої — 64-бітове значення, — хеш-функція змінної довжини від , — обсяг пам'яті, — кількість ітерацій.
В результаті:
Знаходження опорного блоку
- Argon2d: вибираються перші 32 біта і наступні 32 біта з блоків
- Argon2i: , где - номер ітерації, — номер линії, — визначає версію (в даному випадку одиниця)
Далі визначається індекс рядки, звідки береться блок. При за поточний номер лінії приймається значення . Потім визначається набір індексів по 2 правилами:
- Якщо збігається з номером поточного рядка, то в набір індексів додаються не всі записані раніше блоки без
- Якщо не збігається, то беруться блоки з усіх сегментів лінії і останніх частин.
У підсумку, обчислюється номер блоку з , який приймається за опорний:
Функція H'

Blake2b — 64 бітна версія функції BLAKE, тому будується наступним чином:
При великих вихідне значення функції будується за першим 32 бітам блоків — і останнього блоку :
Функція стиснення G
Заснована на функції стиснення Blake2b. На вхід отримує два 8192-бітних блоки і виробляє 1024-бітний блок. Спочатку два блоки складаються (), потім матриця обробляється функцією порядково (), потім отримана матриця обробляється за стовпцями (), і на виході G видається Шаблон:Sfn.
Криптоаналіз
Захист від колізій: Сама функція Blake2b вважається криптографічно безпечною. Також, посилаючись на правила індексування, автори алгоритму довели відсутність колізій всередині блоків даних і низьку ймовірність їхньої появи при застосуванні функції стиснення.
Атака знаходження прообразу: нехай зловмисник підібрав таке, що , тоді для продовження даної атаки він повинен підібрати прообраз : , що неможливо. Таке ж міркування підходить для атаки знаходження другого прообразу.
Атаки по часу: якщо користувачеві необхідно адаптуватися до атаки по часу, то слід використовувати версію Argon2i, так як вона використовує незалежну пам'ятьШаблон:Sfn.
Атаки
Memory optimization attack
Ден Бонех, Генрі Корріган-Гіббс та Стюарт Шехтер у своїй роботі показали уразливість Argon2i версії 1.2. Для однопрохідної версії їх атака знижувала витрати пам'яті в 4 рази без уповільнення використання. Для багатопрохідної версії — в 2,72 рази. Пізніше, у версії 1.3 операція перезапису була замінена на XORШаблон:Sfn.
AB16
Джоел Елвен та Джеремая Блокі у своїх роботах довели, що їх алгоритм атаки AB16 ефективний не тільки для Argon2i-A (з першої версії специфікації), але і для Argon2i-B (з останньої версії 1.3). Вони показали, що атака на Argon2 при , використовуючи 1 гігабайт оперативної пам'яті, знижує час обчислення вдвічі.
Для ефективного захисту необхідно поставити більше 10 проходів. Але при рекомендованому підході вибору параметрів алгоритму на практиці часто може вибиратися всього лише 1 прохід. Розробники Argon2 стверджують, що, застосовуючи атаку AB16 на Argon2i-B при , час зменшується не більше ніж в 2 рази аж до використання 32 GB пам'яті і рекомендують використовувати число проходів, що перевищує значення двійкового логарифма від використовуваної пам'ятіШаблон:Sfn.
The ranking tradeoff attack
Ця атака є однією з найбільш ефективних для Argon2d. Вона знижує час обробки в 1,33 рази. Для Argon2i при коефіцієнт дорівнює 3 Шаблон:Sfn.
Garbage Collector Attacks
Основною умовою для представленої атаки є доступ зловмисника до внутрішньої пам'яті цільової машини або після припинення схеми хешування, або в якийсь момент, коли сам пароль ще присутній в пам'яті. Завдяки перезапису інформації з допомогою функції , Argon2i і Argon2d стійкі до даних атакШаблон:Sfn.
Застосування
Argon2 оптимізований під x86-архітектуру і може бути реалізований на Linux, OS X, Windows.
Argon2d призначений для систем, де зловмисник не отримує регулярного доступу до системної пам'яті або процесора. Наприклад, для backend-серверів і криптомайнерів. При використанні одного ядра на 2-Ghz CPU і 250 Mb оперативної пам'яті з Argon2d (p=2) криптомайнінг займає 0,1 сек., а при застосуванні 4 ядер і 4 Gb пам'яті (p=8) автентифікація на backend сервері проходить за 0.5 сек.
Argon2i більше підходить для frontend-серверів і шифрування жорсткого диска. Формування ключа для шифрування на 2-Ghz CPU, використовуючи 2 ядра і 6 Гб оперативної пам'яті, з Argon2i (p=4) займає 3 сек., у той час як аутентифікація на frontend-сервері, задіявши 2 ядра і 1 Gb пам'яті з Argon2i (p=4), займає 0,5 сек.Шаблон:Sfn