В криптографии деривация ключа функция (KDF ) - это криптографическая хеш-функция, которая извлекает один или несколько секретных ключей из секретного значения, такого как главный ключ, пароль или кодовую фразу с использованием псевдослучайной функции. KDF можно использовать для преобразования ключей в более длинные ключи или для получения ключей требуемого формата, например для преобразования элемента группы, который является результатом обмена ключами Диффи – Хеллмана, в симметричный ключ для использования с AES. Криптографические хеш-функции с ключами являются популярными примерами псевдослучайных функций, используемых для получения ключей.
Получение ключа функции также используются в приложениях для получения ключей из секретных паролей или парольных фраз, которые обычно не имеют желаемых свойств, которые можно использовать непосредственно в качестве криптографических ключей. В таких приложениях обычно рекомендуется сделать функцию получения ключа намеренно медленной, чтобы предотвратить атаку грубой силы или атаку по словарю на вводимое значение пароля или ключевой фразы.
Такое использование может быть выражено как DK = KDF (ключ, соль, итерации), где DK - производный ключ, KDF - производный ключ функция, key - исходный ключ или пароль., соль - это случайное число, которое действует как криптографическая соль, а итерации относятся к числу итераций подфункции. Производный ключ используется вместо исходного ключа или пароля в качестве ключа к системе. Значения соли и количества итераций (если оно не зафиксировано) сохраняются с хешированным паролем или отправляются в виде открытого текста (незашифрованный) с зашифрованным сообщением.
Сложность атака полным перебором увеличивается с количеством итераций. Практическим ограничением количества итераций является нежелание пользователей мириться с ощутимой задержкой при входе в компьютер или просмотре расшифрованного сообщения. Использование соли не позволяет злоумышленникам предварительно вычислить словарь производных ключей.
Альтернативный подход, называемый усиление ключа, расширяет ключ с помощью случайной соли, но затем (в отличие от растяжения ключа) надежно удаляет соль. Это вынуждает как злоумышленника, так и законных пользователей выполнить поиск солевого значения методом перебора. Хотя в статье, в которой описывалось растяжение клавиш, упоминалась эта более ранняя техника и было намеренно выбрано другое название, термин «усиление клавиш» теперь часто (возможно, неправильно) используется для обозначения растяжения клавиш.
Первая преднамеренно медленная (растягивающая ключ) функция получения ключа на основе пароля была названа «crypt » (или «crypt (3)» после его справочная страница ), и была изобретена Робертом Моррисом в 1978 году. Она шифровала константу (ноль), используя первые 8 символов пароля пользователя в качестве ключа, выполняя 25 итераций модифицированный алгоритм шифрования DES (в котором 12-битное число, считываемое из компьютерных часов реального времени, используется для нарушения вычислений). Полученное 64-битное число кодируется как 11 печатаемых символов и затем сохраняется в файле паролей Unix. Хотя в то время это было большим достижением, увеличение быстродействия процессоров после эпохи PDP-11 сделало возможными атаки грубой силы на крипту, а достижения в области хранения сделали 12-битную соль неадекватной. Дизайн функции crypt также ограничивает пароль пользователя до 8 символов, что ограничивает пространство ключей и делает невозможным использование сильных парольных фраз.
Современные функции получения ключей на основе пароля, такие как PBKDF2 (указанный в RFC 2898 ), используйте криптографический хэш, такой как SHA-2, больше соли (например, 64 бита и больше) и большое количество итераций (часто десятки или сотни тысяч).
NIST требует не менее 128 бит случайной соли и одобренной NIST криптографической функции, такой как серия SHA или AES (MD5 не одобрен). Хотя высокая пропускная способность является желательным свойством для хэш-функций общего назначения, обратное верно для приложений защиты паролей, в которых защита от взлома грубой силой является основной задачей. Растущее использование оборудования с массовым параллелизмом, такого как графические процессоры, FPGA и даже ASIC для взлома методом грубой силы, сделало выбор подходящих алгоритмов еще более критичным, поскольку хороший алгоритм должен не только обеспечивать определенную сумму вычислительных затрат не только на ЦП, но также не уступают преимуществам современных массово-параллельных платформ по соотношению цена / производительность для таких задач. Специально для этой цели были разработаны различные алгоритмы, в том числе bcrypt, scrypt и, совсем недавно, Lyra2 и Argon2 (последний победитель Конкурса хеширования паролей ). Масштабное нарушение данных Ashley Madison, в ходе которого злоумышленниками было украдено около 36 миллионов хэшей паролей, продемонстрировало важность выбора алгоритма для защиты паролей. Хотя bcrypt использовался для защиты хэшей (что делало крупномасштабный взлом методом грубой силы дорогостоящим и занимающим много времени), значительная часть учетных записей в скомпрометированных данных также содержала хеш-пароль, основанный на универсальном MD5 алгоритм, который позволил взломать более 11 миллионов паролей в течение нескольких недель.
В июне 2017 года NIST выпустил новую редакцию своих рекомендаций по цифровой аутентификации, NIST SP 800-63B-3, заявляя, что: «Верификаторы ДОЛЖНЫ хранить запомненные секреты [то есть пароли] в форме, устойчивой к атакам в автономном режиме. Запомненные секреты ДОЛЖНЫ быть обработаны и хешированы с использованием подходящей односторонней функции получения ключей. Функции получения ключей принимают пароль, соль, и фактор стоимости в качестве входных данных затем генерирует хэш пароля. Их цель состоит в том, чтобы сделать каждую попытку подбора пароля злоумышленником, который получил файл хеша пароля, дорогостоящим и, следовательно, стоимость атаки подбора пароля высока или непомерно ". и что «Соль ДОЛЖНА иметь длину не менее 32 бита и выбираться произвольно, чтобы минимизировать конфликты значений соли среди хранимых хешей».