Zamok это моя программа для шифрования папок в Windows. Достаточно нажать на папку правой кнопкой и выбрать «Зашифровать паролем», и после шифрования папка остаётся на том же месте, но открывается только по паролю. Ярлыки, недавние файлы и проекты в программах продолжают на неё указывать. Папку с паролем я хотел ещё в детстве, когда компьютер был общий.

Zamok, шифрование папок в Windows

Zamok, шифрование папок в Windows

Я пользовался и VeraCrypt, и Cryptomator. В VeraCrypt нужно выбрать файл тома, букву диска и ввести пароль, после чего файлы лежат на отдельном диске. Путь к файлам меняется, и ярлыки и пути в программах приходится переделывать. В Cryptomator сначала создаётся хранилище, файлы переносятся в него, и запереть его часто мешает открытое окно Проводника.

Папка без буквы диска

После шифрования по пути папки, например D:\Работа\Клиенты, стоит точка подключения файловой системы WinFsp. Это бесплатный драйвер, через который программа показывает Windows папки и файлы, которых на диске в таком виде нет. На нём же работает Cryptomator. Зашифрованные данные лежат рядом в скрытой папке D:\Работа\.Клиенты.zamok. Когда Word открывает файл, WinFsp передаёт запрос в Zamok, тот читает зашифрованный кусок, расшифровывает его в памяти и отдаёт. Открытый текст на диск не пишется.

WinFsp подключает файловую систему только на путь, которого не существует. Если бы я подключал папку при открытии и отключал при запирании, на этом пути каждый раз нужно было бы удалять и создавать папку, а открытое окно Проводника не давало бы её отключить. Поэтому файловая система подключается при входе в винду и остаётся подключённой. У неё два состояния. В запертом ключ стёрт из памяти, а внутри виден один значок, который открывает окно пароля. В открытом видно расшифрованное содержимое.

Запирание переключает состояние внутри программы. Ядро WinFsp кэширует сведения о файлах и списки папок, и без сброса кэша имена и размеры файлов были бы видны ещё до истечения таймаута. Zamok при запирании сбрасывает этот кэш через FspFileSystemNotify, и окно Проводника, открытое на папке, сразу показывает запертый вид.

Двойной клик по запертой папке

Сначала я хотел, чтобы окно пароля появлялось по двойному клику по самой папке. Я проверил три способа, и ни один не подошёл.

Способ

Что вышло

Обработчик меню правой кнопки делает «Открыть с паролем» действием по умолчанию у запертых папок

Проводник открывает папки по двойному клику, не спрашивая обработчики меню

Файловая система замечает, что Проводник заходит в запертую папку, и показывает окно пароля

Проводник заходит в корень папки и без двойного клика: рисует миниатюру, проверяет, пустая ли она. Окно выскакивало бы от просмотра соседней папки

Действие папки в реестре с условием AppliesTo, которое подходит только запертым папкам

На запертой папке окно пароля появилось. Обычные папки на моём компьютере после этого начали открываться в VLC

В итоге в запертой папке файловая система показывает один файл Открыть Клиенты.zamok со значком замка. Расширение .zamok регистрируется только для текущего пользователя, и другие папки и программы его не касаются. Двойной клик по значку открывает окно пароля, после пароля файлы появляются в том же окне Проводника. Получается на один двойной клик больше, и обычные папки открываются как раньше.

Окно пароля для папки Documents

Окно пароля для папки Documents

Если в настройках папки включён Windows Hello, при открытии сначала появляется запрос PIN-кода или отпечатка, а поле пароля остаётся запасным путём. Мастер-ключ папки при этом завёрнут ключом из подписи Windows Hello и лежит в %LOCALAPPDATA%\Zamok. Кто знает PIN-код Windows, тот откроет и папку, это написано в настройках рядом с переключателем.

Шифрование на месте

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

  1. Zamok проверяет, что диск NTFS, места хватает на вторую копию папки плюс 10%, файлы не открыты в других программах и папка не системная.

  2. Каждый файл шифруется во временную скрытую копию, сразу расшифровывается обратно в памяти, и его SHA-256 сверяется с оригиналом. Готовый файл отмечается в журнале.

  3. Всё сбрасывается на диск через FlushFileBuffers.

  4. Временная копия переименовывается в .Клиенты.zamok, оригинал в скрытую .Клиенты.zamok-original. На одном диске переименование мгновенное.

  5. На путь папки подключается файловая система в открытом состоянии.

  6. Оригинал удаляется.

Журнал лежит в %LOCALAPPDATA%\Zamok\jobs и переписывается целиком после каждого шага. После сбоя Zamok при старте читает его. Если сбой случился после проверки копии, работа доводится до конца. Если во время копирования, проверенные файлы остаются, и повторное «Зашифровать» с тем же паролем продолжает с места остановки. Перед тем как оставить файл из прошлого раза, Zamok расшифровывает его целиком и сверяет с отпечатком из журнала, а у оригинала сверяет размер, время изменения и номер файла NTFS.

После обычного шифрования и после продолжения прерванной копии результат ещё читается библиотеками криптоматор.

Мастер шифрования, шаг с паролем

Мастер шифрования, шаг с паролем

Формат Cryptomator

