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


29

我正在尝试半安全地擦除一堆硬盘。以下以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
请注意:除非您怀疑CIA会处理您的数据,否则用零(/ dev / zero)进行一次覆盖就足够了。有关讨论,请参见例如superuser.com/questions/215852/…
sleske

至于为什么/dev/random只读取会返回几个字节的原因,请参见superuser.com/a/712515/139307
mklement0

Answers:


42

双方/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)必须改为使用它,因为它会阻塞直到初始化熵池。

另请参见ThomasHühn的“ 关于/ dev / urandom的神话 ”。

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

编辑:以下是“真”随机数与伪随机数的题外话。如果您仅对该问题有实际答案,可以立即停止阅读。

我似乎声称(包括此处的其他答案)/dev/random实现了“真实”随机数生成器,而不是伪随机数生成器(PRNG)。例如,维基百科的文章提出了这样的主张。我认为那是不对的。有它的一些讨论,在这里是指硬件随机数生成器,但我看不出有什么证据表明,/dev/random通常使用这样的设备,或者是典型的电脑甚至有这样的设备。它们不同于C rand()函数之类的PRNG ,因为它们是不确定的,因为它们从实际上不可预测的源中获取熵。

我想说三类“随机”数字生成器:

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

  2. 发电机像/dev/random/dev/urandom从一些几乎不可预测的源,其收获熵等I / O活动(这就是为什么在键盘上捣或移动鼠标可以引起/dev/random产生更多的数据)。(对我而言)尚不清楚它们是否满足PRNG的定义(我见过说PRNG是确定性的定义),但它们也不是真正的随机数生成器。

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


2
如果必须填充大量的磁盘空间(例如整个分区,然后在其上创建加密的文件系统),那么/ dev / urandom还是有点慢。这应该作为极好的答案和详细说明的补充。
vtest

由于您不能从一个随机位计算/推导/创建/ ...超过一个熵位,因此根据定义,生成/输出比输入所接收的更多“随机”位的任何事物最好都是伪随机的。因此,/dev/urandom显然是伪随机的。/dev/random不同之处在于,它试图对其输入的熵进行保守估计,并且输出的熵并不(实际上)多于实际。这与专用TRNG设备的存在无关,因为还可以从任何类型的独立事件(如键盘或网络IO与时间的关系)中获得真实的熵。
JimmyB

13

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

/dev/random真正的随机加密,高质量的随机性。因此,这对于磁盘驱动器覆盖来说是一个过大的杀伤力。/dev/zero几次写就可以了。或者,您可以从中写入/dev/urandom,当它用尽真正的随机性时,它不会阻塞并给出伪随机数。


10
不,/dev/random不会生成“真正随机的字节”。它生成的随机字节的质量高于生成的随机字节/dev/urandom
基思·汤普森

7

在Linux中,/ dev / random是一个特殊文件,可提供高质量的伪随机数。 此实现从键盘,鼠标,磁盘和系统中断产生的事件中收集熵。(请参阅文档)因此,当没有此类事件时,熵池为空,将从/ dev / random读取的内容将阻塞,直到收集到其他环境噪声为止。这解释了您的问题。要填充熵池,您可以按键盘上的键。

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

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

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

有关硬件RNG的某些实现,请参见内核文档有关设备的信息

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

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


是否/dev/random真的使用像热噪声源?我的理解是,它使用来自(相对)不可预测的系统状态的信息,例如I / O活动和进程状态。我认为大多数Linux系统甚至都没有能够获取热噪声的硬件。您可以引用一些文档吗?
基思·汤普森

是的,你是对的。我提到的信息适用于通用硬件随机数生成器。
2011年

link上查看有关它如何在linux中实现的文档。提到了在PC环境中,LRNG会从源自键盘,鼠标,磁盘和系统中断的事件中收集熵。在其他环境中,LRNG从可用资源中收集熵。例如,OpenWRT路由器不包括硬盘,鼠标和键盘,因此它们不能用作熵源。另一方面,路由器从网络事件中收集熵。
2011年

也许您可以更新答案。我认为/dev/random产生“真正随机数” 是不正确的。
基思·汤普森

维基百科上的/ dev / random文章说,在第一段中,Linux是第一个以这种方式实现真正的随机数生成器的操作系统。
2011年

2

无需回答您的问题-此处已经有完整的答案-您还可以查看Darik的Boot和Nuke aka DBAN,这是一个实时CD驱动器抽头。


0

只需使用shredcoreutils随附的命令即可。它以有效的方式使用随机数据。dd是一个低级工具,对于此任务而言可能有点太低了。 shred例如,将有效地跳过设备的不可写部分。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.