![](https://habrastorage.org/webt/rq/ly/c3/rqlyc3cay_fpuzhtju8gsbtax64.jpeg)
Задача
При внедрении электронного архива в организации нам предстояло автоматизировать уничтожение документов электронного архива. Сам архив представляет собой систему Directum, в которой при помощи встроенного инструмента разработки IS-Builder написано большое количество логики по приему документов в архив из систем-источников, преобразованию форматов электронных подписей документов, предоставлению и отзыву прав доступа к целым делам или отдельным документам. Тексты документов архива хранятся на магнитном носителе, и при проведении регламентной процедуры удаления с носителя должны безвозвратно удаляться файлы только тех документов, срок хранения которых истек. То есть об уничтожении целого носителя не могло быть и речи, и задача состояла в поиске подходящего инструмента уничтожения данных документа на носителе.
Поскольку процесс удаления документов реализован тоже на IS-Builder, то и средство уничтожения файлов мы искали такое, работой которого можно управлять из кода на встроенном языке программирования системы Directum. С точки зрения быстродействия, к инструменту предъявлялось требование: инструмент должен тратить не более одной секунды на уничтожение файла размером один мегабайт. Что касается алгоритма, применяемого инструментом для уничтожения данных, то обязательно соответствие ГОСТ Р 50739-95, и приветствуется поддержка нескольких алгоритмов для возможности выбора. Также инструмент должен быть свободно распространяемым и бесплатным для коммерческого использования.
Большинство инструментов, информацию о которых удалось найти поиском в интернете, не удовлетворяли поставленным требованиям, так как были утилитами только с графическим интерфейсом, без возможности программного взаимодействия. Для более детального изучения были выбраны лишь:
- утилита SDelete из набора Sysinternals;
- Eraser – утилита с интересным подходом к уничтожению;
- ну и на реализацию инструмента прямо на IS-Builder мы тоже возложили надежду.
Как мы тестировали
Для тестирования мы подготовили на жестком диске небольшой раздел, чтобы было проще окинуть взглядом наш театр военных действий. На этом диске мы создавали файлы, уничтожали их разными способами и затем смотрели, что от них осталось. Уничтожение считается успешным, если выполнено со скоростью не ниже требуемой, и не удается найти ни одного фрагмента исходного файла. А чтобы сравнение инструментов было честным, для уничтожения файлов во всех инструментах был применен один и тот же алгоритм, поддерживаемый ими всеми – DOD 5220.22-M, формально удовлетворяющий и требованиям ГОСТ.
Для контроля результатов уничтожения мы использовали следующие инструменты:
- WinHex – условно бесплатная утилита, получающая доступ к содержимому носителя на низком уровне, позволяющая искать данные по фрагменту содержимого и восстанавливать их;
- DiskView – еще одна утилита от Sysinternals. Она использовалась скорее в процессе, чем для контроля результатов – с ее помощью мы наблюдали «географию» расположения фрагментов файлов в кластерах на диске.
Инструмент на IS-Builder
Суть алгоритма DOD 5220.22-M достаточно простая, и мы реализовали его на встроенном языке программирования системы Directum. На вход алгоритм получает имя файла и запрашивает у файловой системы его размер в байтах. Затем три раза генерируется буфер вычисленного размера, который записывается в указанный файл. Красота подхода в том, что алгоритм уничтожения может быть реализован совершенно любой, с любым количеством проходов и самыми немыслимыми шаблонами перезаписи. Кроме того, поскольку инструмент реализуется на IS-Builder без зависимостей от внешнего ПО, со встраиванием его в прикладную разработку системы Directum не возникает совершенно никаких сложностей. И работает-то он быстро. Вот только не уничтожает данные! WinHex обнаружил на диске не просто фрагменты исходного файла, а весь файл целиком и успешно его восстановил. Выяснилось, что в момент записи первого же буфера на диск местоположение файла на диске меняется: исходный файл располагался в начале раздела, а оказался посередине или в конце. Это мы выяснили с помощью DiskView. Исходные же кластеры хоть и помечены свободными, но все еще содержат в себе данные. Это, разумеется, никуда не годится. Способы записи в файл использовали разные, результат везде одинаковый, данные можно найти и восстановить. Получается, мы можем генерировать буфер для перезаписи, но не можем правильно записать его на диск. И поскольку рабочих схем найти не удалось, пришлось попрощаться с идеей обойтись встроенными в Directum средствами.
SDelete
docs.microsoft.com/en-us/sysinternals/downloads/sdelete
В утилите SDelete от Sysinternals реализован всего один алгоритм удаления (DOD 5220.22-M), но можно указать количество проходов перезаписи, уничтожить дерево каталогов со всем содержимым и даже выполнить «зачистку» незанятого места на диске. SDelete является утилитой командной строки и имеет всего несколько ключей, так что вызвать ее из вычислений IS-Builder несложно:
SDelete = "C:\Sysinternals\SDelete\sdelete.exe"
Command = Format('"%s" -p 1 "%s"'; ArrayOf(SDelete; Filename))
ExecuteProcess(Command; smNormal; wmYes)
В результате применения утилиты файлы исчезли с диска практически бесследно: с помощью WinHex удалось обнаружить только следы перезаписи имени файла, но содержимое найти и восстановить не удалось. При этом работала утилита довольно быстро (удаление файла размером 1 мегабайт = 0,2 секунды) и заслуженно вырвалась в лидеры.
Eraser
eraser.heidi.ie
Бесплатная утилита с графическим интерфейсом. Что отличает Eraser от остальных, так это работа с очередью заданий на уничтожение. Если вы захотите удалить что-то, то вы должны создать соответствующую задачу и добавить ее в очередь. Каждая задача в очереди Eraser – это совокупность информации:
- об объекте уничтожения – это может быть конкретный файл или каталог, содержимое «Корзины» пользователя, незанятое место на диске. Это также может быть безопасное перемещение файлов или папок или полная очистка раздела на жестком диске;
- об алгоритме уничтожения – Eraser знает несколько готовых алгоритмов перезаписи, а также предлагает возможность создать свои собственные, настроив необходимое количество проходов и указав для каждого из них свой шаблон данных для перезаписи;
- о времени старта – задача может быть выполнена непосредственно после помещения в очередь, по расписанию, при загрузке операционной системы или вручную.
Работающий в фоне процесс Eraser занимается обработкой очереди и выполнением задач. Таким образом, уничтожение данных в Eraser – это всегда асинхронный процесс, очень напоминающий серверные события в Directum.
Управление утилитой с помощью ключей командной строки тоже работает, причем давно, хотя работа в командной строке до сих пор официально не заявлена и находится в статусе разрабатываемой функциональности:
Eraser = "C:\Program Files\Eraser\Eraser.exe"
Command = Format('"%s" erase /method="ecbf4998-0b4f-445c-9a06-23627659e419" /quiet file="%s"'; ArrayOf(Eraser; Filename))
ExecuteProcess(Command; smNormal; wmYes)
Уничтожение файла с помощью Eraser выполнено успешно. Оценить скорость работы не вышло в силу асинхронности уничтожения. С точки зрения использования в прикладной разработке смущает подвешенный статус работы в командной строке, но возможность создавать произвольные методы уничтожения выглядит интересной.
Результаты
Если бы не досадный фэйл с записью буфера на диск, реализация на IS-Builder выглядела бы на миллион, но, увы, до финиша она не дошла. Два других инструмента показали себя гораздо лучше, при этом наиболее выигрышно выглядит утилита SDelete. Она не требует установки, обладает хотя и минимальным, но достаточным функционалом и хорошим быстродействием.