Свой формат и свою криптографию я не писал. Zamok хранит данные в формате Cryptomator vault format 8: ключ из пароля получается через scrypt, имена файлов шифруются AES-SIV, содержимое AES-GCM кусками по 32 КБ, а структура папок скрыта. Все алгоритмы берутся из библиотек RustCrypto.

Если Zamok сломается или я перестану его поддерживать, папку откроет Cryptomator, а он есть на винде, маке, линуксе, айосе и андроиде. Совместимость я проверил в обе стороны на хранилищах Cryptomator 1.19.6. При удалении программы рядом с каждой папкой появляется файл «КАК ОТКРЫТЬ Имя.txt» с инструкцией. В репозитории есть ещё zamok-recover, программа для командной строки, которая собирается из исходников: по паролю или ключу восстановления она выгружает расшифрованную копию.

Ключ восстановления это мастер-ключ папки, записанный 44 словами из словаря криптоматора. Мастер создаёт его по умолчанию и после показа просит ввести четыре слова по номерам, чтобы убедиться, что ключ записан. От ключа можно отказаться, тогда мастер предупреждает: без пароля и без ключа данные вернуть нельзя.

Ключ восстановления из 44 слов

Ключ восстановления из 44 слов

Формат прячет содержимое и имена, но не прячет количество файлов и подпапок, примерные размеры файлов и длину имён. Имя самой зашифрованной папки тоже остаётся видимым.

Открытую папку нельзя перетаскивать мышкой

Для Проводника точка подключения выглядит отдельным томом, и перенос открытой папки мышкой он делает копированием и удалением. Файлы копируются на новое место расшифрованными и удаляются из хранилища. Обойти это я не смог. Запертую папку переносить безопасно, внутри неё нет файлов, кроме значка.

zamok-shell.dll работает внутри процесса Проводника, и ошибка в ней роняет все окна с папками. Поэтому она не обращается к диску и сети: список папок она читает из общей памяти, которую публикует фоновая программа Zamok. Тест подменяет функции открытия файлов и сокетов в ntdll и проверяет, что за 20 000 вызовов перехватчика копирования DLL ни разу к ним не обратилась. Каждый вызов занял меньше миллисекунды. Ещё тест 1000 раз подряд открывает меню папки и проверяет, что оно не замедляется и память не растёт.

Следы в Windows

Сам Zamok расшифрованное на диск не пишет, но Windows сохраняет миниатюры, данные для поиска и содержимое памяти в своих файлах. Проверку я сделал отдельным окном в настройках. Оно смотрит, зашифрован ли системный диск, включена ли гибернация, шифруется ли файл подкачки, входят ли папки в индекс поиска и сохраняет ли Проводник миниатюры. Прав администратора окну не нужно, ни одну настройку оно не меняет.

Проверка следов

Проверка следов

Про миниатюры я надеялся, что хватит атрибута «не индексировать», который Zamok ставит на все файлы. Я проверил это на кэше миниатюр своего ноутбука: миниатюра картинки из открытой папки попадает в thumbcache_*.db так же, как из обычной, и остаётся там после запирания. Отключить кэш для одной папки Windows не даёт.

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

Почти все эти следы при краже ноутбука закрывает шифрование системного диска, BitLocker или «Шифрование устройства».

Скорость

Любая зашифрованная файловая система на Windows медленнее обычного диска. У Zamok больше всего проигрыш на создании тысяч мелких файлов, в 9 раз. Замеры я делал на ноутбуке с Intel Core i5-11300H и Windows 10 LTSC 2021, с включённым Defender. В таблице медиана трёх прогонов, в секундах.

Задача

NTFS

Zamok

Распаковка дерева на 20 000 файлов

4,91

45,4

Список файлов дерева

0,54

1,45

git status

0,35

1,29

Копирование файла на 1 ГБ

2,50

4,57

В упреждающем чтении была ошибка. Когда одновременно читались два больших файла, поток пула брал чужую задачу, пока ждал свои куски, повторно заходил в функцию расшифровки и натыкался на занятый буфер. Паника внутри задачи пула роняла весь процесс, и все открытые папки отключались. Она проявилась в проверке на GitHub, которая иногда падала без понятной причины. Тест, который читает восемь файлов параллельно, до исправления падал 5 раз из 5, после проходит.

Как это сделано

Фоновая программа zamok-core, файловая система и криптография написаны на Rust. Компилятор Rust не пропускает целый класс ошибок работы с памятью, которые в программе шифрования становятся уязвимостями. Мастер-ключи и ключи из пароля лежат в памяти, которую Windows не выгружает в файл подкачки. При запирании все ключи стираются через zeroize. Окна написаны на C# и WinUI 3. Установщик собран на WiX и ставит драйвер WinFsp, только если его ещё нет. Права администратора он просит один раз, ради драйвера, сам Zamok ставится для текущего пользователя.

Что не готово

Это альфа. Независимой проверки кода не было. Установщик пока без подписи, поэтому SmartScreen покажет предупреждение, а на Windows 11 с включённым интеллектуальным управлением приложениями Zamok не поставить. Подпись я собираюсь получить через SignPath Foundation, они бесплатно подписывают открытые проекты.

Сам Zamok к сети не обращается. К GitHub ходит только кнопка «Проверить обновления» в настройках и только по нажатию: один или два запроса к списку выпусков, ничего не скачивается.

Репозиторий и установщик: https://github.com/olerast67/zamok
Сайт: https://olerast67.github.io/zamok/ru/