В статье не будет рассматриваться удаление файлов, размещенных на SSD (или других немагнитных носителях), так как в них используются другие принципы записи и хранения информации. Также не рассматривается физическое уничтожение носителя файла. Для простоты не учитывается, что у уничтожаемого файла могли быть копии, а также во время хранения файла была выполнена дефрагментация данных на носителе.
В упрощенном виде жесткий диск можно представить как круг, который поделен радиальными дорожками. Каждая дорожка, свою очередь, делится на сектора. Сектора могут объединяться в кластеры. Минимальная адресуемая единица — сектор, его размер обычно составляет 512 байт.
Файл на жестком диске хранится «по частям». Т.е. если размер файла больше, чем размер сектора, то тело файла распределяется по свободным секторам диска. А информация о размещении файла на диске записывается в специальный раздел диска — таблицу размещения файлов.
При удалении файла тело файла остается на диске (в большинстве файловых систем). В таблице размещения файлов соответствующий файл помечается как удаленный, а занятые им сектора становятся «свободными» для записи. Но само тело файла в этих секторах остается. Если эти сектора ничем не занять, то удаленный файл вполне можно восстановить. Этот принцип лежит в основе работы множества утилит восстановления удаленных файлов.
Но даже если тело удаленного файла перезаписать, например, «нулями». То по-прежнему существует возможность восстановления информации из-за эффекта остаточной намагниченности.
Допустим, логические «1» и «0» характеризуются аналоговыми уровнями намагниченности +10 и -10 единиц, соответственно. То есть если головка диска считывает уровень +10, то это «1», если -10, то это «0» — происходит преобразование аналогового сигнала в цифровой.
Аналоговый сигнал будет далек от «идеальных» +10 и -10. На самом деле у него будет какой-то разброс, к примеру от +8,5 до +11,5 – это будет «1». А от -11 до -9 – «0». Разброс будет обусловлен многими факторами, в том числе и эффектом остаточной намагниченности.
Рассмотрим пример. Какой-то бит информации закодирован как «1» и с него считывается +9,8 единиц. Затем этот бит перезаписали в «0». С него стало считываться не ровно -10, а допустим -9 единиц. Разница аналогового сигнала в +1 единицу от «идеального» значения может говорить о том, что ранее этот бит скорее всего имел противоположное значение. Таким образом, можно попытаться восстановить информацию, конечно, если для этого есть соответствующий инструмент. Но чем плотнее друг к другу находятся биты информации на диске, тем менее вероятно восстановление.
Для уменьшения или исключения вероятности восстановления информации были разработаны алгоритмы безвозвратного удаления информации. Суть всех алгоритмов схожа — нужно перезаписать участки, на которых находился файл, некоторой информацией несколько раз.
Для гарантированного уничтожения лучше всего подойдет механическое уничтожение носителя (например перемалывание в мельнице) или физическое уничтожение информации (например размагничивание в сильном магнитном поле), но такие способы могут быть дороги, ведь придется уничтожить рабочий носитель, который сам по себе стоит недешево.
Также может возникнуть ситуация, когда требуется безвозвратно удалить только часть информации, находящейся на диске. И тогда физический или механический способы не подойдут. Тогда на помощь придут программные способы безвозвратного удаления. Алгоритмов удаления существует очень много, в статье рассмотрены наиболее известные.
Существуют несколько редакций алгоритма.
В одной из редакций используется три прохода по файлу. В первый раз файл перезаписывается нулевыми битами, второй – единичными битами, третий - случайной последовательностью из нулей и единиц. А, например, редакция "Е" предусматривает тоже три прохода по телу файла, но другой алгоритм:
В редакции "ЕСЕ" используется уже семь проходов, где чередуются проходы, использующиеся в редакции "Е".
ГОСТ Р 50739-95 определяет, что стирание производится путем записи в нее маскирующей информации, но количество циклов и содержание маскирующей информации не регламентируется. Однако многие считают, что ГОСТ использует два прохода: на первом файл затирается последовательностью из нулевых бит, а на втором — случайной последовательностью.
Есть две версии алгоритма. Первая просто перезаписывает файл последовательностью нулей. Вторая, трехпроходовая версия, аналогична одной из редакций американского стандарта DoD – сначала файл перезаписывается нулями, потом единицами и в завершение — случайной последовательностью.
Семипроходовый алгоритм. Сначала выполняются два прохода с перезаписыванием файла нулевыми и единичными последовательностями. Затем эти два прохода повторяются еще два раза. И седьмой проход из случайной последовательности.
Снова семипроходовый алгоритм.
Достаточно надежный алгоритм, хотя, сам Шнайдер как-то заявил:
Алгоритм состоит из 35 проходов. Считается самым параноидальным надежным. И одновременно самым медленным.
В первые четыре прохода записываются случайно выбранные символы в каждый байт каждого сектора, с 5 по 31 проход происходит запись определенной последовательности символов из специальной таблицы, в последние 4 прохода снова записываются случайно выбранные символы.
Таблица для перезаписи данных в проходах с 5 по 31 была рассчитана разработчиками алгоритма Питером Гутманом и Коллином Пламбом. Данные в таблице являются «универсальными» для дисков, в которых применяются методы аналого-цифрового преобразования последних лет. Сам Гутманн про использование своего метода говорит:
Другими словами, если точно известно, какой метод кодирования используется в конкретном устройстве хранения, то нужно использовать лишь определенные проходы, подходящие для этого метода. Но часто используются все 35 проходов.
В качестве бонуса библиотека, которая поддерживает удаление файлов по описанным выше алгоритмам, а ниже — пример isbl-кода, с подключением библиотеки и удалением файла:
FileName = "c:\temp\secretDoc.doc"
ShredderAlgo = "" // gost, hmg1, hmg3, vsitr, dod, rcmp, schneier, gutmann,
Shredder = CreateObject("Directum.FileShredder.Shredder")
ShredderResult = Shredder.ShredFile(FileName; ShredderAlgo)
if ShredderResult <<>> ''
Error = Format('При уничтожении файла (%s) возникла ошибка: %s'; ArrayOf(FileName; ShredderResult))
Raise(CreateException(''; Error; ecWarning))
endif
Shredder = nil
>>В статье не будет рассматриваться удаление файлов, размещенных на SSD
Т.е. все более популярный и доступный и дешевеющий способ хранения данных обойден стороной?
Денис, описанные в статье алгоритмы применимы для магнитных носителей. SSD к таковым не относится, поэтому в этой статье эти носители не рассматриваются.
Т.е. если у пользователя стоит SSD, то представленная библиотека абсолютна бесполезна?
Дмитрий, да, из-за приниципиально физических методов чтения-записи будет бесполезна.
Даже если попытаться перезаписать файл другими данными, то контроллер SSD скорее всего будет искать свободные для записи ячейки и перезаписываемая информация будет лежать "параллельно".
Для чистого удаления файлов в SSD-дисках на уровне протоколов реализованы команды TRIM и Secure erase.
Но и они не всегда могут помочь (да и, к примеру, Secure erase не на всех дисках есть). Т.к. это команды аппаратные, то встречаются особенности, которые зависят от контроллера, который управляет SSD.
Коротко попытался объяснить. А так это отдельная интересная тема.
Алексей, просим отдельную тему! очень интересно.
Авторизуйтесь, чтобы написать комментарий