Аргон2 - Argon2
Эта статья слишком полагается на Рекомендации к основные источники.Январь 2016) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
Аргон2 это ключевая деривационная функция который был выбран победителем Конкурс по хешированию паролей в июле 2015 года.[1][2] Он был разработан Алексей Бирюков, Даниэль Дину и Дмитрий Ховратович от Люксембургский университет.[3] Эталонная реализация Argon2 выпущена под лицензией Creative Commons. CC0 лицензия (т.е. всеобщее достояние ) или Лицензия Apache 2.0, и предоставляет три связанных версии:
- Argon2d максимизирует устойчивость к атакам взлома GPU. Он обращается к массиву памяти в зависимости от пароля, что снижает вероятность компромисс между временем и памятью (TMTO) атак, но вводит возможные атаки по побочным каналам.
- Argon2i оптимизирован для защиты от атак по побочным каналам. Он обращается к массиву памяти в независимом от пароля порядке.
- Argon2id - гибридная версия. Он следует подходу Argon2i для первого полупрохода по памяти и подходу Argon2d для последующих проходов. Интернет-проект[4] рекомендует использовать Argon2id, кроме случаев, когда есть причины предпочесть один из двух других режимов.
Все три режима позволяют задавать параметры по трем параметрам, которые контролируют:
- время исполнения
- требуется память
- степень параллелизма
Криптоанализ
Хотя публичного криптоанализа, применимого к Argon2d, не существует, есть две опубликованные атаки на функцию Argon2i. Первая атака применима только к старой версии Argon2i, а вторая была расширена до последней версии (1.3).[5]
Первая атака показывает, что можно вычислить однопроходную функцию Argon2i, используя от четверти до пятой части желаемого пространства, без потери времени, и вычислить многопроходную функцию Argon2i, используя только N/е < N/2.71 пробел без штрафа по времени.[6] По словам авторов Argon2, этот вектор атаки был исправлен в версии 1.3.[7]
Вторая атака показывает, что Argon2i можно вычислить с помощью алгоритма со сложностью O (п7/4 бревно(п)) для всех вариантов выбора параметров σ (стоимость помещения), τ (временные затраты) и количество потоков, такое что п=σ∗τ.[8] Авторы Argon2 утверждают, что эта атака неэффективна, если Argon2i используется с тремя или более проходами.[7] Однако Джоэль Алвен и Иеремия Блоки улучшили атаку и показали, что для того, чтобы атака не удалась, Argon2i 1.3 требует более 10 проходов по памяти.[5]
Алгоритм
Функция Аргон2 Входы: пароль (п): Байты (0..232-1) Пароль (или сообщение) для хеширования соль (S): Байты (8..232-1) Salt (рекомендуется 16 байт для хеширования паролей) параллелизм (п): Число (1..224-1) Степень параллелизма (т.е. количество потоков) tagLength (Т): Число (4..232-1) Желаемое количество возвращаемых байтов memorySizeKB (м): Число (8p..232-1) Объем памяти (в кибибайты ) использовать итерации (т): Число (1..232-1) Количество итераций для выполнения версия (v): Число (0x13) Текущая версия - 0x13 (19 в десятичной системе) ключ (K): Байты (0..232-1) Необязательный ключ (Опечатка: в PDF указано 0..32 байта, в RFC указано 0..232 байты) connectedData (Икс): Байты (0..232-1) Необязательные произвольные дополнительные данные hashType (у): Число (0 = Argon2d, 1 = Argon2i, 2 = Argon2id) Выход: тег: Байт (tagLength) Результирующие сгенерированные байты, tagLength bytes long Сгенерировать начальный 64-байтовый блок H0. Все входные параметры объединяются и вводятся как источник дополнительной энтропии. Исправление: RFC говорит H0 64-битный; PDF говорит H0 составляет 64 байта. Исправление: RFC говорит, что хеш - это H ^, в PDF указано, что это (но не документирует, что такое). На самом деле это Blake2b. К элементам переменной длины добавляется их длина в виде 32-битных целых чисел с прямым порядком байтов. буфер ← параллелизм ∥ tagLength ∥ memorySizeKB ∥ итерации ∥ версия ∥ hashType ∥ Длина (пароль) ∥ Пароль ∥ Длина (соль) ∥ соль ∥ Длина (ключ) ∥ ключ ∥ Длина (associatedData) ∥ associatedData H0 ← Blake2b (буфер, 64) // размер хэша Blake2b по умолчанию составляет 64 байта Вычислить количество блоков размером 1 КБ, округлив memorySizeKB до ближайшего значения, кратного 4 * параллелизму. кибибайты blockCount ← Floor (memorySizeKB, 4 * параллелизм) Выделить двумерный массив из блоков размером 1 КиБ (строки параллелизма x столбцы columnCount) columnCount ← blockCount / parallelism; // В RFC columnCount упоминается как q Вычислить первый и второй блок (то есть нулевой и один столбцы) каждой полосы (то есть строки) за я ← 0 к параллелизм-1 делать для каждой строки Bя[0] ← Хеш (H0 ∥ 0 ∥ i, 1024) // Создаем 1024-байтовый дайджест Bя[1] ← Хеш (H0 ∥ 1 ∥ я, 1024) // Создаем 1024-байтовый дайджест Вычислить оставшиеся столбцы каждой полосы за я ← 0 к параллелизм-1 делать // для каждой строки за j ← 2 к columnCount-1 делать // для каждого последующего столбца // индексы i 'и j' зависят от того, является ли это Argon2i, Argon2d или Argon2id (см. раздел 3.4) i ′, j ′ ← GetBlockIndexes (i, j) // функция GetBlockIndexes не определена Bя[j] = G (Bя[j-1], Bя'[j ′]) // хэш-функция G не определена Далее проходит, когда итераций> 1 за Итерация ← 2 к итерации делать за я ← 0 к параллелизм-1 делать для каждой строки за j ← 0 к columnCount-1 делать // для каждого последующего столбца // индексы i 'и j' зависят от того, является ли это Argon2i, Argon2d или Argon2id (см. раздел 3.4) i ′, j ′ ← GetBlockIndexes (i, j) если j == 0 тогда Bя[0] = Bя[0] xor G (Bя[columnCount-1], Bя'[j ′]) еще Bя[j] = Bя[j] xor G (Bя[j-1], Bя'[j ′]) Вычислить последний блок C как XOR последнего столбца каждой строки C ← B0[columnCount-1] за я ← 1 к параллелизм-1 делать C ← C xor Bя[columnCount-1] Вычислить выходной тег возвращаться Хэш (C, tagLength)
Хеш-функция переменной длины
Argon2 использует хеш-функцию, способную производить дайджесты до 232 длина в байтах. Эта хеш-функция внутренне построена на Blake2.
Функция Хеш (сообщение, размер дайджеста) Входы: сообщение: байты (0..232-1) Сообщение для хеширования digestSize: Целое число (1..232) Желаемое количество возвращаемых байтов Выход: дайджест: байты (digestSize) Полученные в результате сгенерированные байты, digestSize bytes long Хеш - хэш-функция переменной длины, построенная с использованием Blake2b, способная генерировать дайджесты до 232 байты. Если запрошенный размер дайджеста составляет 64 байта или меньше, мы используем Blake2b напрямую. если (digestSize <= 64) тогда возвращаться Blake2b (digestSize ∥ сообщение, digestSize) // объединение 32-битного little endian digestSize с байтами сообщения Для желаемых хэшей размером более 64 байтов (например, 1024 байта для блоков Argon2) мы используем Blake2b для генерации в два раза большего количества необходимых 64-байтовых блоков, а затем используем только 32 байта из каждого блока. Подсчитайте количество целых блоков (зная, что мы будем использовать только 32 байта из каждого) r ← Ceil (digestSize / 32) -1; Сгенерируйте r целых блоков. Первоначальный блок генерируется из сообщения V1 ← Blake2b (digestSize ∥ сообщение, 64); Последующие блоки создаются из предыдущих блоков. за я ← 2 к р делать Vя ← Blake2b (Vя-1, 64) Сгенерируйте последний (возможно, частичный) блок partialBytesNeeded ← digestSize - 32 * r; Vг + 1 ← Blake2b (Vр, partialBytesNeeded) Объедините первые 32 байта каждого блока Vя (кроме, возможно, частичного последнего блока, который мы берем целиком) Пусть Aя представляют младшие 32 байта блока Vя возвращаться А1 ∥ А2 ∥ ... ∥ Ар ∥ Vг + 1
Рекомендации
- ^ «Конкурс по хешированию паролей»
- ^ Йос Ветцельс (8 февраля 2016 г.). "Open Sesame: соревнование по хешированию паролей и Argon2" (PDF). arXiv:1602.03097.CS1 maint: использует параметр авторов (связь)
- ^ Argon2: функция жесткой памяти для хеширования паролей и других приложений, Алексей Бирюков и др., 1 октября 2015 г.
- ^ https://datatracker.ietf.org/doc/draft-irtf-cfrg-argon2/ Хеширование паролей Argon2 с жесткой памятью и функция доказательства работы, draft-irtf-cfrg-argon2-03, по состоянию на 16 августа 2017 г.
- ^ а б Джоэль Алвен, Иеремия Блоки (5 августа 2016 г.). «На пути к практическим атакам на Argon2i и хэширование шаров» (PDF). Цитировать журнал требует
| журнал =
(помощь)CS1 maint: использует параметр авторов (связь) - ^ Генри Корриган-Гиббс, Дэн Боне, Стюарт Шехтер (14 января 2016 г.). «Воздушное хеширование: функции хеширования с ограниченным пространством и шаблонами доступа, не зависящими от данных» (PDF). Цитировать журнал требует
| журнал =
(помощь)CS1 maint: использует параметр авторов (связь) - ^ а б "[Cfrg] Argon2 v.1.3". www.ietf.org. Получено 2016-10-30.
- ^ Джоэл Алвен, Иеремия Блоки (19 февраля 2016 г.). «Эффективное вычисление не зависящих от данных функций с жесткой памятью» (PDF). Цитировать журнал требует
| журнал =
(помощь)CS1 maint: использует параметр авторов (связь)