多次重写文件以擦除其数据

本文关键字:擦除 数据 文件 重写 | 更新日期: 2023-09-27 18:02:14

在。net中销毁文件时,建议使用橡皮擦或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次。然而,我想知道它到底有多安全,如果有什么方法可以让它更安全?

多次重写文件以擦除其数据

文件系统,特别是通过高级API(如system中的API)访问时。IO在实际的存储实现之上有如此多的抽象层次,因此这种方法对于现代驱动器来说意义不大。

需要明确的是:CodeProject文章提倡多次按名称覆盖文件,这绝对是无稽之谈——至少对于ssd来说是这样。无论如何,不能保证多次写入某个路径上的文件,每次都会写入磁盘上相同的物理位置。

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

可以这样看:硬盘,尤其是固态硬盘,可能会进行一次写入操作,例如"将集群M的字节N设置为0",实际上是将整个新集群写入驱动器上的一个完全不同的位置,以延长驱动器的使用寿命(因为重复写入相同的内存单元可能会损坏驱动器)。

ssd编码-第3部分:页、块和Flash转换层| Code Capsule:

页面不能被覆盖

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

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

即使你会覆盖整个SSD或硬盘驱动器多次,机会是,你的一些非常私人的数据是隐藏在一个现在失效的扇区或页在磁盘或SSD,因为在覆盖或清除它的时刻,驱动器确定该位置是有缺陷的。法医小组将能够读取这些数据(尽管已损坏)。所以,如果你的硬盘上有可能被用来对付你的数据,那就把硬盘扔进火里。

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