Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Argon2 - это ключевая деривационная функция, которая была выбрана победителем конкурса хеширования паролей в июле 2015 года. [1] [2] Она была разработана Алексом Бирюковым , Даниэлем Дину и Дмитрием Ховратовичем из Университета Люксембурга . [3] Эталонная реализация Argon2 выпущена под лицензией Creative Commons CC0 (т. Е. Общественное достояние ) или Apache License 2.0 и предоставляет три связанные версии:

  • Argon2d максимизирует устойчивость к атакам взлома графического процессора. Он обращается к массиву памяти в порядке, зависящем от пароля, что снижает вероятность атак компромисса времени и памяти (TMTO), но вводит возможные атаки по побочным каналам .
  • Argon2i оптимизирован для защиты от атак по побочным каналам. Он обращается к массиву памяти в независимом от пароля порядке.
  • Argon2id - гибридная версия. Он следует подходу Argon2i для первого полупрохода по памяти и подходу Argon2d для последующих проходов. Интернет-проект [4] рекомендует использовать Argon2id, за исключением случаев, когда есть причины предпочесть один из двух других режимов.

Все три режима позволяют определять по трем параметрам, которые контролируют:

  • время исполнения
  • требуется память
  • степень параллелизма

Криптоанализ [ править ]

Хотя публичного криптоанализа, применимого к Argon2d, не существует, существует две опубликованных атаки на функцию Argon2i. Первая атака применима только к старой версии Argon2i, а вторая была расширена до последней версии (1.3) [5]

Первая атака показывает, что можно вычислить однопроходную функцию Argon2i, используя от четверти до пятой части желаемого пространства без временных затрат, и вычислить многопроходную функцию Argon2i, используя только пространство N / e < N / 2,71 с без штрафа по времени. [6] По словам авторов Argon2, этот вектор атаки был исправлен в версии 1.3. [7]

Вторая атака показывает, что Argon2i может быть вычислен с помощью алгоритма, который имеет сложность O ( n 7/4 log ( n )) для всех вариантов выбора параметров σ (стоимость пространства), τ (временные затраты) и количества потоков, таких что n = στ . [8] Авторы Argon2 утверждают, что эта атака неэффективна, если Argon2i используется с тремя или более проходами. [7] Однако Джоэль Алвен и Иеремия Блоки улучшили атаку и показали, что для того, чтобы атака не удалась, Argon2i 1.3 требует более 10 проходов по памяти. [5]

Алгоритм [ править ]

Функция Argon 2  Входы: пароль ( P ): Bytes (0..2 32 -1)  Пароль (или сообщение) , чтобы быть хешированной соль ( S ): Bytes (8..2 32 -1)  Соль (16 байт рекомендуется для хеширования паролей ) параллельность ( р ): Количество (1..2 24 -1)  Степень параллельности (т.е. число потоков) tagLength ( Т ): Количество (4..2 32 -1)  Желаемое количество байт возвращается memorySizeKB ( м ): Число (8p..2 32 -1) Объем памяти (в kibibytes ) использовать итерации ( т ): Количество (1..2 32 -1) Количество итераций , чтобы выполнить версию ( v ): Количество (0x13) Текущая версия 0x13 (19 десятичных) ключ ( К ): Bytes (0..2 32 -1) Дополнительный ключ (Опечатки: PDF говорит 0..32 байт, RFC говорит 0..2 32 байта) associatedData ( X ): Б (0..2 32 -1) Дополнительный произвольные дополнительные данные hashType ( y ): Number (0 = Argon2d, 1 = Argon2i, 2 = Argon2id)   Вывод: tag: Bytes (tagLength) Полученные в результате сгенерированные байты, длина tagLength байтов   Сгенерировать начальный 64-байтовый блок H 0 . Все входные параметры объединяются и вводятся как источник дополнительной энтропии. Исправление: RFC говорит, что H 0 является 64-битным; PDF говорит, что H 0 составляет 64 байта. Исправление: RFC говорит, что хеш - это H ^, в PDF указано, что это (но не документирует, что такое). На самом деле это Blake2b. К элементам переменной длины добавляется их длина в виде 32-битных целых чисел с прямым порядком байтов. буфер ← параллелизм ∥ tagLength ∥ memorySizeKB ∥ итерации ∥ версия ∥ hashType ∥ Длина (пароль) ∥ Пароль ∥ Длина (соль) ∥ соль ∥ Длина (ключ) ∥ ключ ∥ Длина (связанные данные) ∥ связанные данные H 0 ← Blake2b (buffer, 64) // размер хэша Blake2b по умолчанию - 64 байта Вычислить количество блоков размером 1 КБ, округлив memorySizeKB в меньшую сторону до ближайшего значения, кратного 4 * кибибайтам параллелизма. blockCount ← Floor (memorySizeKB, 4 * параллелизм) Выделить двумерный массив из блоков размером 1 КиБ (строки параллелизма x столбцы columnCount ) columnCount ← blockCount / parallelism; // В RFC columnCount обозначается как q Вычислить первый и второй блок (то есть нулевой и один столбцы) каждой дорожки (то есть строки)  для i ← от 0 до parallelism-1 do  для каждой строки B i [0] ← Hash (H 0 ∥ 0 ∥ i, 1024) / / Создать 1024-байтовый дайджест B i [1] ← Hash (H 0 ∥ 1 ∥ i, 1024) // Создать 1024-байтовый дайджест Вычислить оставшиеся столбцы каждой полосы  для i ← 0 до parallelism-1 do  // для каждой строки  для j ← 2 до columnCount-1 do  // для каждого последующего столбца  // индексы i 'и j' зависят от того, является ли это Argon2i, Argon2d, или Argon2id (см. раздел 3.4) i ′, j ′ ← GetBlockIndexes (i, j) // функция GetBlockIndexes не определена B i [j] = G (B i [j-1], B i ′ [j ′] ) // хэш-функция G не определена Далее проходит, когда итераций> 1  для nIteration ← 2 к итерациям do  для i ← 0 до parallelism-1 do  для каждой строки  для j ← 0 до columnCount-1 do  // для каждого последующего столбца  // индексы i 'и j' зависят, если это Argon2i, Argon2d или Argon2id (см. раздел 3.4) i ′, j ′ ← GetBlockIndexes (i, j) если j == 0, то B i [0] = B i [0] xor G (B i [columnCount-1], B i ′ [j ′]) иначе B i [j] = B i [j] xor G (B i [j-1], B i ′ [j ′]) Вычислить последний блок C как XOR последнего столбца каждой строки C ← B 0 [columnCount-1] для i ← 1 to parallelism-1 do C ← C xor B i [columnCount-1] Вычислить выходной тег,  возвращающий хэш (C, tagLength)

