AVZ 5. Руководство пользователя
×

16.35.22. function DeleteFileSecure

function DeleteFileSecure(AFileName, AAlgF : string) : boolean;
 
Выполняет необратимое удаление файла по заданному пользователем алгоритму. Обычное удаление файла состоит в удалении файла из списка имеющихся на диске файлов и пометки занятых под файл кластеров в качестве свободных. При этом  задействованные под файл кластеры физически не очищаются и информация файла остается на диске, что позволяет восстановить стертый файл специализированными утилитами. Необратимое стирание файла предполагает уничтожение содержимого файла перед его удалением по тому или иному алгоритму. Известно множество алгоритмов необратимого удаления, отличающихся набором методов стирания (перезапись нулями, единицами, чередующимся битами, случайной информацией, определенными последовательностями байт), их последовательностью и количеством. Функция DeleteFileSecure позволяет реализовать практически любой алгоритм путем указания "формулы" этого алгоритма в параметре AAlgF.
 
В имени файла AFileName допустимо указывать макросы, подробнее см. в разделе "макросы, допустимые в именах файлов"
 
Алгоритм стирания
Алгоритм стирания задается своеобразной "формулой" - текстовой строкой в аргументе AAlgF. Каждый символ строки кодирует операцию, пробелы и неподдерживаемые символы игнорируются, регистр символов не учитывается. Некоторые операции могут содержать аргументы, указываемые в круглых скобках после кода операции. Отсутствие открывающей или закрывающей скобки является ошибкой.
 
Поддерживаемые коды операций:
 
E - выполняет проверку на наличие файла. Если файл отсутствует, то дальнейшая обработка прерывается. Данная операция обычно применяется в начале формулы.
0 - выполняет перезапись содержимого файла нулями (байтами с кодом 0x00)
1 - выполняет перезапись содержимого файла единицами (байтами с кодом 0xFF)
5  - выполняет перезапись содержимого файла чередованием 0 и 1 (байтами с кодом 0x55)
6  - выполняет перезапись содержимого файла чередованием 1 и 0 (байтами с кодом 0xAA)
R - выполняет перезапись содержимого файла случайными символами
B( ) - выполняет перезапись содержимого файла заданной последовательностью символов. Последовательность указывается в качестве аргумента, побайтно, в круглых скобках, разделителем является запятая. Отсутствие открывающей или закрывающей скобки после операции B является ошибкой, приводящей к прерыванию обработки формулы - т.е. при операции B минимальная конструкция должна иметь вид B( ). Значения байт задаются в шестнадцатеричном виде, минимальное количество байт - один. При описании байт предшествующие нули не обязательны, т.е. к примеру значения "F" и "0F" эквивалентны. Операция B является универсальной, операции "0","1","5" и "6" являются ее частными случаями (соответственно операция 0 эквивалентна "B(00)", "1" - "B(FF)", "5" - "B(55)", "6" - "B(AA)")
A - выполняет выравнивание размера файла на кратный кластеру в большую сторону (для того, чтобы гарантировано стереть данные последнего кластера) путем увеличения размера файла
Z - аналог A, выполняет выравнивание размера файла на кратный кластеру в большую сторону (для того, чтобы гарантировано стереть данные последнего кластера) путем дозаписи в файл байтов с кодом 0
N - инверсия всех байт файла (операция NOT). Для выполнения данной операции содержимое файла считывается с диска, считанные байты инвертируются и записываются в файл
K - замена всех байт файла на их дополнительные коды. Для выполнения данной операции содержимое файла считывается с диска, для считанных байтов вычисляются дополнительные коды и полученный результат записывается в файл
T - урезает длину файла до нулевого размера
C - создает файл нулевого размера. Если файл существует - то его размер урезается до нуля (аналог T)
D - удаляет файл
X - выполняет полную процедуру удаления файла средствами AVZ - включая отложенное удаление
Y - переименование файла. Выполняется несколько раз для того, чтобы усложнить восстановление, основанное на поиске файла по его известному имени или расширению. Перед переименованием дата файла заменяется на случайное значение, что также затрудняет поиск удаленного файла.
F - принудительный сброс кеша файла, для того, чтобы изменения гарантировано записались на диск.
P - удаление привилегий файла, сброс их на "всем разрешено все"
S - сброс кеша для диска, на котором размещен файл.
 
