-1

.NET 中的粉碎文件中,建议使用EraserCodeProject上的此代码来安全地擦除 .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 次。但是,我想知道它实际上有多安全,如果有的话我可以让它更安全吗?

4

1 回答 1

6

文件系统,尤其是当通过更高级别的 API(例如 System.IO 中的 API)访问时,在实际存储实现之上的抽象级别如此之多,以至于这种方法对现代驱动器几乎没有意义。

需要明确的是:CodeProject 文章提倡按名称多次覆盖文件,这绝对是胡说八道——至少对于 SSD 而言。无法保证多次写入某个路径上的文件每次都会写入磁盘上的相同物理位置。

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

像这样看:硬盘,尤其是固态驱动器,可能需要写入,例如“将集群 M 的字节 N 设置为 O”,实际上将整个新集群写入驱动器上完全不同的位置,以延长驱动器的使用寿命(因为重复写入相同的存储单元可能会损坏驱动器)。

来自SSD 编码 – 第 3 部分:页面、块和闪存转换层 | 代码胶囊

页面不能被覆盖

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

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

即使您将多次覆盖整个 SSD 或硬盘驱动器,您的一些非常私密的数据也可能隐藏在磁盘或 SSD 上现已失效的扇区或页面中,因为在覆盖或清除它时驱动器确定那个位置有缺陷。取证团队将能够读取此数据(尽管已损坏)。所以,如果你的硬盘上有数据可以用来对付你:把硬盘扔进火里。

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

但所有这一切都需要一粒盐,因为所有这些都是道听途说,我对这种级别的磁盘访问没有实际经验。

于 2016-08-13T18:13:49.937 回答