Шифрование данных паролем: как пароль превращается в ключ через PBKDF2, scrypt и Argon2 | AdminWiki

Шифрование данных паролем: как пароль превращается в ключ через PBKDF2, scrypt и Argon2

17 сентября 2026 10 мин. чтения

Парольная фраза и 256-битный ключ AES решают разные задачи, и одна строка не превращается в другую сама по себе. Мост между ними строит функция формирования ключа (KDF, Key Derivation Function). Она берёт пароль, случайную соль и число итераций, многократно прогоняет их через хеш-функцию и выдаёт ключ фиксированной длины, например 32 байта для AES-256.

Дальше этот ключ шифрует данные: отдельный файл, приватный ключ GPG или весь диск целиком. Сам пароль нигде не сохраняется, а по содержимому зашифрованного тома нельзя понять, какая строка его открывает, кроме как перебором. Именно поэтому GPG, LUKS и VeraCrypt не используют пароль как ключ напрямую.

Разберём механику по шагам: что делает соль, зачем нужны итерации, чем отличаются PBKDF2, scrypt и Argon2 и как эти принципы работают в реальных инструментах администратора.

Зачем вообще превращать пароль в ключ

У пароля и ключа разная природа. Ключ AES-256 - это 256 случайных бит, где каждый бит независим от остальных. Пароль придумывает человек, и энтропии в нём меньше: словарное слово, имя, дата, замена «a» на «@». Две-три осмысленные фразы дают 30-40 бит энтропии, а ключу нужны полные 256.

Хешировать пароль один раз недостаточно. SHA-256 на современной видеокарте считает миллиарды значений в секунду, поэтому перебор словаря по одиночному хешу занимает минуты. Второй изъян: без соли одинаковые пароли дают одинаковые ключи, и заранее посчитанные таблицы подходят сразу ко всем копиям данных.

KDF закрывает оба пробела: выдаёт ключ нужной длины, подмешивает уникальную соль и намеренно замедляет вычисление. Одна проверка пароля занимает, к примеру, 250 мс вместо наносекунд. Словарь из 10 миллионов частых паролей при четырёх попытках в секунду на ядро перебирается около 29 дней на одном ядре, и это без учёта стоимости железа. Легитимный пользователь за это время вводит пароль один раз.

Отсюда правило: чем дороже вычисление ключа, тем меньше вариантов остаётся у атакующего. Цена растёт не бесконечно, потому что платить приходится и владельцу данных при каждом монтировании тома или расшифровке файла.

Как работает KDF: пошаговый разбор

Любая из трёх функций работает по одной схеме:

  1. Пользователь вводит пароль, приложение держит его только в памяти.
  2. Генератор случайных чисел создаёт соль, обычно 16-32 байта.
  3. KDF многократно применяет хеш-функцию или её память-зависимый вариант к паре «пароль + соль».
  4. На выходе получается ключ нужной длины: 32 байта для AES-256, 64 байта для пары ключей шифрования и аутентификации.

PBKDF2 внутри повторяет HMAC, scrypt и Argon2 дополнительно заполняют и перемешивают блоки памяти. Параметры KDF (алгоритм, соль, число итераций, объём памяти) не секретны и лежат рядом с зашифрованными данными: в заголовке тома LUKS, в контейнере VeraCrypt, в пакете GPG. Зная их, можно повторить вычисление ключа, но только при наличии правильного пароля.

Аналогия: проверка пароля похожа на прохождение лабиринта, который проектировщик может удлинять. Соль делает каждый лабиринт уникальным, итерации добавляют коридоров, а объём памяти расширяет залы настолько, что атакующему не хватает параллельных проходов.

Роль соли: почему одинаковые пароли дают разные ключи

Соль - это случайное значение, которое генерируется заново для каждого пароля и каждого тома. Два администратора с паролем «Qwerty123!» получат разные ключи, потому что соли разные.

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

Отдельная ошибка самодельных схем: использовать константу вместо соли или брать её из имени пользователя. Первое возвращает радужные таблицы, второе позволяет собирать статистику, если человек переиспользует пароль.

Количество итераций: как замедлить перебор

Итерации - это число повторных применений хеш-функции к результату предыдущего шага. Миллион итераций означает, что для одной проверки пароля нужно выполнить миллион операций HMAC, а не одну.

Параметр выбирают по железу, на котором идёт легитимная расшифровка: вычисление ключа должно занимать заметную, но приемлемую долю секунды. Ориентир для 2026 года: от 0.5 до 1-2 секунд на типовом серверном процессоре. Для PBKDF2-HMAC-SHA256 это около 600 000 итераций, для PBKDF2-HMAC-SHA512 около 210 000. В LUKS1 и GPG число итераций подбирают автоматически под заданное время: у GPG это параметр --s2k-count, у cryptsetup ключ --iter-time.