На заметку:
1. Если в алгоритме не указать в завершении D или X, то файл останется на диске
2. Если в алгоритме не указан оператор X, то файл не попадает в список удаленных файлов для эвристической чистки
3. Если файл блокирован, или открыт другим приложением в монопольном режиме  (т.е. запись в него невозможна), то заданная алгоритмом процедура не сработает. Поэтому в любом случае рекомендуется применять операцию X для того, чтобы задействовать механизм отложенного удаления.
 
Совместимость: AVZ 4.32 и выше
 
Примеры:
 
begin
  DeleteFileSecure('c:\top_secret.txt', 'E01TX');
end.
 
В данном примере производится проверка, существует ли файл (E). Если он существует, то файл затирается нулями (0), единицами (1), усекается до нулевой длинны (T) и затем удаляется средствами AVZ (X)
 
begin
  DeleteFileSecure('c:\top_secret.txt', 'EB(AA,55,FF,00)TX');
end.
 
В данном примере производится проверка, существует ли файл (E). Если он существует, то файл затирается повторяющейся последовательностью байт с кодами AA 55 FF 00, усекается до нулевой длинны (T) и затем удаляется средствами AVZ (X)
 
begin
  DeleteFileSecure('c:\top_secret.txt', 'ER01ARTX');
end.
 
В данном примере производится проверка, существует ли файл (E). Если он существует, то файл затирается случайными символами (R), нулями (0), единицами (1), размер файла выравнивается на размер кластера (A), затем файл затирается случайными символами (R), усекается до нулевой длинны (T) и затем удаляется средствами AVZ (X)
 
begin
  DeleteFileSecure('c:\top_secret.txt', 'E0156RA0156RTX');
end.
 
В данном примере производится проверка, существует ли файл (E). Если он существует, то файл нулями (0), единицами (1), символами с кодом 0x55 (5) и 0xAA (6), затем размер файла выравнивается на размер кластера (A), производится повтор процедуры стирания описанными ранее методами (0156R), усекается до нулевой длинны (T) и затем удаляется средствами AVZ (X)
 
begin
  DeleteFileSecure('c:\top_secret.txt', 'E 01 01 01 01 01 01 01 X');
end.
 
В данном примере содержимое файла перед удалением 7 раз перезаписывается нулями и единицами. В данном примере в алгоритме использованы пробелы, которые игнорируются, но повышают наглядность
 
Определение алгоритма через параметры функции позволяет в рамках одного скрипта удалять различные файлы с помощью различных алгоритмов, например:
 
begin
  // Обычное удаление
  DeleteFile('c:\top_secret1.txt');
  // Необратимое удаление
  DeleteFileSecure('c:\top_secret2.txt', 'E RR TX');
  DeleteFileSecure('c:\top_secret3.txt', 'E 01 R X');
end.
 
В случае удаления множества файлов с помощью идентичного алгоритма удобно использовать константы:
 
const
  DelAlg = 'E 01 R A R X';
begin
  DeleteFileSecure('c:\top_secret1.txt', DelAlg);
  DeleteFileSecure('c:\top_secret2.txt', DelAlg);
  DeleteFileSecure('c:\top_secret3.txt', DelAlg);
  DeleteFileSecure('c:\top_secret4.txt', DelAlg);
end.
 
Примеры реализации стандартных алгоритмов
 
1. Быстрое необратимое удаление файла
 
begin
  DeleteFileSecure('c:\top_secret.txt', 'E 0 TX');
  DeleteFileSecure('c:\top_secret1.txt', 'E R TX');
end.
 
Быстрое удаление реализовано в различных утилитах (например Acronis) и сводится к однопроходному стиранию содержимого файла нулями или случайными символами. Данная операция достаточна в большинстве случаев и выполняется достаточно быстро. Данный алгоритм можно усовершенствовать, добавив операции удаления и повторного создания файла - данные операции практически не влияют на быстродействие, но их выполнение затрудняет работу автоматических утилит восстановления файлов
 
begin
  DeleteFileSecure('c:\top_secret.txt', 'E 0 DCZRT X');
end.
 
 
2. Российский стандарт, ГОСТ Р50739-95
 
begin
  DeleteFileSecure('c:\top_secret.txt', 'E R TX');
end.
 
Российская Государственная Техническая Комиссия определяет 6 классов защищенности от несанкционированного доступа. Для классов с 6 по 4 требуется перезаписывать память и содержимое файла нулями (что соответствует формуле "0X"), а для. классов с 3 по 1 требуется перезаписывание  секторов псевдослучайной последовательностью чисел (формула "RX" ). Существующий в настоящее время государственный стандарт ГОСТ Р50739-95 соответствует по своим требованиям
по второму классу защищенности по ГТК. В соответствие с этим стандартом все содержимое файла должно быть перезаписано случайными значениями.
 
