/dev/zero还是/dev/random-哪个更安全,为什么?

26

有人可以告诉我为什么在擦除硬盘数据时,/dev/random更受安全性青睐吗?

2个回答

64
简单来说,/dev/random 不是首选。在安全性方面两者都是相同的。使用 /dev/zero 可以更容易地进行验证。此外,CPU 使用率更低,速度可能更快。
更加详细的解释:对于现代硬盘,磁盘密度已经非常高,无法从未完全覆盖的扇区获取信号,这是像 Gutmann 等人多年前就已经提到的问题。就现代硬盘来说(我认为任何容量可以用千兆字节或更大单位来测量的硬盘),如果数据被覆盖就不存在了,就这么简单。所以,重要的不是更改数据内容到什么样子,而是只要更改数据即可。
此外,即使你彻底擦除了一个硬盘,也可能会在硬盘的固件重新映射的扇区中留下数据,但这种情况相对较少,并且其中包含的数据量非常小,更不用说你需要非常专业的设备来检索这些数据(你需要编辑驱动器的系统区域中的G-List),而且这些扇区之所以被重新映射,是因为它们正在失效。
总结一下,DoD 擦除是愚蠢的,Gutmann 擦除更愚蠢,使用 /dev/zero,在几乎所有情况下都是好的选择。如果这是一个边缘情况,那么你需要非常专业的技能来访问和删除数据。
关于 USB 存储器:USB 存储器完全不同,需要绕过闪存控制器才能清理它,即使进行 Gutmann 擦除也无法完全删除数据,因为还存在着磨损平衡算法。但像硬盘一样,如果重写数据一次,数据就不存在了,关键是强制设备实际上覆盖数据。
也就是说,如果你有一个没有执行磨损平衡的控制器的廉价 USB 存储器,单次 0 填充就足以删除其中的数据。否则,你需要自己定制硬件并进行焊接。
SSD 可以被视为带有执行磨损平衡的控制器的 USB 存储器。 SSDs 总是执行磨损平衡,我不知道是否有任何例外。很多 USB 存储器则不会执行磨损平衡。
如何判断 USB 存储器是否执行了磨损平衡?你需要拆开它并检查控制器芯片,并查阅相关的数据表。
关于 "不可能从未完全覆盖的扇区获取信号" 的说法,请参考科学论文,我无法提供具体来源。我将就数字数据在磁介质上的模拟存储提供一些理由和信息。以下内容大多是我在数据恢复公司工作期间所学的,某些地方可能不准确。如果有错误,请让我知道,我会进行更正。但这是我对该材料的最佳理解。
硬盘制造完成后,第一件事情就是从伺服标签书写机接收伺服标签。这是一个单独的机器,其唯一的工作是启动完全空白的硬盘。(这就是为什么硬盘上有用铝箔覆盖的孔洞,那是伺服标记机放置其读写头的地方。)如果您曾经遇到过硬盘开机时只生成"click click click"的声音,那是因为它无法读取伺服标签。当硬盘通电后,它首先尝试的是将其读头甩到盘片上并获取轨道。伺服标签定义了轨道。如果它看不到伺服标签,它就到达中央位置,发出卡嗒声,将臂收回并重试。
我之所以提到这个,是因为这几乎是唯一一个外部设备读写硬盘并描述了硬件限制的实例,除了硬盘自己的读头。如果可能使伺服标签更小更节省空间,硬盘制造商会这样做。伺服标签在两个方面相对来说是效率低下的。
1. 它们绝对不能出现故障。如果伺服标签失败,则每次读头经过该特定伺服标签时就会失去轨道,这实际上意味着整个轨道都无法使用。 2. 它表明硬盘硬件处理盘片上信息的能力比外部设备更强大。
一圈伺服标签定义了一个轨道。关于轨道,有些事情必须知道:
1. 它们不一定是圆形的。它们不完美,可能包含翘曲。这是因为伺服标记机不准确。 2. 它们不一定是同心的。它们可以交叉。这意味着由于伺服标签机器不准确,某些扇区或整个轨道可能无法使用。
写入伺服标签后,就进行低级格式化。低级格式化与1980年代的实际低级格式化类似,但更为复杂。由于盘片是圆形的,但硬盘速度是恒定的,所以通过读头下方的区域量是到盘片中心距离的变量函数。为了从盘片中挤出每一滴存储空间, 盘片密度是可变的,由不同的区域定义。在一个典型的3.5英寸硬盘上,会有几十个具有不同盘片密度的区域。其中之一是特殊的、额外低密度的——系统区域。系统区域存储了驱动器上的所有固件和配置设置。由于这些信息更为重要,因此其密度更低。密度越低,出现随机故障的几率越小。当然,故障仍然会发生,但比用户区域要少得多。
在低级格式化驱动器之后,固件将被写入系统区域。每个驱动器的固件都不同。为了使驱动器能够满足盘片非常精细的要求,必须对每个驱动器进行调整。(当然,在低级格式化之前就要完成这个过程,因为您必须知道设备的质量如何,才能决定制造盘片的密度)。这些数据称为自适应数据,并保存在系统区域中。自适应数据区域中包含的信息包括:“当伺服标签告诉我偏离轨道时,我应该使用多少电压来修正自己”,以及其他需要使硬盘实际工作的信息。如果自适应数据稍有偏差,可能无法访问用户区域。系统区域很容易访问,因此只需要在PCB CMOS上存储很少量的自适应数据。
从本段中可以得出以下结论:
  1. 低密度意味着更容易读取。
  2. 密度越高,出现随机故障的可能性越大。
  3. 用户区域的密度与硬盘制造商能够制造的最高密度相同。
  4. 如果这似乎有些草率和粗糙,那是因为它确实如此。硬盘制造商在每GB价格上竞争并取胜。硬盘设计并不是要制造非常精细的设备并仔细地将它们组合在一起,因为这已经不足以竞争了。当然,他们仍然会这样做,但他们还必须使硬件间的各个部分在软件中相互配合,因为硬件公差太大而无法竞争。
