为什么要多次覆盖文件以安全删除文件的所有痕迹?

时间:2020-03-05 18:52:26  来源:igfitidea点击:

建议使用橡皮擦之类的橡皮擦程序将数据覆盖36次。

据我了解,所有数据都以1s或者0s的形式存储在硬盘中。

如果对整个文件执行一次随机的1和0覆盖,那为什么还不足以删除原始文件的所有痕迹?

解决方案

回答

有些"磁盘修复"类型的应用程序和服务即使格式化后仍可以从硬盘中读取数据,因此,如果我们确实需要安全擦除某些内容,仅用随机的1和0一次覆盖就不够了。

我想说,对于普通用户而言,这已经足够了,但是如果我们处于高安全性环境(政府,军事等)中,那么我们需要更高级别的"删除",才能有效地保证无法从驱动器恢复任何数据。

回答

曾经是0,然后变为" 1"的硬盘位,其磁场强度比以前是1,然后再次写入1的磁场弱。使用敏感的设备,通过测量强度的细微变化,可以以合理的准确度识别出每个位的先前内容。结果将不完全正确,并且会出现错误,但是可以检索到以前内容的很大一部分。

到我们对这些位进行了35次涂抹时,实际上已经无法分辨过去的内容了。

编辑:现代分析表明,仅56%的精度即可恢复单个被覆盖的位。尝试恢复整个字节的准确时间仅为0.97%。所以我只是在重复一个城市的传说。当使用软盘或者其他介质时,可能需要多次重写,但硬盘不需要。

回答

用常规术语来说,当将一个磁盘写入磁盘时,介质记录为一个,而当写入零磁盘时,介质记录为零。但是,当用1覆盖零时,实际效果更接近于0.95;当用1覆盖零时,实际效果接近1.05. 设置了常规磁盘电路,以便将这两个值都读为1,但是使用专用电路,可以计算出先前包含的"层"。通过使用高质量的数字采样示波器从模拟头电子设备读取信号,将采样的波形下载到PC并在软件中进行分析,至少要恢复一层或者两层覆盖的数据并不难。恢复先前记录的信号。该软件的作用是生成一个"理想的"读取信号,并从实际读取的信号中减去该信号,从而使前一个信号的残留量成为差值。由于商用硬盘驱动器中的模拟电路远不及用于采样信号的示波器电路的质量,因此能够恢复很多硬盘电子设备无法利用的额外信息(尽管更新了)通道编码技术(例如PRML(需要进一步说明))需要大量的信号处理,因此不再可能使用简单的工具(例如示波器)直接恢复数据)

http://www.cs.auckland.ac.nz/~pgut001/pubs/secure_del.html

回答

我们在这里看到的被称为"数据剩余性"。实际上,大多数反复覆盖的技术(无害)的作用超出了实际需要。曾经尝试过从已被覆盖数据的磁盘中恢复数据,除了一些实验情况外,实际上没有成功的例子。

当我们谈论恢复方法时,首先,我们会看到磁力显微镜是解决偶然覆盖问题的灵丹妙药,但是即使没有记录到成功,也可以通过在整个区域写入良好的二进制数据模式来消除磁性媒体(而不是简单的0000000000s)。

最后,我们所指的36个(实际上是35个)覆盖今天已被认为是过时和不必要的,因为该技术(称为Gutmann方法)旨在适应RLL等技术中使用的各种用户编码方法(通常是未知的)以及我们不太可能碰到的MFM。甚至美国政府的指导方针都指出,一个覆盖就足以删除数据,尽管出于管理目的,他们认为这对于"清理"是不可接受的。造成这种差异的建议原因是,磁盘硬件可以将"坏"扇区标记为坏扇区,并且在进行覆盖时没有适当地覆盖它们,因此,有可能对磁盘进行外观检查以恢复这些扇区。地区。

最后,使用1010101010101010或者相当随机的模式进行写入足以将数据擦除到已知技术无法恢复的水平。

回答