3. Алгоритм Брюса Шнайера
 
begin
  DeleteFileSecure('c:\top_secret.txt', 'E 10 RRRRR TX');
end
 
Брюс Шнайер в книге "Прикладная криптография" предложил метод стирания, состоящий из 7 операций: запись логических единиц (0xFF),  нулей (0x00), и 5 проходов стирания содержимого файла последовательностями случайных байт. ((реализуется запросто - формула "10RRRRRX" для обычного и  "" - продвинутого).
 
4. Немецкий стандарт VSITR
 
begin
  DeleteFileSecure('c:\top_secret.txt', 'E 01 01 01 6 TX');
end.
 
Немецкий алгоритм предполагает метод стирания, состоящий из 7 операций, на каждой из которых содержимое файла перезаписывается следующими байтами: 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xAA
 
 
5. Американский стандарт, NAVSO P-5239-26 (MFM)
 
begin
  DeleteFileSecure('c:\top_secret.txt', 'E B(01,00,00,00) B(FF,FF,FF,7F) R TX');
end.
 
Данный алгоритм предполагает стирание в три прохода: 1-й проход - стирание значением 0x01, 2 — 0x7FFFFFFF, 3 — случайные последовательности символов
 
6. Американский стандарт, NAVSO P-5239-26 (RLL)
 
begin
  DeleteFileSecure('c:\top_secret.txt', 'E B(01,00,00,00) B(FF,FF,FF,27) R TX');
end.
 
Данный алгоритм предполагает стирание в три прохода: 1-й проход - стирание значением 0x01, 2 — 27FFFFFF, 3 — случайные последовательности символов
 
7.Американский стандарт: 5220.22-M
 
begin
  DeleteFileSecure('c:\top_secret.txt', 'RKR TX');
end..
 
Данный алгоритм предполагает стирание в три прохода: 1-й проход — случайно выбранные символы в каждый байт каждого сектора, 2 — дополнительные к записанным на 1-м проходе; 3 — случайно выбранные символы
 
8. Алгоритм Питера Гутмана
 
Данный алгоритм очень сложный и громоздкий, предполагает использование 35 (!!) циклов стирания содержимого файла. Подробное описание алгоритма приведено на странице http://www.cs.auckland.ac.nz/~pgut001/pubs/secure_del.html, стоит отметить, что он представляет практическую ценность только для стирания особо ценных данных на магнитных носителях.
 
begin
  DeleteFileSecure('c:\top_secret.txt', 'E RRRR 56 '+
                 'B(92,49,24) B(49,24,92) B(24,92,49)'+
                 '0 B(11)B(22)B(33)B(44)B(55)B(66)B(77)B(88)B(99)B(AA)B(BB)B(CC)B(DD)B(EE) 1'+
                 'B(92,49,24) B(49,24,92) B(24,92,49)'+
                 'B(6D,B6,DB) B(B6,DB,6D) B(DB,6D,B6)'+
                 'RRRR TX');
end.
 
 
Выполнение многопроходной перезаписи содержимого файла в рассмотренных алгоритмах предполагается выполнять для того, чтобы осуществить перемагничивание поверхности диска и затруднить считывание информации специальными техническими средствами (применение данных средств предполагает разборку HDD и установку снятых с него дисков в специальное устройство). Данные методы не повышают защищенность при удалении информации с флеш-накопителей, SSD дисков, могут  быть неэффективны для гибридных HDD (т.е. HDD, содержащих энергонезависимый кеш для часто изменяемых данных),  RAID массивов и сетевых хранилищ (так как последние обычно обладают кешем достаточно внушительного размера и в результате физического многопроходного стирания файла на диске может и не происходить. Поэтому для большинства практических операций достаточно затирания содержимого файла случайными данными с его последующим удалением:
begin
  DeleteFileSecure('c:\top_secret.txt', 'R DCAT X');
end.
 
В данном случае содержимое файла стирается случайными значениями, после чего файл удаляется, вновь создается с нулевой длинной, увеличивается до размера кластера, снова усекается до нулевой длинны и стирается. Подобные пересоздания файла затрудняют работу автоматических утилит, предназначенных для восстановления стертых файлов.
 
На заметку
Для необратимого удаления всех файлов в заданном каталоге или удаления файлов по маске следует применить функцию DeleteFileMask с параметром ASDFormula