Содержание статьи
Что помогает атакующему взломать шифрование
Значительно облегчить задачу атакующему, который пытается взломать зашифрованный файл, может ряд факторов:
- Длина и сложность пароля. Например, перебор 4-символьного пароля займет гораздо меньше времени, чем 12-символьного, а если расширить алфавит, например использовав буквы верхнего и нижнего регистра, цифры и спецсимволы, то это значительно увеличивает пространство вариантов для перебора, что сильно замедлит взлом. Разумеется, пароли не должны быть любым словарным словом или производным от него, иначе такой пароль будет взломан атакой по словарю. Также существуют так называемые rainbow tables («радужные таблицы») — предвычисленные таблицы хешей паролей. Они позволяют находить исходный пароль по его хешу. Если для шифрования или хеширования пароля не использовались соль или другие защитные меры, такие атаки могут быть достаточно эффективными.
- Ошибки в реализации криптографии. Как уже много раз говорилось, не стоит изобретать свои алгоритмы шифрования и лучше придерживаться готовых и популярных библиотек с открытым исходным кодом. Выбирай проверенные временем и криптоаналитиками алгоритмы шифрования, хеширования и KDF.
- Метаданные. Программы шифрования файлов могут оставлять кучу метаданных: например, создавать в зашифрованном файле заголовок, в котором указываются алгоритмы шифрования и хеширования, версия программы и еще куча данных. Практически все эти данные могут помочь атакующему во взломе. Если уже заранее известны все используемые алгоритмы, то нужно просто таргетированно атаковать их. Даже простая смена расширения файла на уникальное для твоей программы иногда может помочь.
- Известные паттерны открытого текста. Если атакующий знает часть исходного текста, он может применить атаку с известным текстом. К примеру, знание, что файл содержит определенную стандартную информацию, может помочь в атаке (например, когда есть стандартный заголовок файла).
- Настройки по умолчанию. Если в программе есть какие‑то значения по умолчанию, то в большинстве случаев именно они и будут использоваться. Если это программа для шифрования, то пользователи будут выбирать алгоритмы и их параметры, заданные изначально.
Как можно всему этому противостоять? Давай посмотрим на вопрос глазами разработчика шифрующей программы. Вот что его продукт должен делать:
- из пользовательского пароля выработать ключ шифрования;
- зашифровать или расшифровать данные;
- учесть при этом перечисленные векторы атаки.
Звучит просто, но есть некоторые тонкости, которые мы обсудим далее.
Случайные числа и важность PRNG
Перед началом работы с шифрованием необходимо познакомиться с базовыми понятиями криптографии, с которыми придется столкнуться и которые нужно будет понимать: соль (salt) и вектор инициализации (initialization vector, IV). Это два компонента, которые используются в криптографических процессах для повышения безопасности. Хотя они служат схожим целям (предотвращение предсказуемости), их роли и способы использования различаются.
Соль применяется в процессе хеширования для создания уникальных хешей (в том числе KDF), даже если пароль или другие исходные данные для хеширования одинаковы. Это усложняет попытки атак методом подбора и rainbow-атак, поскольку добавляет случайность к хешу. Какую длину соли выбрать? Если опустить некоторые математические расчеты (которые все равно никто не читает), то можно сказать, что длина соли в 256 бит и более считается сегодня безопасной.
Вектор инициализации применяется в симметричном шифровании (например, в режиме CBC, CFB или GCM) и нужен для того, чтобы одинаковые сообщения, зашифрованные одинаковым ключом, давали разные результаты. Это предотвращает предсказуемость зашифрованных данных, улучшая их безопасность.
Соль и IV должны быть случайными, но случайность соли более критична, чем случайность IV. Строго говоря, IV должен быть просто уникальным для зашифрованных данных при использовании режима GCM (для режима AEAD более верно его назвать nonce). Библиотека Botan, которая используется в статье, позволяет генерировать случайные числа при помощи функций randomize_with_ts_input
и randomize
.
Шифруем файлы
Как создается ключ шифрования
После того как пользователь введет пароль для шифрования данных, его необходимо превратить в ключ шифрования. Для этого придуманы специальные математические функции выработки ключа из пароля — Key Derivation Function (KDF). Еще их называют «медленные хеши», потому что ключ из пароля создается медленно: эта процедура требует значительных ресурсов процессора и оперативной памяти. Так сделано намеренно, чтобы противостоять атакам сплошного перебора (или по большому словарю): атакующему нужно перебрать сотни миллионов комбинаций, чтобы получить правильный пароль, а когда используются сильные функции KDF, скорость подбора будет критически мала и на взлом пароля уйдет слишком много времени.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее