Функции выведения ключа: PBKDF2, bcrypt и Argon2
Сравните алгоритмы хеширования паролей по их устойчивости к атакам с использованием GPU и ASIC и поймите, как настраиваются коэффициенты трудоёмкости и требования к памяти.
«Функции выведения ключа: PBKDF2, bcrypt и Argon2» — бесплатный урок Security+ Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Security+ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Security+ Academy содержит 4 уроков всего.
Чем хеширование паролей отличается от обычного
Для хранения паролей требуется специальный класс криптографических функций, называемый функцией хеширования паролей (PHF) или функцией выработки ключа (KDF). Обычные криптографические хеш-функции, такие как SHA-256, предназначены для быстрой работы: современный GPU может вычислять миллиарды хешей SHA-256 в секунду. При хранении паролей такая скорость становится катастрофической: злоумышленник, похитивший базу данных с хешами, может проверять миллиарды вариантов в секунду. KDF для паролей намеренно работают медленно — их параметры можно настроить так, чтобы перебор стал вычислительно неосуществимым, сохранив при этом возможность выполнить законный вход за несколько миллисекунд.
Соль: защита от радужных таблиц
До появления специализированных KDF для паролей злоумышленники использовали радужные таблицы — заранее вычисленные соответствия между значениями хешей и исходными паролями. Соль — это случайное значение, уникальное для каждого пользователя, которое добавляется перед паролем или после него до хеширования. Благодаря этому хеши становятся уникальными даже для одинаковых паролей. Соли хранятся в базе данных рядом с хешем: они не являются секретными, а должны быть случайными. Корректная соль должна иметь длину не менее 16 байт, создаваться криптографически стойким генератором случайных чисел и храниться отдельно для каждого пользователя, то есть никогда не использоваться повторно для разных учётных записей.
PBKDF2: стандарт для паролей
PBKDF2 (Password-Based Key Derivation Function 2) определена в RFC 8018 и одобрена NIST. Она многократно применяет функцию HMAC, обычно HMAC-SHA-256, к паролю и соли заданное число итераций. Число итераций определяет вычислительную нагрузку: по состоянию на 2023 год NIST рекомендует выполнять для PBKDF2-HMAC-SHA256 не менее 600 000 итераций. PBKDF2 широко используется в Django, связке ключей iOS и WPA2-PSK, но имеет один недостаток: её можно эффективно реализовать на GPU, поэтому она хуже противостоит GPU, чем альтернативные решения.
# PBKDF2 example (Python pseudocode concept)
# import hashlib
# dk = hashlib.pbkdf2_hmac(
# 'sha256', # hash algorithm
# b'password', # password bytes
# b'random_salt', # salt bytes
# 600000 # iterations
# )bcrypt: устойчивость к вычислениям и памяти
bcrypt разработали Нильс Провос и Дэвид Мазьер в 1999 году; этот алгоритм по-прежнему широко используется. Его ключевое нововведение — коэффициент стоимости (параметр числа раундов): каждое увеличение этого параметра вдвое увеличивает время вычислений. bcrypt использует модифицированный шифр Blowfish с процедурой настройки ключа Eksblowfish, требующей значительных ресурсов CPU и памяти, поэтому существенно труднее ускоряется на GPU по сравнению с PBKDF2. Кроме того, bcrypt ограничивает длину входного пароля 72 байтами: более длинные пароли обрезаются. Поэтому в некоторых реализациях перед bcrypt длинные пароли сначала хешируют с помощью SHA-256.
# bcrypt cost factor
# Cost 10 = ~100ms on modern hardware
# Cost 12 = ~400ms
# Cost 14 = ~1600ms
# Each +1 doubles the work
# Recommended: cost 12-14 for web apps
# Command: htpasswd -bnBC 12 username passwordArgon2: современный лидер
Argon2 победил в конкурсе хеширования паролей в 2015 году и в настоящее время рекомендован OWASP. Он существует в трёх вариантах: Argon2d (быстрее, уязвим к атакам по побочному каналу, лучше всего подходит для криптовалют), Argon2i (работает за постоянное время, лучше всего подходит для хеширования паролей) и Argon2id (гибридный вариант, рекомендуемый для большинства случаев). Argon2id настраивается по трём параметрам: стоимость по времени (итерации), стоимость по памяти (требуемый объём RAM) и степень параллелизма (потоки). Большой объём требуемой памяти делает эффективную параллельную обработку на GPU чрезвычайно сложной, а на ASIC — полностью неосуществимой.
# Argon2id recommended parameters (OWASP 2023)
# Memory: 64MB (65536 KiB)
# Iterations: 3
# Parallelism: 4 threads
# Output length: 32 bytes
# argon2 -id -t 3 -m 16 -p 4 -l 32Требовательность к памяти: почему она противодействует атакам на GPU
GPU располагают тысячами ядер, но ограниченным объёмом памяти на каждое ядро, поэтому особенно хорошо подходят для распараллеливания простых вычислений, требующих мало памяти. Функции, требовательные к памяти, такие как Argon2 и scrypt, требуют большого объёма RAM для вычисления каждого хеша. Если злоумышленник хочет одновременно выполнять 10 000 вычислений Argon2id, каждому из которых требуется 64 МБ памяти, ему понадобится 640 ГБ памяти GPU — значительно больше, чем доступно любому кластеру GPU. Это свойство, называемое требовательностью к памяти, вынуждает злоумышленников либо использовать медленные последовательные вычисления, либо вкладывать средства в чрезвычайно дорогое оборудование, из-за чего атаки становятся экономически невыгодными.
Настройка вычислительной нагрузки на практике
Подходящая вычислительная нагрузка зависит от Вашего оборудования и допустимой задержки. Обычно следует стремиться к показателю 100–300 мс на серверном оборудовании в рабочей среде для каждой аутентификации. По мере совершенствования оборудования вычислительную нагрузку следует увеличивать. Поэтому bcrypt и Argon2 хранят параметры рядом с хешем, обеспечивая прозрачное обновление: при следующем входе нужно проверить пароль, а затем повторно вычислить его хеш с новыми, более высокими параметрами. OWASP регулярно публикует актуальные минимальные рекомендуемые параметры для PBKDF2, bcrypt и Argon2id; их следует пересматривать ежегодно.
scrypt: ещё одна KDF, требовательная к памяти
scrypt, разработанная Колином Персивалем в 2009 году, стала первой широко распространённой KDF, требовательной к памяти, и используется Litecoin и многими менеджерами паролей. Параметры scrypt: N (стоимость по CPU и памяти), r (размер блока) и p (коэффициент распараллеливания). Как и Argon2, большие значения N требуют значительного объёма RAM для каждого вычисления. scrypt считается безопасной, но для новых приложений обычно предпочитают Argon2id, поскольку он победил в PHC и прошёл более глубокий криптографический анализ. Оба варианта приемлемы.
Что НЕ следует использовать: MD5, SHA-1 и SHA без соли
Для паролей нельзя использовать несколько подходов: MD5 (взломан, на пользовательском оборудовании можно вычислять миллиарды хешей в секунду), SHA-1 (та же проблема), SHA-256 без соли (быстрый, радужные таблицы применяются элементарно) и простое шифрование (обратимо, поэтому кража ключа означает раскрытие всех паролей). В результате исторических утечек, таких как LinkedIn (2012), где использовался SHA-1 без соли, были раскрыты 117 миллионов паролей, взломанных в течение нескольких дней. Компания Adobe (2013) зашифровала пароли вместо их хеширования — это фундаментальная ошибка, приведшая к раскрытию 153 миллионов учётных записей. Эти инциденты входят в программу экзамена Security+.
Выработка ключей шифрования
KDF также используются для получения ключей шифрования из паролей, а не только для хранения хешей паролей. Когда пользователь задаёт главный пароль для зашифрованного хранилища, приложение использует KDF, чтобы получить из этого пароля фактический ключ шифрования AES-256. Поэтому менеджеры паролей могут расшифровывать хранилище локально: они запускают KDF для главного пароля и восстанавливают ключ шифрования, который никогда не покидает устройство. HKDF (HMAC-based Key Derivation Function) — стандарт для получения нескольких ключей из одного высокоэнтропийного секрета; в TLS 1.3 он используется для получения ключей рукопожатия и ключей приложения.
Защита от атак с подбором учётных данных и с помощью KDF
Атаки с подбором учётных данных используют пары имени пользователя и пароля, украденные при одном взломе, для атак на другие сервисы. Надёжные KDF уменьшают время, доступное для автономного взлома после утечки: если на одну попытку требуется 300 мс вместо нескольких микросекунд, взлом случайного 10-значного пароля становится вычислительно нереализуемым. Однако KDF не защищают от повторного использования паролей на разных сайтах — для этого пользователи должны применять уникальные пароли. Сочетание уникальных паролей, хранения с помощью Argon2id и MFA делает атаки на учётные данные практически неэффективными.
Быстрая проверка
Проверьте, насколько Вы усвоили изложенные в этом уроке концепции CompTIA Security+ (SY0-701).
Итоги урока
В этом уроке Вы узнали, что KDF для паролей намеренно работают медленно и используют настраиваемые параметры сложности, чтобы сделать автономные атаки методом полного перебора вычислительно нереализуемыми; функции с высокой потребностью в памяти, такие как Argon2id и scrypt, препятствуют распараллеливанию на GPU, требуя большой объём RAM для каждого вычисления; а MD5, SHA-1 и хеши без соли совершенно непригодны для хранения паролей, что подтвердили многочисленные громкие утечки данных. Далее мы рассмотрим постквантовую криптографию и алгоритмы, выбранные NIST для замены RSA и ECC.
Часто задаваемые вопросы
Урок «Функции выведения ключа: PBKDF2, bcrypt и Argon2» бесплатный?
Да — полный текст урока «Функции выведения ключа: PBKDF2, bcrypt и Argon2» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Security+ Academy, подпишись на CoddyKit PRO. Курс Security+ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Функции выведения ключа: PBKDF2, bcrypt и Argon2»?
Сравните алгоритмы хеширования паролей по их устойчивости к атакам с использованием GPU и ASIC и поймите, как настраиваются коэффициенты трудоёмкости и требования к памяти. Ты практикуешь Security+ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Security+ Academy?
Предыдущий опыт не требуется. Security+ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Функции выведения ключа: PBKDF2, bcrypt и Argon2»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Security+ Academy?
Да. Каждый урок Security+ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Рукопожатие TLS 1.3 и возобновление сессии 0-RTT
- Аутентифицированное шифрование: AES-GCM и ChaCha20-Poly1305
- Функции выведения ключа: PBKDF2, bcrypt и Argon2
- Постквантовая криптография: CRYSTALS-Kyber и Dilithium