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

Jus*_*n G -1 c# windows file shred

.NET中的Shredding文件中,建议在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); }
    }
Run Code Online (Sandbox Code Playgroud)

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

Cod*_*ter 5

文件系统,特别是通过更高级别的API(例如System.IO中的API)访问时,实际存储实现之上的抽象级别如此之多,以至于这种方法对于现代驱动器而言毫无意义.

需要明确的是:CodeProject文章提醒多次使用名称覆盖文件,这绝对是无稽之谈 - 至少对于SSD而言.无法保证每次在某个路径上写入文件多次写入磁盘上的相同物理位置.

当然,打开具有读写访问权限的文件并从头开始覆盖它,从概念上写入相同的"位置".但那个位置非常抽象.

看起来像这样:硬盘,但特别是固态硬盘,可能需要写入,例如"将集群M的字节N设置为O",并实际将整个新集群写入驱动器上完全不同的位置,以延长驱动器的生命周期(因为重复写入相同的存储器单元可能会损坏驱动器).

来自SSD的编码 - 第3部分:页面,块和Flash转换层| 代码胶囊:

页面无法覆盖

NAND闪存页面只有在处于"空闲"状态时才能写入.当数据改变时,页面内容被复制到内部寄存器中,数据被更新,新版本被存储在"空闲"页面中,这个操作称为"读 - 修改 - 写".数据未就地更新,因为"免费"页面与最初包含数据的页面不同.一旦数据持久保存到驱动器,原始页面将被标记为"陈旧",并将保持原样,直到它被删除.

这意味着在驱动器的某处,原始数据仍然是可读的,即在请求写入的集群M中.也就是说,直到它被覆盖.群集现在标记为"免费",但您需要对磁盘进行非常低级别的访问才能访问该群集以覆盖它,我不确定SSD是否可行.

即使您多次覆盖整个SSD或硬盘驱动器,很可能您的某些非常私密的数据隐藏在磁盘或SSD上现已不存在的扇区或页面中,因为在覆盖或清除它时,驱动器确定该位置有缺陷.取证团队将能够读取此数据(尽管已损坏).因此,如果您的硬盘驱动器上有数据可以用来对付您:将驱动器投入火中.

另请参阅获取有关较低级别文件系统API的更多信息(链接)的磁盘/群集号上的文件偏移量.

但所有这些都需要花费很多,因为所有这些都是道听途说,而且我没有这种级别的磁盘访问的实际经验.

  • @JustinG删除文件的唯一安全方法是没有磁盘上的文件.考虑切换到将文件存储在加密容器中,删除后字节仍然在磁盘上,但这会增加恢复数据的难度,特别是如果它们只有加密容器的不完整视图. (2认同)
  • SSD不是唯一的问题.[copy-on-write filesystem](https://en.wikipedia.org/wiki/Copy-on-write#Copy-on-write_in_computer_storage)将通过文件系统访问几乎不可能覆盖文件的数据. (2认同)