Слишком малое значение обесценивает защиту. Тысяча итераций SHA-256 перебирается на GPU миллионами попыток в секунду, и пароль из словаря находится за минуты. Слишком большое значение бьёт по доступности: том с десятисекундной задержкой монтирования становится неудобным, и администраторы начинают искать обходные пути, вплоть до хранения пароля в скрипте.

Сравнение KDF: PBKDF2, scrypt и Argon2

Три функции решают одну задачу разными ресурсами. PBKDF2 нагружает только процессор, поэтому хорошо распараллеливается на видеокартах и ASIC. scrypt и Argon2 добавляют требование к памяти: каждый параллельный поток держит собственный блок, и ускоритель с сотнями ядер упирается в объём ОЗУ.

KDFЧто нагружаетПараметры-ориентиры 2026Где встречается
PBKDF2CPU (HMAC)600 000 итераций для SHA-256, 210 000 для SHA-512, соль от 16 байтLUKS1, GPG S2K, VeraCrypt, старые API
scryptCPU и памятьN=2^17, r=8, p=1, около 128 МиБ памятиVeraCrypt для несистемных томов, часть утилит резервного копирования
Argon2idCPU, память и параллелизм19 МиБ, t=2, p=1 как минимум; 64 МиБ, t=3, p=4 как комфортный уровеньLUKS2 по умолчанию, KeePassXC (KDBX 4), современные менеджеры

Argon2 появился по итогам открытого конкурса Password Hashing Competition и получил три варианта: Argon2d устойчив к атакам на видеокарты, Argon2i к атакам по побочным каналам, Argon2id совмещает оба профиля и считается выбором по умолчанию. Для новых проектов разумно брать Argon2id, а PBKDF2 оставлять там, где нужна совместимость с существующими форматами, но с увеличенным числом итераций. Как выбирать между bcrypt, scrypt, Argon2id и PBKDF2 для хранения паролей в базе, разобрано в отдельном руководстве: сравнение алгоритмов хеширования паролей в 2026 году.

Разница в стойкости проявляется в сценарии с арендованным кластером GPU. Против PBKDF2 с 600 000 итераций SHA-256 атакующий получает тысячи попыток в секунду на устройство. Против Argon2id с 64 МиБ памяти он вынужден выделять 64 МиБ на поток, и сотни параллельных потоков превращаются в гигабайты ОЗУ, которых на арендованном узле нет.

Где это применяется: GPG, LUKS, VeraCrypt

Во всех трёх инструментах пароль не хранится. Он проходит через KDF и даёт ключ, который расшифровывает либо данные напрямую, либо мастер-ключ, а тот уже защищает данные.

GPG: шифрование файлов и сообщений паролем

Режим симметричного шифрования включается ключом --symmetric: команда gpg --symmetric --cipher-algo AES256 file.txt создаёт file.txt.gpg, для расшифровки нужен тот же пароль. Пароль превращается в ключ AES-256 через схему OpenPGP S2K (string-to-key) в режиме iterated and salted: сначала соль, затем многократное хеширование SHA-256. Число итераций регулируется опцией --s2k-count, максимум 65 011 712; по умолчанию GPG подбирает его так, чтобы вычисление заняло примерно 100 мс.

Тот же механизм защищает приватные ключи в связке ключей. Секретный ключ хранится в зашифрованном виде, ключ шифрования выводится из парольной фразы через S2K, поэтому утечка файла secring.gpg без пароля бесполезна.

LUKS: шифрование диска на основе пароля

LUKS не шифрует данные паролем напрямую. При форматировании создаётся случайный мастер-ключ, которым шифруется весь том. Мастер-ключ хранится в заголовке в зашифрованном виде, а ключ для его расшифровки выводится из пароля через KDF. Команда cryptsetup luksFormat --type luks2 --pbkdf argon2id --iter-time 4000 --pbkdf-memory 65536 /dev/sdb1 создаёт том LUKS2 с Argon2id, целевым временем вывода ключа 4 секунды и 64 МиБ памяти (память задаётся в килобайтах).

LUKS1 использует PBKDF2, LUKS2 перешёл на Argon2id по умолчанию. Заголовок хранит несколько ключевых слотов (восемь в LUKS1), поэтому у тома может быть несколько паролей, а отзыв одного не затрагивает остальные. Проверить текущие параметры и число итераций можно командой cryptsetup luksDump /dev/sdb1. Если том создавали годы назад на слабом железе, итераций там может быть мало: смена пароля пересчитывает KDF с актуальными параметрами.

