
Выбор хеш-функции и числа итераций
Для того чтобы зашифровать (ну, и расшифровать тоже) любые данные, криптоконтейнер не использует пароль. Для шифрования любым алгоритмом (от AES до «Кузнечика») берется двоичный ключ фиксированной длины, так называемый Data Encryption Key или Media Encryption Key (MEK). Каким именно образом ваш пароль (наверняка очень длинный и безопасный) превращается в MEK фиксированной длины? Откровенно говоря, никаким. Media Encryption Key для единожды созданного контейнера неизменен; он хранится в зашифрованном (точнее сказать, «обернутом», wrapped) виде прямо в составе контейнера, а в «развернутом» виде используется для доступа к данным.
Ключ шифрования данных MEK в обязательном порядке шифруется (простите за тавтологию) ключом шифрования ключа шифрования Key Encryption Key (KEK). Без KEK невозможно расшифровать MEK, а без MEK невозможно расшифровать данные. Для чего нужна такая сложная схема? Хотя бы для того, чтобы вы смогли сменить пароль от криптоконтейнера без обязательной расшифровки и перешифровки всего содержимого. Однако роль пары ключей MEK/KEK этим сценарием не ограничивается. Так, достаточно будет затереть несколько десятков байтов в заголовке контейнера (перезаписав область, в которой хранится MEK), и контейнер никто и никогда больше расшифровать не сможет, даже если точно известен пароль. Возможность моментального и безвозвратного уничтожения данных — важная часть общей стратегии безопасности.
Итак, с парой ключей MEK/KEK разобрались. Каким образом из пароля получается ключ KEK? VeraCrypt проводит циклическую последовательность односторонних (это важно) математических преобразований — хеш-функций, причем количество циклов достаточно велико: по умолчанию преобразование выполняется 500 000 раз. Таким образом, с настройками «по умолчанию» на вычисление одного-единственного ключа KEK на основе введенного пароля VeraCrypt потратит от одной до пяти-шести секунд.
Здесь наступает важный момент. Помните, чуть выше я разобрал скорость работы алгоритмов шифрования и порекомендовал использовать AES как самый распространенный и самый быстрый вариант? Так вот, с выбором хеш-функции все обстоит с точностью до наоборот: вам нужен самый нестандартный и самый медленный алгоритм.
В VeraCrypt доступен выбор из четырех хеш-функций: дефолтный SHA-512 (он достаточно медленный и достаточно безопасный, но дефолтный, что для нас минус), еще более медленный и тоже хорошо изученный Whirlpool, старенький SHA-256, который все еще безопасен, но смысла в использовании которого я не вижу, и «темная лошадка» «Стрибог», который в бенчмарке медленнее всех.

Выбор алгоритма шифрования VeraCrypt
Впрочем, от использования хеш-функции «Стрибог» надежно отвращают слова из Википедии: «Разработан Центром защиты информации и специальной связи ФСБ России с участием ОАО „ИнфоТеКС“ на основе национального стандарта Российской Федерации ГОСТ Р 34.11—2012 и введен в действие с 1 июня 2019 года приказом Росстандарта № 1060-ст от 4 декабря 2018 года», а также некоторые
https://eprint.iacr.org/2016/071 и найденные независимыми исследователями
https://eprint.iacr.org/2016/071 в таблицах перестановки.
Как правильно настроить преобразование пароля в ключ шифрования KEK? Вот три основных пункта.
Не используйте выбор по умолчанию. Весь софт для взлома криптоконтейнеров без исключений настроен на атаки с настройками «по умолчанию». У эксперта будет выбор настроек (по умолчанию, выбрать конкретную комбинацию параметром или пробовать все комбинации). Атака «по умолчанию» будет самой быстрой, вариант «пробовать все комбинации» — катастрофически медленным, а попытаться выбрать правильную комбинацию параметров шифрования вручную — все равно, что вручную подбирать пароль.
Выберите самую медленную хеш-функцию (но не «Стрибог»). Да, с медленной хеш-функцией, да еще и отличной от «выбора по умолчанию», ваш криптоконтейнер будет монтироваться не одну, а пять-шесть секунд — но и стойкость к атаке вырастет в те же пять-шесть раз (а с учетом «выбора не по умолчанию» — еще сильнее).
Измените число итераций. Об этом ниже.
Итак, с настройками по умолчанию разобрались, с выбором хеш-функции определились. Однако есть еще один важнейший параметр, скрывающийся за малозаметной галочкой Use PIM. Что за PIM такой и зачем он нужен?

