Введение

Стандарт для функции получения ключа на основе пароля

В криптографии PBKDF1 и PBKDF2 (Функции получения ключа на основе пароля 1 и 2) — это функции получения ключа с регулируемой вычислительной сложностью, используемые для снижения уязвимости к атакам полным перебором. RFC8018 (PKCS#5 v2.1), опубликованный в 2017 году, рекомендует PBKDF2 для вычисления хеша пароля.

Цель и действие

PBKDF2 применяет псевдослучайную функцию, такую как код аутентификации сообщений на основе хеша (HMAC), к входному паролю или парольной фразе вместе со случайной солью и многократно повторяет процесс для получения производного ключа, который затем может использоваться в качестве криптографического ключа в последующих операциях. Дополнительная вычислительная нагрузка значительно усложняет взлом паролей, и этот процесс известен как растяжение ключа. Когда стандарт был разработан в 2000 году, рекомендованное минимальное количество итераций составляло 1000, но предполагается, что этот параметр должен увеличиваться со временем по мере роста производительности процессоров. Стандарт Kerberos в 2005 году рекомендовал 4096 итераций; компания Apple, по сообщениям, использовала 2000 итераций для iOS 3 и 10000 итераций для iOS 4; в то время как LastPass в 2011 году использовал 5000 итераций для JavaScript-клиентов и 100000 итераций для хеширования на стороне сервера. В 2023 году OWASP рекомендовала использовать 600 000 итераций для PBKDF2 HMAC SHA256 и 210 000 итераций для PBKDF2 HMAC SHA512. Добавление соли к паролю уменьшает возможность использования предварительно вычисленных хешей (таблиц радуги) для атак и означает, что каждый пароль должен проверяться отдельно, а не все сразу. Стандарт криптографии с открытым ключом рекомендует длину соли не менее 64 бит. Национальный институт стандартов и технологий США рекомендует длину соли не менее 128 бит.

Альтернативы PBKDF2

Одним из недостатков PBKDF2 является то, что, хотя количество итераций может быть увеличено, чтобы требовалось произвольно большое количество вычислительного времени, его можно реализовать с использованием небольшой схемы и очень малого объема оперативной памяти, что делает атаки полным перебором с применением специализированных интегральных схем или графических процессоров относительно недорогими. Функция хеширования паролей bcrypt требует большего объема оперативной памяти (но все же не может быть настроена отдельно, то есть фиксирована для заданного времени работы ЦП) и немного более устойчива к таким атакам, в то время как более современная функция вывода ключа scrypt может использовать произвольно большие объемы памяти и, следовательно, более устойчива к атакам с использованием ASIC и GPU. Другой альтернативой является Balloon hashing, который рекомендуется в рекомендациях NIST по паролям. Чтобы ограничить атаку полным перебором, можно сделать так, чтобы каждая попытка ввода пароля требовала онлайн-взаимодействия, не нарушая конфиденциальность пароля. Это можно сделать, используя функцию "oblivious pseudorandom" для усиления защиты пароля. Это можно сделать как альтернативу, так и в качестве дополнительного шага в PBKDF.