Безопасное удаление файла в C

Безопасное удаление файлов в C

Мне нужно безопасно удалить файл в C, вот что я делаю:

  1. использование fopen чтобы получить дескриптор файла
  2. рассчитать размер с помощью lseek/ftell
  3. получить случайное начальное число в зависимости от текущего времени или размера файла
  4. запись (размер) байтов в файл из цикла с 256 байтами, записанными в каждой итерации
  5. fflush/fclose дескриптор файла
  6. повторно откройте файл и повторите шаги 3-6 для 10~15 раз
  7. переименуйте файл, затем удалите его

Так ли это? Поскольку в Eraser я читаю название "25 проходов Гутмана", я предполагаю, что 25 - это количество перезаписываний файла, а "Гутманн" - алгоритм рандомизации?

5 ответов

Решение

Вы не можете сделать это безопасно без сотрудничества с операционной системой - и часто даже тогда.

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

Даже в этом случае вы не уверены, что диск не отобразил блок диска из-за какой-то ошибки - оставив свои планы мирового господства над блоком, который помечен как плохой, но все еще читаемый.

ps - 25-кратная перезапись больше не требуется, она была необходима на старых MFM-дисках низкой плотности с плохим отслеживанием головки. На современных дисках GMR перезаписи раз достаточно.

@ Мартин Беккет прав; существует такая вещь, как "безопасное удаление", если вы не знаете всего о том, что аппаратное обеспечение делает вплоть до накопителя. (И даже тогда я не стал бы делать ставку на то, что достаточно хорошо финансируемый злоумышленник может восстановить при доступе к физическому носителю.)

Но при условии, что ОС и диск будут повторно использовать одни и те же блоки, ваша схема не работает по более простой причине: fflush вообще ничего не пишет на диск.

В большинстве многозадачных операционных систем (включая Windows, Linux и OS X), fflush просто вводит данные из буфера пользовательского пространства в ядро. Затем ядро ​​выполнит свою собственную буферизацию, записывая на диск только тогда, когда это необходимо.

В Linux, например, вам нужно позвонить fsync(fileno(handle)), (Или просто используйте файловые дескрипторы в первую очередь.) OS X похожа. Windows имеет FlushFileBuffers,

Итог: цикл, который вы описываете, скорее всего просто перезапишет буфер ядра 10-15 раз вместо файла на диске. В C или C++ нет переносимого способа принудительного переноса данных на диск. Для этого вам нужно использовать платформо-зависимый интерфейс.

Да, на самом деле это переписывает разные шаблоны на файл

Это делается путем написания серии из 35 шаблонов для области, которая будет стерта.

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

Более подробная информация здесь.

MFT(основная таблица файлов), аналогичная FAT (таблица размещения файлов), MFT хранит записи: смещения файлов на диске, имя файла, дату / время, идентификатор, размер файла и даже данные файла, если данные файла помещаются в пустое пространство записи, которое около 512 байт,1 размер записи 1 КБ.

Примечание: новые данные HDD установлены в 0x00.(Просто сообщите)

Допустим, вы хотите перезаписать file1.txt ОС MFT находит это смещение файла внутри записи. вы начинаете перезаписывать file1.txt с двоичного файла (00000000) в двоичном режиме.

Вы перезапишете данные файла на диск на 100%, поэтому MFT имеет смещение файла на диске. после того, как вы переименуете его и удалите.

ПРИМЕЧАНИЕ. MFT пометит файл как удаленный, но вы все равно сможете получить некоторые данные об этом файле, например, дату / время: создано, изменено, доступно. смещение файла, атрибуты, флаги.

1- create folder in c:\  and move file and in same time rename in to folder( use rename function ) rename file to 0000000000 or any another without extention 

2- overwrite file with 0x00 and check if file was overwrited

3- change date/time

4- make without attributes

5- leave file size untouched OS faster reuse empty space.

6- delete file

7- repeat all files (1-6)

8- delete folder

or

(1, 2, 6, 7, 8)

9- find files in MFT remove records of these files.

Метод Гутмана хорошо работал для более старых схем кодирования дисковых технологий, и схема 35-проходной очистки метода Гутмана больше не требуется, что признает даже Гутман. См. Метод Гутмана по адресу: https://en.wikipedia.org/wiki/Gutmann_method в разделе "Критика", где Гутман обсуждает различия.

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

Пакет secure-delete из thc.org содержит команду sfill для безопасного стирания дискового и дискового пространства на жестком диске.

Другие вопросы по тегам