Use PIM в VeraCrypt
PIM (Personal Iterations Multiplier) напрямую влияет на количество итераций, которые будут использованы для преобразования вашего пароля в ключ шифрования KEK. Согласно
https://www.veracrypt.fr/en/Personal...r%20(PIM).html, VeraCrypt вычисляет количество итераций (число преобразований) по формуле 15000 + (PIM · 1000). Для хеш-функций SHA-512 и Whirlpool значение PIM по умолчанию 485, что дает нам ровно 500 000 итераций.
Для чего нужен этот параметр? Дело в том, что вычислительные мощности, в том числе и у тех, кто будет взламывать ваш криптоконтейнер, постоянно растут. Защита, эффективная двадцать лет назад, сегодня уже не кажется такой непробиваемой. Однако в случае с VeraCrypt вы можете легко и изящно повысить стойкость защиты сколь угодно сильно, просто увеличив число итераций. Да, увеличение числа итераций (через кастомное значение PIM) немного снизит удобство использования (при монтировании криптоконтейнера вам придется, помимо пароля, вводить еще и число PIM), несколько замедлится скорость монтирования. Поверьте, однако, что любое, самое незначительное изменение PIM означает сильнейшую головную боль у любого, кто вздумает подобрать пароль и взломать VeraCrypt.
Насколько сильно изменение PIM повлияет на скорость монтирования криптоконтейнера? Вот время с настройками PIM по умолчанию.

Use PIM в VeraCrypt
А вот я изменил PIM на значение 500 (с дефолтных 485).

А тут я использовал PIM, равный 1000.

Цифры отнюдь не запредельные: подождать при монтировании зашифрованного тома лишние секунды несложно, а вот у того, кто будет пытаться подобрать пароль к тому, возникнет масса проблем. Общий алгоритм работы взломщиков будет выглядеть так.
Сначала попробуют все возможные атаки со стандартными настройками. Это — время, часто существенное.
Если понятно, что значение PIM нестандартное, а число PIM точно известно, атака будет вестись сразу с корректной настройкой. При этом увеличение PIM с 485 до 1000 увеличит время, необходимое для атаки, примерно вдвое. Так себе повышение безопасности, но лучше, чем ничего.
А вот если значение PIM атакующему неизвестно, то атаку придется проводить для всего ряда значений PIM. То есть если вы выставивите значение PIM = 1000, то КАЖДЫЙ вариант пароля атакующему придется проверять со значениями PIM = 1, 2, 3, …, 1000 (или 485, 486, 487, …, 1000, если атакующий убежден, что значение PIM вы не уменьшали, а исключительно увеличивал). Иными словами, сложность атаки возрастает кратно значению (ваш PIM — 485), если атакующий использует только варианты, превышающие значение по умолчанию, либо в (ваш PIM) раз, если атакующий решит перебирать всю область значений PIM.
Логичный вопрос: разве увеличение длины пароля на два-три знака из расширенного набора символов не даст схожий (и даже лучший) результат? Если подходить с чисто вычислительной точки зрения, то даст. Реальность же такова, что большая часть атак проводится с настройками по умолчанию; программы, способные использовать атаки с нестандартным значением PIM, можно пересчитать по пальцам одной руки, а программ, которые способны автоматизировать атаки с кастомным рядом значений PIM, и того меньше.
Рассмотрим скриншот свежей сборки Elcomsoft Distributed Password Recovery с поддержкой VeraCrypt.

На нем мы видим атаку в стандартной конфигурации: алгоритм шифрования AES, хеш-функция — SHA-512. Никаких сюрпризов. Скорость атаки — 170 паролей в секунду (это с загрузкой всех ядер процессора и с использованием вычислительных ресурсов видеокарты; без видеокарты мы бы увидели скорость порядка 0,5 пароля в секунду).
Но если вы смените хеш-функцию, то такой атакой, как показана на первом скриншоте, пароль найти не получится. Соответственно, будет применяться вторая атака — уже по всему спектру алгоритмов шифрования и хеш-функций.

