为什么写入/ dev / random不能使从/ dev / random的并行读取更快?


22

通常,从中读取/dev/random会产生100-500字节和块,并等待收集熵。

为什么不/dev/random通过其他进程写入信息会加快阅读速度?它不应该提供所需的熵吗?

它对于取消阻止gpg或类似软件而不重新启动并重新输入所有内容,生成非超级绝密密钥等很有用。


3
只需阅读即可/dev/urandom/dev/urandom/dev/random加密使用一样安全,行为/dev/random不当。
吉尔(Gilles)'所以

1
如何切换gpg --gen-key/dev/random/dev/urandom无需重新启动?
六。

IIRC gpg已进行/dev/random硬编码。您可以更改udev配置,使其/dev/random与相同的设备/dev/urandom,以及其他可能性。
吉尔(Gilles)'所以

@Gilles,它仍然需要重新启动gpg --gen-key,因此以交互方式(或使用更智能的方法,如指定更多命令行参数)重新呈现它所请求的数据。同样,CPU时间生成了可能丢失的主要数据(gpg可以工作一分钟,打印一些+es,然后请求其他随机数据)。它给人一种“让我们往回走的路线”的感觉,而不是“让我们用锤子将其向前推”的感觉……
六。

Answers:


19

您可以写信,/dev/random因为它是提供额外随机字节的方式的一部分/dev/random,但这还不够,还必须通过ioctl()调用通知系统存在额外的熵。

我需要相同的功能来测试我的智能卡设置程序,因为我不想等待我的鼠标/键盘gpg为每次测试运行所产生的多次调用生成足够的代码。我所做的是在测试之后并行运行Python程序。当然,完全不应该将它用于真正的gpg密钥生成,因为随机字符串根本不是随机的(系统生成的随机信息仍将被交织)。如果您有外部来源为设置字符串random,那么您应该可以具有较高的熵。您可以使用以下方法检查熵:

cat /proc/sys/kernel/random/entropy_avail

该程序:

#!/usr/bin/env python
# For testing purposes only 
# DO NOT USE THIS, THIS DOES NOT PROVIDE ENTROPY TO /dev/random, JUST BYTES

import fcntl
import time
import struct

RNDADDENTROPY=0x40085203

while True:
    random = "3420348024823049823-984230942049832423l4j2l42j"
    t = struct.pack("ii32s", 8, 32, random)
    with open("/dev/random", mode='wb') as fp:
        # as fp has a method fileno(), you can pass it to ioctl
        res = fcntl.ioctl(fp, RNDADDENTROPY, t)
    time.sleep(0.001)

(完成操作后,请不要忘记终止程序。)


1
使用更简单的解决方案rngd。它在大多数发行版中都可以作为软件包使用。
帕特里克

4
random = "3420348024823049823-984230942049832423l4j2l42j"看到xkcd.com/221
user253751

@Patrick我尝试了至少3个可能的解决方案来增加随机性,IIRC rngd是其中之一。但是它们无法立即使用(当时可能是Ubuntu 12.04安装程序),对我而言,这种具有10行代码的解决方案更为简单。
Anthon

@Anthon:作为旁注,自数十年前mitnik用它存储一些东西以来,我似乎还没有xs4all.nl ... :)
woliveirajr 2014年

@woliveirajr,我有我hacktic.nl的帐户在1992年转移到了那里,尽管已经在荷兰生活了20多年,但我已经住了一段时间。
Anthon 2014年

14

通常,它是由内核开发人员设计的,并记录在man 4 random

Writing to /dev/random or /dev/urandom will update the entropy pool
with the data written, but this will not result in a higher entropy
count.  This means that it will impact the contents read from both
files, but it will not make reads from /dev/random faster.

1

安东尼已经解释了写入/dev/random不会增加熵计数,并展示了RNDADDENTROPY ioctl的方式(请参阅random(4))来记下熵。这显然不是很安全,因此当有硬件随机数生成器可用时,这是一种替代方法。

以下实现从中获取512字节(4096位)的随机性/dev/hwrng并将其转发到熵池(每字节记入4位熵,这对我来说是一个任意选择)。之后,它将在熵池已满时调用select(2) syscall进行阻塞(记录在random(4)联机帮助页中)。

Python版本:

import fcntl, select, struct
with open('/dev/hwrng', 'rb') as hw, open('/dev/random') as rnd:
    while True:
        d = hw.read(512)
        fcntl.ioctl(rnd, 0x40085203, struct.pack('ii', 4 * len(d), len(d)) + d)
        select.select([], [rnd], [])

由于Arch Linux iso没有安装Python,因此这也是Perl版本:

open my $hw, "</dev/hwrng" and open my $rnd, "</dev/random" or die;
for (;;) {
    my $l = read $hw, my $d, 512;
    ioctl $rnd, 0x40085203, pack("ii", 4 * $l, $l) . $d or die;
    vec(my $w, fileno $rnd, 1) = 1;
    select undef, $w, undef, undef
}

这可能是rngd程序(rng-tools的一部分)的作用(未经验证),只是它使用的工具(Python或Perl)已经很普遍了。


如果您没有硬件随机数生成器,则可以使用/dev/urandom而不是/dev/hwrng绝对不关心不安全的随机值
Lekensteyn '16

嗯,我发现hwrng设备会在需要时自动生成熵,不需要其他rngd或脚本。但是,如果在getrandom()4.8-rc1之前的内核上将syscall与hwrng一起使用,则会导致阻塞行为。一种解决方法是read()从两次/dev/random,看到github.com/Lekensteyn/archdir/commit/...
Lekensteyn
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.