因此,由于用户区域的密度非常高,正常情况下很可能会出现损坏位。这可能由许多因素引起,包括非常轻微的定时问题和盘片退化。您硬盘的很大一部分扇区实际上包含了损坏位。(您可以通过向驱动器发出ATA28 READLONG命令(只对前127GB左右有效。它没有ATA48的等效命令!)在许多扇区上多次测试并比较输出来验证这一点。您会发现某些位会不正常地开启或关闭,甚至随机翻转。)这是生活的事实。这就是为什么我们需要ECC。ECC是一个校验和,包含在512个(或4096个在新驱动器中)数据字节之后,如果数据的不正确位数足够少,则可以更正该数据。确切数量取决于固件和制造商,但所有驱动器都具有它,所有驱动器都需要它(而且它比您想象的要高得多,大约是48-60个字节,可以检测和纠正高达6-8个错误字节。疯狂的数学计算正在进行中。)这是因为盘片的密度对于即使是高度专业化和调谐的内部硬盘设备来说也太高了。
最后,我想谈谈前置放大芯片。它位于硬盘臂上,充当扩音器。由于信号是从非常小的磁场产生的,作用于非常小的磁头,所以它们的潜力很小。因此,您不能使用硬盘头进行Gutmann方法,因为您无法从中获得足够准确的读数,以使Gutmann的技术值得实施。
但让我们假设NSA有一种神奇的设备,他们可以在1毫秒内获得非常准确的读数(足够准确地计算潜力并推导出先前编写的数据)。他们首先需要什么?
首先,他们需要系统区域。因为那是存储翻译器的地方(翻译器是将LBA地址转换成PCHS地址的东西(物理柱面头扇区,而逻辑CHS地址是虚假的,只存在于传统原因)). 系统区域的大小因固件而异,但您可以在不使用魔术工具的情况下获取它。通常,它只有约50-100MB。翻译器的布局是固件特定的,因此您必须反转它(但这已经完成过了,没有大问题。)
所以第一个问题是信号与噪音。如上所述,盘片密度调得比严格安全要高得多。Gutmann的方法需要正常读/写活动中非常低的变异性,以计算先前的位状态。如果信号的变异性很大,则可能会干扰这些尝试。而且变化足够大,以至于完全会使您失败(这就是为什么现代驱动器的ECC如此疯狂的原因。)类比就像在嘈杂的房间里有人对你低声耳语,同时又有人对你说话。第二个问题是时间。即使电子显微镜非常快速和准确(每位1毫秒!对于电子显微镜来说真是闪电般的速度,但比1200波特的调制解调器慢),硬盘上有很多数据,一张完整的图像需要很长时间。(WA表示,对于一个500GB的硬盘而言,需要126年的时间,这还不包括ECC数据(这是必需的)。硬盘扇区还有许多其他元数据,如ID字段和地址标记,但这些不会被覆盖,也许你可以想出一种更快的方式来正常地成像它们?无疑有加速这个过程的方法(例如选择性成像驱动器的某些部分),但即使如此,你也需要24/7全天候工作数月之久,才能获得标准硬盘上的$MFT文件(通常在安装了Windows的驱动器上约为50-300MB)。
第三个问题是证据的可接受性。如果政府追捕你,他们只有几个原因,要么是想知道你所知道的东西,要么是想逮捕你并把你关进监狱。要得到前者有更简单的方法(软管加密),而后者将需要定期的证据程序。回到比喻上,如果有人作证说有人在一个嘈杂的房间里跟他们交谈时对他们轻声说了一些话,那么这里就有很多疑点。它永远不会是一种强有力的证据,值得花费大量时间和金钱。

3
因为在这种情况下,/dev/random/dev/urandom基本上是等效的错误答案。 :) - OmnipotentEntity
@ThorstenS。直到最近,我在一家数据恢复公司工作。我们非常擅长从硬盘中获取数据。我会在帖子中添加更多内容,以进一步说明为什么这已经不再可行。但正如janneb所指出的那样,有关此事的发表论文。我也希望您认为我也是硬盘存储方面的专家。 - OmnipotentEntity
飞行数据记录仪和驾驶舱语音记录器现在都是固态的,但在它们不是固态的时候,飞机坠毁后恢复已经被覆盖了5-6次或更多的数据几乎是标准操作(因为最大记录时间约为半小时)。 - Damon
/dev/random 会阻塞,而 /dev/urandom 不会阻塞。如果您想使用其中之一,我建议尝试使用 /dev/urandom。因为 /dev/random 可能无法快速生成真正的随机数据,这可能会大大减慢擦除过程。 - crcastle
@crcastle,许多现代CPU都配备了硬件,可以持续生成随机数。我不记得具体细节了,但当我将我的计算机设置为接入点时,我必须确保我的内核正在提取该信息,否则上述的阻塞行为会使我的系统几乎停滞不前。 - OmnipotentEntity
显示剩余9条评论

