В криптографии функция вывода ключа ( KDF ) — это криптографический алгоритм, который выводит один или несколько секретных ключей из секретного значения, такого как главный ключ, пароль или парольная фраза , с помощью псевдослучайной функции (которая обычно использует криптографическую хэш-функцию или блочный шифр ). [1] [2] [3] KDF могут использоваться для растяжения ключей до более длинных ключей или для получения ключей требуемого формата, например, преобразования группового элемента, который является результатом обмена ключами Диффи-Хеллмана , в симметричный ключ для использования с AES . Ключевые криптографические хэш-функции являются популярными примерами псевдослучайных функций, используемых для вывода ключей. [4]
Первая [ требуется цитата ] преднамеренно медленная (растягивание ключа) функция вывода ключа на основе пароля называлась « crypt » (или «crypt(3)» по названию ее страницы руководства ) и была изобретена Робертом Моррисом в 1978 году. Она шифровала константу (ноль), используя первые 8 символов пароля пользователя в качестве ключа, выполняя 25 итераций модифицированного алгоритма шифрования DES (в котором 12-битное число, считываемое с часов компьютера в реальном времени, используется для возмущения вычислений). Полученное 64-битное число кодируется как 11 печатных символов, а затем сохраняется в файле паролей Unix . [5] Хотя это было большим достижением в то время, увеличение скорости процессоров со времен PDP-11 сделало атаки методом подбора на crypt осуществимыми, а достижения в области хранения сделали 12-битную соль неадекватной. Конструкция функции crypt также ограничивает пароль пользователя 8 символами, что ограничивает пространство ключей и делает невозможным создание надежных парольных фраз . [ необходима ссылка ]
Хотя высокая пропускная способность является желательным свойством в хэш-функциях общего назначения, обратное справедливо для приложений безопасности паролей, в которых защита от взлома методом перебора является основной проблемой. Растущее использование массивно-параллельного оборудования, такого как GPU, FPGA и даже ASIC для взлома методом перебора, сделало выбор подходящего алгоритма еще более важным, поскольку хороший алгоритм должен не только обеспечивать определенную вычислительную стоимость не только на CPU, но и противостоять преимуществам стоимости/производительности современных массивно-параллельных платформ для таких задач. Различные алгоритмы были разработаны специально для этой цели, включая bcrypt , scrypt и, совсем недавно, Lyra2 и Argon2 (последний стал победителем конкурса Password Hashing Competition ). Масштабная утечка данных Ashley Madison , в ходе которой злоумышленники украли около 36 миллионов хэшей паролей, проиллюстрировала важность выбора алгоритма для защиты паролей. Хотя для защиты хэшей использовался bcrypt (что делало крупномасштабный взлом методом прямого перебора дорогим и трудоемким), значительная часть учетных записей в скомпрометированных данных также содержала хэш пароля, основанный на быстром алгоритме общего назначения MD5 , что позволило взломать более 11 миллионов паролей за считанные недели. [6]
В июне 2017 года Национальный институт стандартов и технологий США (NIST) выпустил новую редакцию своих руководящих принципов цифровой аутентификации, NIST SP 800-63B-3, [7] : 5.1.1.2, в которой говорится, что: «Проверители ДОЛЖНЫ хранить запомненные секреты [т. е. пароли] в форме, устойчивой к офлайн-атакам. Запомненные секреты ДОЛЖНЫ быть засолены и хэшированы с использованием подходящей односторонней функции вывода ключа. Функции вывода ключа принимают пароль, соль и фактор стоимости в качестве входных данных, а затем генерируют хэш пароля. Их цель — сделать каждую попытку подбора пароля злоумышленником, получившим файл хеша пароля, дорогостоящей и, следовательно, стоимость атаки подбора высокой или непомерной».
Современные функции деривации ключей на основе паролей, такие как PBKDF2 , [2] основаны на признанном криптографическом хэше, таком как SHA-2 , используют больше соли (не менее 64 бит и выбираются случайным образом) и большое количество итераций. NIST рекомендует минимальное количество итераций 10 000. [7] : 5.1.1.2 «Для особенно важных ключей или для очень мощных систем или систем, где производительность, воспринимаемая пользователем, не является критической, может быть подходящим количество итераций 10 000 000». [8] : 5.2
Первоначальное использование KDF — это деривация ключей, генерация ключей из секретных паролей или парольных фраз. Вариации на эту тему включают:
Функции вывода ключей также используются в приложениях для вывода ключей из секретных паролей или кодовых фраз, которые обычно не обладают желаемыми свойствами для непосредственного использования в качестве криптографических ключей. В таких приложениях обычно рекомендуется, чтобы функция вывода ключей была намеренно сделана медленной, чтобы помешать атаке методом подбора или атаке по словарю на входное значение пароля или кодовой фразы.
Такое использование может быть выражено как DK = KDF(ключ, соль, итерации) , где DK — производный ключ, KDF — функция вывода ключа , ключ — исходный ключ или пароль, соль — случайное число, которое действует как криптографическая соль , а итерации относятся к числу итераций подфункции. Производный ключ используется вместо исходного ключа или пароля в качестве ключа к системе. Значения соли и числа итераций (если оно не фиксировано) хранятся вместе с хешированным паролем или отправляются в виде открытого текста (незашифрованного) с зашифрованным сообщением. [10]
Сложность атаки методом подбора увеличивается с числом итераций. Практическим ограничением числа итераций является нежелание пользователей терпеть ощутимую задержку при входе в компьютер или просмотре расшифрованного сообщения. Использование соли не позволяет злоумышленникам предварительно вычислять словарь производных ключей. [10]
Альтернативный подход, называемый укреплением ключа , расширяет ключ случайной солью, но затем (в отличие от растяжения ключа) надежно удаляет соль. [11] Это заставляет как злоумышленника, так и законных пользователей выполнять поиск значения соли методом перебора. [12] Хотя статья, в которой было представлено растяжение ключа [13], ссылалась на эту более раннюю технику и намеренно выбрала другое название, термин «укрепление ключа» теперь часто (возможно, неправильно) используется для обозначения растяжения ключа.
Несмотря на свое первоначальное использование для получения ключей, KDF, возможно, более известны по их использованию в хэшировании паролей ( проверка пароля путем сравнения хэшей ), как это используется файлом passwd или файлом теневых паролей . Хэш-функции паролей должны быть относительно дорогими для вычисления в случае атак методом подбора, и растяжение ключа KDF, как оказалось, обеспечивает эту характеристику. [ необходима цитата ] Несекретные параметры называются « солью » в этом контексте.
В 2013 году был объявлен конкурс Password Hashing Competition с целью выбора нового стандартного алгоритма для хеширования паролей. 20 июля 2015 года конкурс завершился, и Argon2 был объявлен окончательным победителем. Четыре других алгоритма получили особое признание: Catena, Lyra2, Makwa и yescrypt. [14]
По состоянию на май 2023 года OWASP рекомендует следующие KDF для хеширования паролей, перечисленные в порядке приоритета: [15]