Argon2 — функція формування ключа, розроблена Алексом Бірюковим (), Даніелем Діну () і Дмитром Ховратовичем () з Університету Люксембургу в 2015 році.

Це сучасний простий алгоритм, спрямований на високу швидкість заповнення пам'яті та ефективне використання декількох обчислювальних блоків. Алгоритм випущений під ліцензією Creative Commons.

Історія У 2013 році був оголошений конкурс для створення нової функції хешування паролів. До нового алгоритму висувалися вимоги щодо обсягу використовуваної пам'яті, кількості проходів по блоках пам'яті і по стійкості до криптоаналізу.

У 2015 році Argon2 був оголошений переможцем конкурсу. З того часу алгоритм зазнав 4 серйозні зміни. Виправлені частина описів алгоритмів генерації деяких блоків і помилки, додані рекомендовані параметри.

Вхідні дані Argon2 використовує основні та додаткові параметри для хешування:

Основні:

Повідомлення (пароль) , довжиною від до . Сіль S, довжиною від до .

Додаткові:

Ступінь паралелізму будь-яке ціле число від до — кількість потоків, на яку можна розпаралелити алгоритм. Довжина тегу , довжиною від до . Об'єм пам'яті , ціле число кілобайтів від  до . Кількість ітерацій

Версії алгоритму Існують дві версії алгоритму:

Argon2d — підходить для захисту цифрової валюти та інформаційних систем, що не піддаються атакам по стороннім каналам. Argon2i — забезпечує високий захист від trade-off атак, але працює повільніше версії d через кілька проходів по пам'яті.

Опис

Argon2 працює за наступним принципом:

Проводиться хешування пароля з використанням хеш-функції Blake2b. Результат хешування записується в блоки пам'яті. Блоки пам'яті перетворюються з використанням функції стиснення . В результаті роботи алгоритму генерується ключ ().

Заповнення блоків пам'яті

, ,де

— функція індексування, — масив пам'яті, — функція стиснення, — повідомлення(пароль), — хеш-функція Blake2b.

Функції індексування залежить від версії алгоритму Argon2:

Argon2d — залежить від попереднього блоку

Argon2i — значення, яке визначається генератором випадкових чисел.

У разі послідовного режиму роботи функція стиснення застосовується раз. Для версії Argon2d на -му кроці на вхід функції подається блок з індексом , обумовлений попереднім блоком м. Для версії Argon2i береться значення генератора випадкових чисел ( у режимі лічильника).

У разі паралельного режиму (алгоритм розпаралелюється на тредів) дані розподіляться по блокам матриці , де перші блоки — результат хешування вхідних даних, а наступні задаються функцією стиснення за попередніми блоками і опорного блоку :

, де — кількість блоків пам'яті розміром 1024 байта, — хеш-функція, що приймає на вхід 32-бітове представлення вхідних параметрів на виході якої — 64-бітове значення, — хеш-функція змінної довжини від , — обсяг пам'яті, — кількість ітерацій.

В результаті:

Знаходження опорного блоку

Argon2d: вибираються перші 32 біта і наступні 32 біта з блоків Argon2i: , где - номер ітерації,  — номер линії, — визначає версію (в даному випадку одиниця)

Далі визначається індекс рядки, звідки береться блок. При за поточний номер лінії приймається значення . Потім визначається набір індексів по 2 правилами:

Якщо збігається з номером поточного рядка, то в набір індексів додаються не всі записані раніше блоки без Якщо не збігається, то беруться блоки з усіх сегментів лінії і останніх частин.

У підсумку, обчислюється номер блоку з , який приймається за опорний:

Функція H'

Blake2b — 64 бітна версія функції BLAKE, тому будується наступним чином:

При великих вихідне значення функції будується за першим 32 бітам блоків — і останнього блоку :

Функція стиснення G Заснована на функції стиснення Blake2b. На вхід отримує два 8192-бітних блоки і виробляє 1024-бітний блок. Спочатку два блоки складаються (), потім матриця обробляється функцією порядково (), потім отримана матриця обробляється за стовпцями (), і на виході G видається .

Криптоаналіз Захист від колізій: Сама функція Blake2b вважається криптографічно безпечною. Також, посилаючись на правила індексування, автори алгоритму довели відсутність колізій всередині блоків даних і низьку ймовірність їхньої появи при застосуванні функції стиснення.

Атака знаходження прообразу: нехай зловмисник підібрав таке, що , тоді для продовження даної атаки він повинен підібрати прообраз : , що неможливо. Таке ж міркування підходить для атаки знаходження другого прообразу.

Атаки по часу: якщо користувачеві необхідно адаптуватися до атаки по часу, то слід використовувати версію Argon2i, так як вона використовує незалежну пам'ять.

Атаки

Memory optimization attack Ден Бонех, Генрі Корріган-Гіббс та Стюарт Шехтер у своїй роботі показали уразливість Argon2i версії 1.2. Для однопрохідної версії їх атака знижувала витрати пам'яті в 4 рази без уповільнення використання. Для багатопрохідної версії — в 2,72 рази. Пізніше, у версії 1.3 операція перезапису була замінена на XOR.

AB16 Джоел Елвен та Джеремая Блокі у своїх роботах довели, що їх алгоритм атаки AB16 ефективний не тільки для Argon2i-A (з першої версії специфікації), але і для Argon2i-B (з останньої версії 1.3). Вони показали, що атака на Argon2 при , використовуючи 1 гігабайт оперативної пам'яті, знижує час обчислення вдвічі.

Для ефективного захисту необхідно поставити більше 10 проходів. Але при рекомендованому підході вибору параметрів алгоритму на практиці часто може вибиратися всього лише 1 прохід. Розробники Argon2 стверджують, що, застосовуючи атаку AB16 на Argon2i-B при , час зменшується не більше ніж в 2 рази аж до використання 32 GB пам'яті і рекомендують використовувати число проходів, що перевищує значення двійкового логарифма від використовуваної пам'яті.

The ranking tradeoff attack Ця атака є однією з найбільш ефективних для Argon2d. Вона знижує час обробки в 1,33 рази. Для Argon2i при коефіцієнт дорівнює 3 .

Garbage Collector Attacks Основною умовою для представленої атаки є доступ зловмисника до внутрішньої пам'яті цільової машини або після припинення схеми хешування, або в якийсь момент, коли сам пароль ще присутній в пам'яті. Завдяки перезапису інформації з допомогою функції , Argon2i і Argon2d стійкі до даних атак.

Застосування 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 сек.

Примітки

Література

Посилання

https://github.com/P-H-C/phc-winner-argon2 https://www.cryptolux.org/index.php/Argon2 https://github.com/khovratovich/Argon2 (рання версія функції)