Eraser 等擦除程序建议覆盖数据可能 36 次。
据我了解,所有数据都以 1 或 0 的形式存储在硬盘上。
如果对整个文件执行一次随机 1 和 0 的覆盖,那为什么还不足以删除原始文件的所有痕迹?
曾经为 0,然后变为“1”的硬盘驱动器位的磁场比以前为 1 然后再次写入 1 的硬盘位稍弱。使用敏感设备,通过测量强度的微小差异,可以以合理的准确度识别每个位的先前内容。结果不会完全正确并且会有错误,但是可以检索到以前内容的很大一部分。
当您在这些位上乱写 35 次时,实际上不可能辨别过去存在的内容。
编辑: 一项现代分析表明,一个被覆盖的位只能以 56% 的准确率恢复。尝试恢复整个字节的准确率只有 0.97%。所以我只是在重复一个都市传说。使用软盘或其他介质时可能需要多次覆盖,但硬盘不需要它。
Daniel Feenberg(私人国家经济研究局的经济学家)声称,从现代硬盘驱动器中恢复被覆盖数据的可能性相当于“都市传说”:
所以理论上用零覆盖文件一次就足够了。
在传统术语中,当一个 1 被写入磁盘时,媒体记录一个 1,而当一个 0 被写入磁盘时,媒体记录一个 0。然而,实际效果更接近于在用 1 覆盖 0 时获得 0.95,在用 1 覆盖 1 时获得 1.05。设置了普通磁盘电路,以便将这两个值都读取为 1,但是使用专用电路可以计算出以前的“层”包含的内容。通过使用高质量数字采样示波器从模拟头电子设备读取信号,将采样波形下载到 PC,并在软件中分析,至少恢复一层或两层覆盖数据并不难恢复先前记录的信号。该软件所做的是生成一个“理想” 读取信号并将其从实际读取的信号中减去,留下前一个信号的残余作为差值。由于商用硬盘驱动器中的模拟电路的质量远不及示波器中用于采样信号的电路质量,因此存在恢复硬盘驱动器电子设备未利用的大量额外信息的能力(尽管使用较新的通道编码技术,如 PRML(进一步解释),需要大量的信号处理,不再可能使用示波器等简单工具直接恢复数据)
想象一下物理磁盘上的一个数据扇区。在这个扇区内是一个磁性图案(一条带),它对存储在该扇区中的数据位进行编码。这种模式是由一个或多或少静止的写头写入的,而磁盘在其下方旋转。现在,为了让您的硬盘驱动器在每次将新的磁性图案条写入扇区时都能正常用作数据存储设备,它必须重置该扇区中的磁性图案,以便以后可以读取。然而,它不必完全抹去之前磁性图案的所有证据,它只需要足够好(并且今天使用的纠错量足够好,不一定要那么好)。
你得到的是一系列磁性图案层,其中最强的图案对应于最后的数据写入。使用正确的仪器,可以读取具有足够详细信息的模式分层,从而能够确定较旧层中的一些数据。
这有助于数据是数字的,因为一旦您提取了给定层的数据,您就可以准确地确定用于将其写入磁盘并从读数中减去的磁模式(然后在下一个层,下一层)。
您想要这个的原因不是硬盘,而是SSD。他们在不告诉操作系统或文件系统驱动程序的情况下重新映射集群。这样做是出于磨损均衡的目的。因此,写入的 0 位与之前的 1 不同的位置的可能性非常高。移除 SSD 控制器并读取原始闪存芯片甚至是企业间谍活动的范围之内。但是对于 36 次全盘覆盖,磨损均衡可能会在所有备用块中循环几次。
我们在这里看到的被称为“数据剩磁”。事实上,大多数重复覆盖的技术(无害地)做的比实际需要的要多。已经尝试从数据被覆盖的磁盘中恢复数据,除了少数实验室案例外,实际上没有这种技术成功的例子。
当我们谈论恢复方法时,主要你会看到磁力显微镜作为解决偶然覆盖的灵丹妙药,但即使这样也没有记录成功,并且无论如何都可以通过在整个区域写入良好的二进制数据模式来取消您的磁性媒体(而不是简单的 0000000000s)。
最后,您所指的 36 次(实际上是 35 次)覆盖在今天被认为是过时且不必要的,因为该技术(称为 Gutmann 方法)旨在适应技术中使用的各种(通常是用户不知道的)编码方法像 RLL 和 MFM 一样,无论如何您都不太可能遇到。即使是美国政府的指导方针,一次覆盖就足以删除数据,尽管出于管理目的,他们认为这对于“清理”是不可接受的。造成这种差异的建议原因是“坏”扇区可能被磁盘硬件标记为坏扇区,并且在进行覆盖时没有正确覆盖,因此有可能通过目视检查磁盘来恢复这些扇区地区。
最后 - 使用 1010101010101010 或相当随机的模式写入足以将数据擦除到已知技术无法恢复的程度。
“Data Remanence”维基百科上有一组关于可能的攻击及其实际可行性的很好的参考资料。 那里也引用了 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();
}
}
}
有一些“磁盘修复”类型的应用程序和服务即使在格式化后仍然可以从硬盘驱动器读取数据,因此如果您确实需要安全地擦除某些内容,简单地用随机的 1 和 0 覆盖一次是不够的。
我想说的是,对于普通用户来说,这已经绰绰有余了,但是如果您处于高度安全的环境(政府、军队等)中,那么您需要更高级别的“删除”,这可以非常有效地保证无法从驱动器中恢复任何数据。
美国要求删除敏感信息(即绝密信息)是销毁驱动器。基本上,驱动器被放入带有巨大磁铁的机器中,并且还会物理地破坏驱动器以进行处置。这是因为有可能读取驱动器上的信息,甚至被多次覆盖。
看到这个: 格特曼的论文
只需反转位,以便将 1 写入所有 0,将 0 写入所有 1,然后将其全部归零,这应该消除磁场中的任何变量,并且只需要 2 次通过。