0Pricing
Cloud & IT Cert Prep · Урок

Функции выведения ключа: PBKDF2, bcrypt и Argon2

Сравните алгоритмы хеширования паролей по их устойчивости к атакам с использованием GPU и ASIC и поймите, как настраиваются коэффициенты трудоёмкости и требования к памяти.

«Функции выведения ключа: PBKDF2, bcrypt и Argon2» — бесплатный урок Cloud & IT Cert Prep на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Cloud & IT Cert Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Cloud & IT Cert Prep содержит 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 password

Argon2: современный лидер

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) и разблокировать остальной курс Cloud & IT Cert Prep, подпишись на CoddyKit PRO. Курс Cloud & IT Cert Prep содержит 4 уроков всего.

Чему я научусь в уроке «Функции выведения ключа: PBKDF2, bcrypt и Argon2»?

Сравните алгоритмы хеширования паролей по их устойчивости к атакам с использованием GPU и ASIC и поймите, как настраиваются коэффициенты трудоёмкости и требования к памяти. Ты практикуешь Cloud & IT Cert Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Cloud & IT Cert Prep?

Предыдущий опыт не требуется. Cloud & IT Cert Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Функции выведения ключа: PBKDF2, bcrypt и Argon2»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Cloud & IT Cert Prep?

Да. Каждый урок Cloud & IT Cert Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Рукопожатие TLS 1.3 и возобновление сессии 0-RTT
  2. Аутентифицированное шифрование: AES-GCM и ChaCha20-Poly1305
  3. Функции выведения ключа: PBKDF2, bcrypt и Argon2
  4. Постквантовая криптография: CRYSTALS-Kyber и Dilithium
← Назад к Cloud & IT Cert Prep