Хеш-функция переменной длины [ править ]

Argon2 использует хеш-функцию, способную создавать дайджесты длиной до 2 32 байта. Эта хеш-функция внутренне построена на Blake2 .

Функция хэширования (сообщение, digestSize)  Входы: сообщение: Б (0..2 32 -1)  Сообщение будет хэшированного digestSize: Integer (1..2 32 )  Желаемое количество байтов , которые должны быть возвращены  Выход: дайджест: Bytes (digestSize) Результирующие сгенерированные байты, digestSize bytes long   Hash - это хеш-функция переменной длины, построенная с использованием Blake2b, способная генерировать переваривает до 2 32 байтов. Если запрошенный размер дайджеста составляет 64 байта или меньше, мы используем Blake2b напрямую  if (digestSize <= 64), затем  возвращаем Blake2b (digestSize ∥ message, digestSize) // объединяем 32-битный little endian digestSize с байтами сообщения Для желаемых хэшей размером более 64 байтов (например, 1024 байта для блоков Argon2), мы используем Blake2b для генерации вдвое большего количества необходимых 64-байтовых блоков, а затем использовать только 32 байта из каждого блока Подсчитайте количество целых блоков (зная, что мы будем использовать только 32 байта из каждого) r ← Ceil (digestSize / 32) -1; Сгенерируйте r целых блоков.  Начальный блок генерируется из сообщения V 1 ← Blake2b (digestSize ∥ message, 64); Последующие блоки генерируются из предыдущих блоков  от i ← 2 до r do V i ← Blake2b (V i-1 , 64) Генерация последнего (возможно частичного) блока partialBytesNeeded ← digestSize - 32 * r; V r + 1 ← Blake2b (V r , partialBytesNeeded) Объедините первые 32 байта каждого блока V i (за исключением, возможно, частичного последнего блока, который мы берем целиком).  Пусть A i представляет нижние 32 байта блока V i,  возвращает A 1 ∥ A 2 ∥ ... ∥ А р ∥ В г + 1

Ссылки [ править ]

  1. ^ "Конкурс хеширования паролей"
  2. ^ Jos Wetzels (2016-02-08). «Open Sesame: соревнование по хешированию паролей и Argon2» (PDF) . arXiv : 1602.03097 [ cs.CR ].CS1 maint: использует параметр авторов ( ссылка )
  3. ^ Argon2: функция увеличения памяти для хеширования паролей и других приложений , Алекс Бирюков и др., 1 октября 2015 г.
  4. ^ https://datatracker.ietf.org/doc/draft-irtf-cfrg-argon2/ Хэш-код пароля Argon2 с жесткой памятью и функция доказательства работы, draft-irtf-cfrg-argon2-03, по состоянию на 16 августа, 2017 г.
  5. ^ a b Джоэль Алвен, Иеремия Блоки (2016-08-05). «На пути к практическим атакам на Argon2i и хэширование воздушных шаров» (PDF) . Cite journal requires |journal= (help)CS1 maint: uses authors parameter (link)
  6. ^ Генри Корриган-Гиббс, Дэн Боне, Стюарт Шехтер (2016-01-14). «Воздушное хеширование: функции хеширования с ограниченным пространством и шаблонами доступа, не зависящими от данных» (PDF) . Cite journal requires |journal= (help)CS1 maint: uses authors parameter (link)
  7. ^ a b "[Cfrg] Argon2 v.1.3" . www.ietf.org . Проверено 30 октября 2016 .
  8. ^ Joel Alwen, Иеремия Blocki (2016-02-19). «Эффективное вычисление не зависящих от данных функций, связанных с памятью» (PDF) . Cite journal requires |journal= (help)CS1 maint: uses authors parameter (link)

Внешние ссылки [ править ]

  • Репозиторий исходного кода Argon2 на Github
  • Спецификация Argon2
  • Конкурс по хешированию паролей
  • Uni.Lu Argon2 Страница
  • Воздушное хеширование: функция с ограниченным объемом памяти, обеспечивающая надежную защиту от последовательных атак