为什么使用 dd 时我的 /dev/random 这么慢?

为什么使用 dd 时我的 /dev/random 这么慢?

我正在尝试半安全地擦除一堆硬盘。以下以 20-50Mb/s 的速度运行

dd if=/dev/zero of=/dev/sda

dd if=/dev/random of=/dev/sda 

似乎不起作用。此外,当我输入

dd if=/dev/random of=stdout

无论我为 bs= 和 count= 传递什么,它都只会给我几个字节

我使用 /dev/random 的方式是否错误?我应该寻找哪些其他信息来推进此故障排除?是否有其他方法可以使用脚本或类似的东西来执行此操作

makeMyLifeEasy | dd if=stdin of=/dev/sda

或类似的东西...

答案1

/dev/random和都/dev/urandom使用“熵池”。当熵池耗尽时,/dev/random等待它重新填充,这需要监控系统行为(键盘输入、鼠标移动等),而/dev/urandom将继续为您提供伪随机数据。 /dev/random理论上质量更高,但/dev/urandom几乎肯定足以满足您的目的。(但即使 也/dev/urandom可能比其他一些方法慢。更快但质量较低的生成器可能足以擦除硬盘。目前尚不清楚攻击者是否会从了解将要生成的序列中获得任何优势,或者随机数是否更好以此目的而不是像 0、1、2、3、4、.... 这样的序列)

引用手册random(4)页:

如果您不确定是否应该使用/dev/random/dev/urandom,那么您可能想使用后者。一般来说,/dev/urandom应该用于除长期 GPG/SSL/SSH 密钥之外的所有内容。

更新random(4)自从我写下这篇文章以来,手册页已经更新。现在的内容是:

/dev/random接口被视为传统接口, /dev/urandom在所有用例中都是首选且足够的,但需要在早期启动时具有随机性的应用程序除外;对于这些应用程序,getrandom(2)必须使用,因为它会阻塞直到熵池初始化完成。

也可以看看 ”关于 /dev/urandom 的误解“作者:托马斯·休恩。”

但是/dev/urandom,即使它不会阻塞,如果你想生成大量数据,它也可能太慢。在尝试之前,请先在你的系统上进行一些测量。

编辑 :以下是关于“真”随机数与伪随机数的题外话。如果你只想知道这个问题的实际答案,那么你可以停止阅读了。

我见过声称(包括这里的其他答案)/dev/random实现了“真正的”随机数生成器,而不是伪随机数生成器(PRNG)。例如,维基百科文章提出了这样的主张。我认为这是不对的。对此有一些讨论这里指的是硬件随机数生成器,但我没有看到任何证据表明/dev/random通常使用这种设备,或者典型的计算机甚至有这种设备。它们与 Crand()函数等 PRNG 不同,因为它们不是确定性的,因为它们从几乎不可预测的来源获取熵。

我认为有三类“随机”数生成器:

  1. 确定性 PRNG,如 Crand()函数,使用算法生成可重复序列,这些序列具有(或多或少)真正随机序列的统计特性。这些对于游戏来说已经足够好了(只要有好的种子方法),并且对于需要可重复性的应用程序来说是必需的,但它们不适合加密。

  2. /dev/random和等生成器/dev/urandom从一些几乎不可预测的来源(如 I/O 活动)中获取熵(这就是为什么敲击键盘或移动鼠标会导致/dev/random产生更多数据的原因)。我不清楚这些是否满足 PRNG 的定义(我见过一些定义说 PRNG 是确定性的),但它们也不符合真的随机数生成器。

  3. 硬件随机数生成器即使完全了解它们的初始状态,它们在物理上也是不可预测的,并且还需要使用数学技术来确保正确的统计特性。

答案2

/dev/random是真正的熵源,真正的随机字节。因此,它需要一个随机源。您可以通过读取随机源来“用尽”随机性。它会为您提供它所拥有的所有随机性,然后阻塞直到获得更多随机性。您可能只是坐在那里等待,而机器几乎没有获得新的随机性,它只是等待。

/dev/random对于真正随机的加密,高质量的随机性。因此,对于磁盘驱动器覆盖来说,这是过度的。从 写入/dev/zero几次是可以的。或者您可以从 写入/dev/urandom,它不会阻塞,并且在用尽真正的随机性时会提供伪随机数。

答案3

在 Linux 中 /dev/random 是特别的提供高质量伪随机数的文件。 该实现从键盘、鼠标、磁盘和系统中断等事件中收集熵。(参考文档)因此,当没有此类事件时,熵池是空的,从 /dev/random 读取将受阻,直到收集到额外的环境噪声。这解释了您的问题。要填充熵池,您可以按下键盘上的键。

另一方面,真正的随机数生成器使用硬件随机数生成器它从物理过程中生成随机数。这些过程包括产生低水平、统计随机“噪声”信号的微观现象,例如热噪声或光电效应或其他物理现象。从理论上讲,这些过程是完全不可预测的,并且该理论对不可预测性的断言需要经过实验检验。

硬件随机数生成器通常由一个传感器、一个放大器和其他电子电路组成,传感器用于将物理现象的某些方面转换为电信号,放大器和其他电子电路用于将随机波动的幅度增加到宏观水平,以及某种类型的模拟数字转换器用于将输出转换为数字,通常是简单的二进制数字 0 或 1。通过反复采样随机变化的信号,可以获得一系列随机数。

硬件随机数生成器将来自设备驱动程序和其他来源的环境噪声收集到熵池中。从这个熵池中创建随机数。读取时,/dev/random 设备将仅返回熵池中估计的噪声位数内的随机字节。这解释了您的问题。

硬件 RNG 的一些实现在内核文档设备信息

/dev/random 的对应项是 /dev/urandom(“解锁”/非阻塞随机源),它重用内部池来生成更多伪随机位。这意味着调用不会阻塞,但输出可能包含比从 /dev/random 读取的相应信息量更少的信息量。

因此,如果您不想生成 CSPRNG(加密安全伪随机数生成器),则应该使用 /dev/urandom。

答案4

不用回答你的问题——这里已经有完整的答案了——你也可以看看 Darik's Boot and Nuke 又名数据库管理系统这是一个实时 CD 驱动器擦除器。

相关内容