"数据剩余"
Wikipedia上有很多有关可能的攻击及其实际可行性的参考。
那里也引用了DoD和NIST标准和建议。
底线是可能的,但变得越来越难从磁性介质中恢复覆盖的数据。但是,某些(美国政府)标准仍然需要至少多次覆盖。同时,设备内部结构继续变得更加复杂,即使重写后,驱动器或者固态设备也可能会意外复制(请考虑坏的块处理或者闪存损耗平衡(请参阅Peter Gutmann)。驱动器。

回答

美国对删除敏感信息(即"最高机密"信息)提出了破坏驱动器的要求。基本上,将驱动器放入具有巨大磁铁的机器中,并且还会物理破坏驱动器以进行处置。这是因为有可能读取驱动器上的信息,甚至被多次覆盖。

回答

我一直想知道为什么不考虑文件先前存储在磁盘上其他物理位置的可能性。

例如,如果刚刚发生了碎片整理,则很容易会有该文件的副本,该副本很容易在磁盘上的其他位置恢复。

回答

想象一下物理磁盘上的数据扇区。在该扇区内是磁性图案(条带),其对存储在该扇区中的数据位进行编码。该模式由一个写入头写入,当磁盘在其下方旋转时,该写入头或者多或者少是静止的。现在,为了使硬盘驱动器在每次将新的磁条带写入一个扇区时都能正确地用作数据存储设备,它必须将该扇区中的磁条复位足够,以便以后读取。但是,它不必完全擦除先前磁模式的所有证据,它只必须足够好(并且由于今天使用的纠错量足够好,不一定就足够好)。考虑到写头将不会总是与给定扇区上一次通过的轨迹相同(它可能会向左或者向右倾斜一点,它可能会以一种方式或者另一种方式以微小角度越过该扇区)振动等)

我们将获得一系列磁性图案,其中最强的图案对应于最后一次写入数据。使用正确的工具,可能有足够详细的信息来读取模式的分层,从而能够确定较旧层中的某些数据。

数据是数字的,这是有帮助的,因为一旦我们提取了给定层的数据,我们就可以准确确定用于将其写入磁盘的磁模式,并从读数中减去它(然后在下一个操作中层和下一个)。

回答

这是我整理的一个Gutmann擦除实现。它使用密码随机数生成器生成强大的随机数据块。

