Парольная фраза и 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: пошаговый разбор
Любая из трёх функций работает по одной схеме:
- Пользователь вводит пароль, приложение держит его только в памяти.
- Генератор случайных чисел создаёт соль, обычно 16-32 байта.
- KDF многократно применяет хеш-функцию или её память-зависимый вариант к паре «пароль + соль».
- На выходе получается ключ нужной длины: 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 | Где встречается |
|---|---|---|---|
| PBKDF2 | CPU (HMAC) | 600 000 итераций для SHA-256, 210 000 для SHA-512, соль от 16 байт | LUKS1, GPG S2K, VeraCrypt, старые API |
| scrypt | CPU и память | N=2^17, r=8, p=1, около 128 МиБ памяти | VeraCrypt для несистемных томов, часть утилит резервного копирования |
| Argon2id | CPU, память и параллелизм | 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: экономия секунды при монтировании оборачивается часами перебора у атакующего.
- Самодельная схема без соли. Константная соль или её отсутствие возвращают радужные таблицы.
- Пароль рядом с данными. Файл с паролем в том же каталоге, пароль в комментарии к скрипту, в истории командной строки или в переменной, которая попадает в лог.
- Нет резервной копии заголовка. Это не ослабляет шифрование, но приводит к полной потере данных при повреждении первых мегабайт тома.
Практические рекомендации по усилению защиты
- Длинная парольная фраза. Четыре случайных слова из списка на 7776 слов дают около 52 бит энтропии, пять слов около 65 бит. Это заметно надёжнее восьмисимвольной строки с цифрами и заглавными буквами.
- Argon2id с настроенными параметрами: 64 МиБ памяти, t=3, p=4 или выше, если железо позволяет. Для LUKS2 параметры задаются при создании тома: --pbkdf argon2id --pbkdf-memory 65536 --pbkdf-parallel 4 --iter-time 4000.
- Пересматривать параметры раз в один-два года. Параметры KDF хранятся рядом с данными, поэтому их можно поднять при смене пароля или пересоздании тома, не трогая сами данные.
- Генерировать и хранить пароли в менеджере, а не в текстовом файле. Практика настройки локального хранилища с мастер-паролем и key-файлом описана в руководстве по KeePass и KeePassXC.
- Обновлять GPG, cryptsetup и VeraCrypt. Новые версии приносят поддержку Argon2id, увеличивают число итераций по умолчанию и закрывают ошибки в обработке заголовков.
- Копировать заголовки LUKS и контейнеров VeraCrypt и хранить их отдельно от диска. Без заголовка том не открыть даже с правильным паролем.
- Для критичных данных добавить ключевой файл или аппаратный токен. Тогда для доступа нужен и пароль, и физический носитель, а украденная копия тома бесполезна.
Итог: как выбрать подход под свою задачу
Сценарий определяет инструмент. Для отдельных файлов и сообщений достаточно GPG в режиме --symmetric. Для полнодискового шифрования Linux берите LUKS2 с Argon2id. Для контейнеров, которые открываются и в Windows, и в Linux, подходит VeraCrypt. Для приватных ключей и баз менеджеров паролей работает тот же принцип: пароль проходит через KDF и защищает мастер-ключ.
Принципы одинаковы независимо от инструмента: длинная уникальная парольная фраза, современный memory-hard KDF, параметры не ниже базовых ориентиров, уникальная соль в каждом томе. Пароль остаётся одним фактором защиты, и для критичных данных его стоит дополнить ключевым файлом или токеном. Готовые схемы для LUKS2, ZFS, GPG, age, restic и borg вместе с планом ротации ключей собраны в руководстве о практических схемах шифрования данных в 2026 году.