C语言中的安全文件删除

5

在C语言中进行安全文件删除

我需要在C语言中进行安全文件删除,以下是我的步骤:

  1. 使用fopen打开文件并获取句柄
  2. 使用lseek/ftell计算文件大小
  3. 根据当前时间或文件大小获取随机种子
  4. 从循环中每次写入256字节的方式将(size)字节写入文件
  5. 使用fflush/fclose关闭文件句柄
  6. 重新打开文件并重复执行步骤3-6约10~15次
  7. 重命名文件并删除

这样做正确吗?因为在Eraser中我读到了“Gutmann 25 passes”的名称,所以我猜25是文件被覆盖的次数,“Gutmann”是指随机化算法?


请注意,至少必须以更新模式打开文件。但即便如此,您也无法保证更新的扇区会写回到相同的位置。(事实上,在SSD上几乎肯定不是这样。) - Hot Licks
5个回答

8
您没有操作系统的合作就无法安全地进行此操作,甚至在操作系统的合作下也常常如此。
当您打开一个文件并向其中写入内容时,并不能保证操作系统会将新文件放在与旧文件相同的磁盘区域。即使它这样做了,您也无法知道新的写入是否会使用与之前相同的簇链。
即使如此,您也不能确定驱动器没有因为某些故障而映射出磁盘块——这将导致您计划的全球统治被保存在一个被标记为坏块但仍可读取的块上。
顺便提一下:25次覆盖已不再必要,在现代GMR驱动器上只需覆盖一次即可,这是因为旧的低密度MFM驱动器存在追踪问题。

那真的毁了我对硬盘工作原理的想象:S,完全没有头绪!那么你认为解决方案会是什么,如果有的话? - killercode
@killercode 对于依赖于操作系统的部分,可以通过使用操作系统函数来确定文件使用了哪些磁盘块,并覆盖它们。对于磁盘上的坏块映射,特别是在具有磨损平衡功能的固态硬盘上,唯一安全的删除方法就是使用非常大的锤子! - Martin Beckett
@杀死了我对硬盘工作原理的想象 - 简单来说是正确的,但文件系统和磁盘可以在幕后进行许多优化。 - Martin Beckett

1

是的,实际上它正在文件上覆盖n个不同的模式。

它通过编写一系列35个模式来擦除要擦除的区域。

选择这些模式的假设是用户不知道驱动器使用的编码机制,因此包括专门为三种不同类型的驱动器设计的模式。知道驱动器使用哪种编码的用户可以仅选择适用于其驱动器的那些模式。具有不同编码机制的驱动器需要不同的模式。

更多信息请点击这里


1

@Martin Beckett是正确的; 除非您完全了解硬件从驱动器一直到底层的所有操作,否则不存在“安全删除”这样的东西。 (即使如此,如果有足够资金的攻击者可以访问物理介质,我也不会打赌他们能恢复多少数据。)

但是假设操作系统和磁盘将重复使用相同的块,则您的方案由于更基本的原因而无法工作:fflush 通常不会向磁盘写入任何内容。

在大多数多任务操作系统(包括Windows、Linux和OS X)上,fflush 仅强制从用户空间缓冲区转移到内核。 然后内核将进行自己的缓冲,只有在感觉合适时才写入磁盘。

例如,在Linux上,您需要调用fsync(fileno(handle))。(或者直接使用文件描述符。)OS X类似。 Windows有FlushFileBuffers

底线:您描述的循环很可能只是覆盖内核缓冲区10-15次,而不是磁盘文件。 在C或C ++中没有可移植的方法来强制数据写入磁盘。 为此,您需要使用平台相关的接口。


0

MFT(主文件表)类似于FAT(文件分配表),MFT记录了:文件在磁盘上的偏移量、文件名、日期/时间、ID、文件大小,甚至是文件数据(如果文件数据适合记录的空白空间,大约为512字节,1个记录大小为1KB)。

注意:新的硬盘数据集设置为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.

0

Gutmann方法适用于旧的磁盘技术编码方案,Gutmann方法的35次擦除方案不再需要,即使Gutmann也承认。请参见:Gutmann方法https://en.wikipedia.org/wiki/Gutmann_method中的批评部分,Gutmann在其中讨论了差异。

通常只需进行几次随机传递即可安全删除文件(可能需要额外的零化传递)。

来自thc.org的secure-delete软件包包含sfill命令,可安全擦除硬盘和inode空间。


目前,没有任何私人数据恢复公司声称可以完全重构被覆盖的数据。我曾在一家数据恢复公司工作过,虽然我们从不会说在文件恢复之前可以恢复文件,但有时我们能够部分恢复文件,偶尔甚至是完整的文件。这个过程非常费时,但我们有一些程序可以辅助完成文件的高概率排列组合。我承认,如果数据被覆盖或由于磁头碰撞导致损坏,我们大约有90%的时间无法恢复有用的内容。 - Chad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接