public static void DeleteGutmann(string fileName)
{
    var fi = new FileInfo(fileName);

    if (!fi.Exists)
    {
        return;
    }

    const int GutmannPasses = 35;
    var gutmanns = new byte[GutmannPasses][];

    for (var i = 0; i < gutmanns.Length; i++)
    {
        if ((i == 14) || (i == 19) || (i == 25) || (i == 26) || (i == 27))
        {
            continue;
        }

        gutmanns[i] = new byte[fi.Length];
    }

    using (var rnd = new RNGCryptoServiceProvider())
    {
        for (var i = 0L; i < 4; i++)
        {
            rnd.GetBytes(gutmanns[i]);
            rnd.GetBytes(gutmanns[31 + i]);
        }
    }

    for (var i = 0L; i < fi.Length;)
    {
        gutmanns[4][i] = 0x55;
        gutmanns[5][i] = 0xAA;
        gutmanns[6][i] = 0x92;
        gutmanns[7][i] = 0x49;
        gutmanns[8][i] = 0x24;
        gutmanns[10][i] = 0x11;
        gutmanns[11][i] = 0x22;
        gutmanns[12][i] = 0x33;
        gutmanns[13][i] = 0x44;
        gutmanns[15][i] = 0x66;
        gutmanns[16][i] = 0x77;
        gutmanns[17][i] = 0x88;
        gutmanns[18][i] = 0x99;
        gutmanns[20][i] = 0xBB;
        gutmanns[21][i] = 0xCC;
        gutmanns[22][i] = 0xDD;
        gutmanns[23][i] = 0xEE;
        gutmanns[24][i] = 0xFF;
        gutmanns[28][i] = 0x6D;
        gutmanns[29][i] = 0xB6;
        gutmanns[30][i++] = 0xDB;
        if (i >= fi.Length)
        {
            continue;
        }

        gutmanns[4][i] = 0x55;
        gutmanns[5][i] = 0xAA;
        gutmanns[6][i] = 0x49;
        gutmanns[7][i] = 0x24;
        gutmanns[8][i] = 0x92;
        gutmanns[10][i] = 0x11;
        gutmanns[11][i] = 0x22;
        gutmanns[12][i] = 0x33;
        gutmanns[13][i] = 0x44;
        gutmanns[15][i] = 0x66;
        gutmanns[16][i] = 0x77;
        gutmanns[17][i] = 0x88;
        gutmanns[18][i] = 0x99;
        gutmanns[20][i] = 0xBB;
        gutmanns[21][i] = 0xCC;
        gutmanns[22][i] = 0xDD;
        gutmanns[23][i] = 0xEE;
        gutmanns[24][i] = 0xFF;
        gutmanns[28][i] = 0xB6;
        gutmanns[29][i] = 0xDB;
        gutmanns[30][i++] = 0x6D;
        if (i >= fi.Length)
        {
            continue;
        }

        gutmanns[4][i] = 0x55;
        gutmanns[5][i] = 0xAA;
        gutmanns[6][i] = 0x24;
        gutmanns[7][i] = 0x92;
        gutmanns[8][i] = 0x49;
        gutmanns[10][i] = 0x11;
        gutmanns[11][i] = 0x22;
        gutmanns[12][i] = 0x33;
        gutmanns[13][i] = 0x44;
        gutmanns[15][i] = 0x66;
        gutmanns[16][i] = 0x77;
        gutmanns[17][i] = 0x88;
        gutmanns[18][i] = 0x99;
        gutmanns[20][i] = 0xBB;
        gutmanns[21][i] = 0xCC;
        gutmanns[22][i] = 0xDD;
        gutmanns[23][i] = 0xEE;
        gutmanns[24][i] = 0xFF;
        gutmanns[28][i] = 0xDB;
        gutmanns[29][i] = 0x6D;
        gutmanns[30][i++] = 0xB6;
    }

    gutmanns[14] = gutmanns[4];
    gutmanns[19] = gutmanns[5];
    gutmanns[25] = gutmanns[6];
    gutmanns[26] = gutmanns[7];
    gutmanns[27] = gutmanns[8];

    Stream s;

    try
    {
        s = new FileStream(
            fi.FullName,
            FileMode.Open,
            FileAccess.Write,
            FileShare.None,
            (int)fi.Length,
            FileOptions.DeleteOnClose | FileOptions.RandomAccess | FileOptions.WriteThrough);
    }
    catch (UnauthorizedAccessException)
    {
        return;
    }
    catch (IOException)
    {
        return;
    }

    using (s)
    {
        if (!s.CanSeek || !s.CanWrite)
        {
            return;
        }

        for (var i = 0L; i < gutmanns.Length; i++)
        {
            s.Seek(0, SeekOrigin.Begin);
            s.Write(gutmanns[i], 0, gutmanns[i].Length);
            s.Flush();
        }
    }
}

回答

看到这个:古特曼的论文

回答

丹尼尔·费恩伯格(Daniel Feenberg)(私人国家经济研究局的经济学家)声称,从现代硬盘驱动器中恢复被覆盖数据的可能性等于"城市传奇":

情报机构可以读取覆盖的数据吗?

因此,从理论上讲,用0覆盖一次文件就足够了。

回答

我们之所以不是硬盘,而是SSD。他们在不告知操作系统或者文件系统驱动程序的情况下重新映射了集群。这样做是为了进行磨损均衡。因此,写入的0位与先前的1位相比有很大的机会。即使是企业间谍活动,移除SSD控制器并读取原始闪存芯片也很可能。但是,如果覆盖了36个完整的磁盘,则磨损平衡可能会在所有备用块中循环几次。