Что мы видим на втором скриншоте? Во-первых, скорость перебора резко упала до одного пароля в секунду — это с использованием GPU-ускорителя.
А чего мы не видим на втором скриншоте? Мы не видим возможности провести атаку на число итераций PIM. Число итераций PIM в большинстве программ для взлома паролей можно указать вручную. Таким образом, нестандартное число итераций сделает атаку неэффективной: даже если ваш пароль — 123, найти его не получится, не указав точного числа итераций.
Разумеется, если есть проблема, для нее найдется и решение. В свежей бете небезызвестного инструмента hashcat заявлены два любопытных параметра: —veracrypt-pim-start и —veracrypt-pim-stop (
https://www.veracrypt.fr/en/Personal...r%20(PIM).html). А что будет со скоростью перебора? Если неизвестны точные параметры шифрования (комбинация из алгоритма шифрования и хеш-функции), то скорость перебора уже достаточно низкая: всего один пароль в секунду на компьютере с аппаратным ускорителем GPU. А теперь поделите эту цифру на количество возможных вариантов PIM, и получите исключительно медленный перебор. В реальности же перебор будет еще медленнее: если с низкими значениями PIM проверка пароля займет доли секунды, то большое число итераций замедлит перебор в несколько раз по сравнению со стандартным значением.
Защита ключа шифрования VeraCrypt
Итак, мы выбрали шифрование AES, хеш-функцию Whirlpool, а число итераций выставили скромненько 1111 (чтоб и нестандартно, и не забыть случайно). Это полностью защитит контейнер от атаки на пароль, но, как мы помним из начала статьи, спецы могут вообще не устраивать такую атаку, если смогут просто вытащить ключ шифрования из вашего компьютера.
Взять готовый ключ шифрования и с его помощью смонтировать (или расшифровать целиком) зашифрованный раздел — любимый и самый быстрый способ, которым пользуется полиция. Суть его заключается в следующем.
Как вы знаете, для того чтобы зашифровать (и расшифровать) данные, криптоконтейнер не использует пароль. Для шифрования любым алгоритмом (от AES до «Кузнечика») используется двоичный ключ фиксированной длины, так называемый Data Encryption Key или Media Encryption Key (MEK). Вы уже в курсе, каким сложным образом ваш пароль (наверняка очень длинный и безопасный) превращается в ключ фиксированной длины. Дело сейчас не в этом.
Логично, что ключ шифрования данных (MEK) хранится в оперативной памяти компьютера. Это необходимо для того, чтобы программа-криптоконтейнер могла получить доступ к зашифрованным данным в принципе. Обратите внимание: ключ шифрования хранится в оперативной памяти совершенно независимо от того, какой алгоритм шифрования вы выбрали в настройках контейнера. AES, Twofish, Serpent, «Кузнечик» или любая комбинация алгоритмов — независимо от вашего выбора, ключи шифрования будут храниться в оперативной памяти, а сложность и скорость их извлечения практически одинакова.

Таким образом, сложность этой атаки мало зависит как от выбора алгоритма шифрования, так и от способа преобразования вашего пароля в двоичный ключ. Максимум, чего удастся добиться нестандартными настройками, — это увеличение времени поиска ключа в образе оперативной памяти, условно говоря, с десяти-пятнадцати минут до полутора-двух часов (цифры условные: многое зависит как от объема оперативной памяти компьютера, с которого делался дамп оперативной памяти, так и от скорости накопителя и центрального процессора, где этот дамп анализируется).

Можно ли защититься от подобных атак? Полноценная защита от извлечения ключей шифрования из оперативной памяти компьютера достаточно сложна, а на обычном десктопе может и вовсе оказаться невозможной (противостоять
https://www.veracrypt.fr/en/Personal...r%20(PIM).html вообще достаточно тяжело, но и вероятность ее применения исчезающе мала). В то же время вы можете включить в настройках VeraCrypt недавно появившуюся возможность шифрования ключей шифрования в оперативной памяти компьютера.

Обратите внимание: настройка доступна начиная с VeraCrypt 1.24 (на момент написания статьи актуальна сборка 1.24 Update 4). По умолчанию опция выключена; если ее включить, использование оперативной памяти драйвером увеличится примерно на 10%, производительность упадет на 5–15% (
https://www.veracrypt.fr/en/Personal...r%20(PIM).html), а также будет отключена возможность гибернации.
Но это только часть защиты. В файл подкачки или файл гибернации также могут попасть и сами данные, которые хранятся в зашифрованном контейнере, а встроенная в VeraCrypt функция отключения гибернации может не сработать. По-хорошему также необходимо отключить ее на уровне Windows. Опции Hybrid sleep и, собственно, Hibernation.

Обратите также внимание на режим «быстрой загрузки» (Fast Startup) на первом скриншоте. В этом режиме (по умолчанию он, кстати, включен) при выключении компьютера Windows сохраняет состояние ядра в файл на системном диске. Этот файл – в некотором роде урезанный (без user space) аналог файла гибернации. Его наличие позволяет ускорить процесс последующей загрузки, но оно же приводит к возможности утечки ключа шифрования томов VeraCrypt. Отключение режима Fast Startup поможет защититься от этой уязвимости.
Если же жертвовать режимом гибернации не хочется, то стоит подумать о шифровании системного диска с помощью того же BitLocker’а . В этом случае и файл подкачки, и файл гибернации будут надежно защищены.
Облако и ключи восстановления доступа
Для VeraCrypt этот момент не критичен, но BitLocker по умолчанию предлагает пользователю сохранить ключ восстановления доступа к зашифрованному диску в облако OneDrive. Если его удастся оттуда извлечь (а полиции обычно удается, достаточно сделать запрос в Microsoft), то расшифровка данных становится тривиальной. Атака сработает и в том случае, если вы сохраните подобный ключ на USB-накопителе, доступ к которому получит полицейский эксперт или злоумышленник. Иными словами, ключи восстановления доступа — палка о двух концах, и с точки зрения чистой безопасности лучше их не иметь, чем иметь.
Заключение
Надеюсь, я смог изменить ваши представления о безопасности криптоконтейнеров в целом и VeraCrypt в частности. Вооружившись новыми знаниями, вы сможете создавать зашифрованные контейнеры, обладающие на несколько порядков более высокой стойкостью к парольным атакам. Кроме того, использование недавно появившихся малоизвестных настроек безопасности позволит вам защититься и от излюбленных атак на оперативную память, файлы подкачки и гибернации. В то же время разработчики VeraCrypt не гарантируют безопасность любых данных, попадающих в оперативную память компьютера, так что речь идет скорее не о стопроцентной защите, а о существенном осложнении соответствующих атак с не менее существенным снижением их эффективности и вероятности успешно вскрыть зашифрованный том.