Заголовок LUKS - единая точка отказа. Резервная копия снимается командой cryptsetup luksHeaderBackup /dev/sdb1 --header-backup-file luks-header.img, и хранить её нужно в защищённом месте: обладатель заголовка и слабого пароля получает доступ к данным. Отработать команды без риска для рабочего диска удобно на изолированной виртуальной машине, например в Timeweb Cloud, где можно поднять VPS с отдельным диском под эксперименты с cryptsetup.

VeraCrypt: контейнеры и шифрование дисков

VeraCrypt создаёт зашифрованные контейнеры, шифрует разделы и системные диски целиком. Пароль преобразуется в ключ через PBKDF2: для обычных томов используется RIPEMD-160 с 500 000 итераций, для системного шифрования число итераций ниже (200 000 для RIPEMD-160), чтобы успевал загрузчик. В версиях 1.12 и новее для несистемных томов доступен scrypt как альтернативная функция.

Создание контейнера из командной строки: veracrypt --create --volume-type normal --size 10G --encryption AES --hash SHA-512 /home/admin/secret.hc. Помимо алгоритма шифрования выбирается функция формирования ключа, и SHA-512 в паре с PBKDF2 даёт другую кривую стоимости, чем RIPEMD-160.

Отдельный риск - режим совместимости с TrueCrypt. В нём число итераций падает до 1000-2000, и перебор становится дешёвым. Режим нужен только для доступа к старым томам, для новых данных его включать незачем.

Типичные ошибки при выборе пароля и настройке KDF

  • Короткий или словарный пароль. «123456» и «password» подбираются мгновенно при любых параметрах KDF: дорогая функция лишь замедляет каждую попытку, но не спасает от первых тысяч вариантов в списке. Как строить защиту от перебора по словарю и подбирать cost factor, разобрано в материале о защите хранилища паролей от брутфорса.
  • Переиспользование пароля. Один пароль для диска, VPN и почты означает, что утечка в любом сервисе открывает диск.
  • Малое число итераций. Устаревшие профили, старые заголовки LUKS1, режим TrueCrypt в VeraCrypt: экономия секунды при монтировании оборачивается часами перебора у атакующего.
  • Самодельная схема без соли. Константная соль или её отсутствие возвращают радужные таблицы.
  • Пароль рядом с данными. Файл с паролем в том же каталоге, пароль в комментарии к скрипту, в истории командной строки или в переменной, которая попадает в лог.
  • Нет резервной копии заголовка. Это не ослабляет шифрование, но приводит к полной потере данных при повреждении первых мегабайт тома.

Практические рекомендации по усилению защиты

  1. Длинная парольная фраза. Четыре случайных слова из списка на 7776 слов дают около 52 бит энтропии, пять слов около 65 бит. Это заметно надёжнее восьмисимвольной строки с цифрами и заглавными буквами.
  2. Argon2id с настроенными параметрами: 64 МиБ памяти, t=3, p=4 или выше, если железо позволяет. Для LUKS2 параметры задаются при создании тома: --pbkdf argon2id --pbkdf-memory 65536 --pbkdf-parallel 4 --iter-time 4000.
  3. Пересматривать параметры раз в один-два года. Параметры KDF хранятся рядом с данными, поэтому их можно поднять при смене пароля или пересоздании тома, не трогая сами данные.
  4. Генерировать и хранить пароли в менеджере, а не в текстовом файле. Практика настройки локального хранилища с мастер-паролем и key-файлом описана в руководстве по KeePass и KeePassXC.
  5. Обновлять GPG, cryptsetup и VeraCrypt. Новые версии приносят поддержку Argon2id, увеличивают число итераций по умолчанию и закрывают ошибки в обработке заголовков.
  6. Копировать заголовки LUKS и контейнеров VeraCrypt и хранить их отдельно от диска. Без заголовка том не открыть даже с правильным паролем.
  7. Для критичных данных добавить ключевой файл или аппаратный токен. Тогда для доступа нужен и пароль, и физический носитель, а украденная копия тома бесполезна.

Итог: как выбрать подход под свою задачу

Сценарий определяет инструмент. Для отдельных файлов и сообщений достаточно GPG в режиме --symmetric. Для полнодискового шифрования Linux берите LUKS2 с Argon2id. Для контейнеров, которые открываются и в Windows, и в Linux, подходит VeraCrypt. Для приватных ключей и баз менеджеров паролей работает тот же принцип: пароль проходит через KDF и защищает мастер-ключ.

Принципы одинаковы независимо от инструмента: длинная уникальная парольная фраза, современный memory-hard KDF, параметры не ниже базовых ориентиров, уникальная соль в каждом томе. Пароль остаётся одним фактором защиты, и для критичных данных его стоит дополнить ключевым файлом или токеном. Готовые схемы для LUKS2, ZFS, GPG, age, restic и borg вместе с планом ротации ключей собраны в руководстве о практических схемах шифрования данных в 2026 году.

Поделиться:
Сохранить гайд? В закладки браузера