覆盖文件多次擦除其数据?

覆盖文件多次擦除其数据?

问题描述:

Shredding files in .NET建议使用Eraser或此代码here on CodeProject安全地擦除.NET中的文件。覆盖文件多次擦除其数据?

我试图做我自己的方法,因为来自CodeProject的代码对我有一些问题。这是我想出的:

 public static void secureDelete(string file, bool deleteFile = true) 
    { 
     string nfName = "deleted" + rnd.Next(1000000000, 2147483647) + ".del"; 
     string fName = Path.GetFileName(file); 
     System.IO.File.Move(file, file.Replace(fName, nfName)); 
     file = file.Replace(fName, nfName); 
     int overWritten = 0; 
     while (overWritten <= 7) 
     { 
      byte[] data = new byte[1 * 1024 * 1024]; 
      rnd.NextBytes(data); 
      File.WriteAllBytes(file, data); 
      overWritten += 1; 
     } 
     if (deleteFile) { File.Delete(file); } 
    } 

它似乎工作正常。它随机重命名文件,然后用1 mb的随机数据覆盖7次。但是,我想知道它实际上有多安全,如果有反正我可以让它更安全?

+1

一次写入全零就足够了。但是你必须覆盖旧的部门。你的代码永远不会工作,CodeProj版本至少使用FileMode.Open,这对擦除硬盘是至关重要的。从SSD擦除更困难,您必须覆盖_Disk_。 –

文件系统,尤其是通过System.IO中的更高级别API访问的文件系统,实际存储实现之上的抽象层次如此之多,以至于这种方法对于现代驱动器来说毫无意义。

要清楚:CodeProject文章,促进多次覆盖文件绝对是废话 - 至少SSD。不能保证多次写入某个文件的文件时,每次都写入磁盘上的同一个物理位置。

当然,打开一个具有读写访问权限的文件并从头开始覆盖它,从概念上写入相同的“位置”。但是那个位置很抽象。

请看这样:硬盘,特别是固态硬盘,可能会写入数据,例如“将集群M的字节N设置为O”,并且实际上将整个新集群写入完全不同的位置在驱动器上,延长驱动器的使用寿命(因为重复写入同一个存储单元可能会损坏驱动器)。

Coding for SSDs – Part 3: Pages, Blocks, and the Flash Translation Layer | Code Capsule

页面不能被覆盖

一种NAND Flash网页可以写入只有当它处于“自由”状态。当数据改变时,页面的内容被复制到内部寄存器中,数据被更新,并且新版本被存储在“空闲”页面中,称为“读取 - 修改 - 写入”的操作。数据未就地更新,因为“空闲”页面与最初包含数据的页面不同。一旦数据被保存到驱动器中,原始页面将被标记为“陈旧”,并保持原样,直到被删除。

这意味着在驱动器上的某个位置,原始数据仍然是可读的,即在要求写入的群集M中。也就是说,直到它被覆盖。群集现在被标记为“空闲”,但您需要对磁盘进行非常低级别的访问才能访问该群集以覆盖该群集,而且我不确定SSD可以实现这一点。

即使您多次覆盖整个SSD或硬盘驱动器,也有可能您的一些非常隐私的数据隐藏在磁盘或SSD上现已不存在的扇区或页面中,因为在覆盖或清除驱动器确定该位置有缺陷。法医团队将能够读取这些数据(尽管受损)。因此,如果您的硬盘上有数据可用于对付您:将硬盘扔进火中。

另请参阅Get file offset on disk/cluster number了解有关更低级别文件系统API的更多信息(链接)。

但是所有这些都需要花费相当多的盐,因为所有这些都是传闻,而且我对这种磁盘访问级别没有实际经验。

+0

好的,那么你建议我用什么方法来安全地删除文件? –

+0

我绝不是文件系统,也不是安全专家,但一般的方法是:找到文件当前正在使用的磁盘上的物理位置(甚至可能是_if_),覆盖_those_,然后从文件中删除所有提及的文件文件系统。请注意,'File.Delete()'也不会做后者,它只是将_marks_文件系统记录为已删除。 – CodeCaster

+0

但是,即使他们知道文件的位置,他们实际恢复的机会是否很小?我从这个线程读取http://stackoverflow.com/questions/59656/why-overwrite-a-file-more-than-once-to-securely-delete-all-traces-of-a-file/60193#60193 “试图恢复整个字节只有准确的0.97%的时间。”那么是否真的有点我试图覆盖它? –