2
您提出了错误的问题。仅通过写入用户可见块来尝试安全地擦除驱动器,完全忽略了可能存在已标记为坏的扇区中的用户数据(但仍包含可读的敏感数据)这一事实。
当然,可以通过发出ATA命令来解决这个问题,但是那么一次ATA安全擦除命令将首先实现您想要的所有内容。有关如何使用hdparm发出带有--security-erase选项的安全擦除命令的详细信息,请参见https://ata.wiki.kernel.org/index.php/ATA_Secure_Erase

ATA 安全擦除并非万能解决方案。此外,它也无法像你所声称的那样清除大多数硬盘上 G-List 重新映射扇区中的数据。 - OmnipotentEntity
抱歉,应该是“不一定会清除数据”等等。ATA 安全擦除的行为对于许多事情来说是实现定义的。不过我需要再次检查 ATA 规范以确保。 - OmnipotentEntity
@OmnipotentEntity:你是在断言有些驱动器在接收到安全擦除命令时不会清除G列表扇区吗?NIST认为安全擦除与去磁等同于清除磁盘(请参阅NIST SP 800-88第8页http://csrc.nist.gov/publications/nistpubs/800-88/NISTSP800-88_with-errata.pdf),所以我希望它确实能够做到。 - Gabe
老一些的固态硬盘在执行安全擦除时,通常并不会真正清除驱动器上的任何数据,它们只是将翻译器重置为其初始状态。ATA规范几乎从不定义任何实现,因为它是一个接口规范。您不能依赖ATA安全擦除来删除G列表中的数据。在某些或许多型号上可能会这样做,我不知道,这不是我关注的领域。但我知道,ATA安全擦除是您不能依赖于安全地摆脱数据的东西。不过,在我的疯狂的文本墙中,我确实提到了G-List数据。 - OmnipotentEntity
作为补充说明,“安全地”指的是“比简单的0填充更安全”。 - OmnipotentEntity
“dd”的整个意义不就是它适用于驱动器的每一个位吗? - Hashim Aziz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接