GPG没有足够的熵


86

我在后台运行了大量的进程来尝试获取足够的熵,但是我仍然失败了。

**We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 210 more bytes)**

我需要一种方法来生成有效的密钥,因为我要执行的操作显然失败了。

Answers:


112

您看过RNG吗?

Fedora / Rh / Centos类型: sudo yum install rng-tools

关于deb类型:sudo apt-get install rng-tools进行设置。

然后运行,sudo rngd -r /dev/urandom然后生成密钥。

参考:http : //it.toolbox.com/blogs/lim/how-to-generate-enough-entropy-for-gpg-key-generation-process-on-fedora-linux-38022


4
另外,更严重的是,sudo apt-get install rng-tools如果您使用的是Ubuntu ,则可以使用它,而不必sudo yum install rng-utils像Fedora那样使用它们,因为没有rng-utils适用于Ubuntu的软件包。
詹森·斯威特

4
该软件包rng-tools在Fedora和EL6上都被命名,因此我怀疑链接文章中有错字。顺便说一句,最好在此处提供答案的必要部分,并提供链接以供参考,以防将来链接失效。
迈克尔·汉普顿

11
urandom中没有“低质量熵”或“伪熵”。urandom调用与/ dev / random相同的代码。无需在CSPRNG中添加额外的随机性(除了在引导时,而且您的发行版应该照顾它)。这是一个神话,不应该传播。参见例如sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers或以下视频:media.ccc.de/v/32c3-7441-the_plain_simple_reality_of_entropy
塞巴斯蒂安·维辛格2015年


2
投票率最高的评论是胡扯。不幸的是,我在SO上看到了很多。警告(即使完全错误)也将获得大量投票,而无法纠正它们(没有注释掉票的选项),这意味着我们无法摆脱神话。
Stijn de Witt

28

我能够通过生成密钥

apt-get install rng-tools

在另一个SSH窗口中打开

 gpg --gen-key

返回您的第一个SSH会话并运行

sudo rngd -r /dev/urandom

让它运行直到gpg生成您的密钥!


9
我绝对建议不要使用/dev/urandom任何重要的密钥。
安德鲁·巴伯

12
@AndrewBarber废话。这是推荐的方法。
David Schwartz

3
@AndrewBarber它是专门为此目的而设计的。基本上/dev/random是设计错误。它应该只在第一次(一次)调用(第一次启动时)阻塞时,才尚未收集到任何熵。就像在其他操作系统上一样。相反,我们现在有两个游泳池。只是从不使用/dev/random它没有优势。
Stijn de Witt

@AndrewBarber您会推荐什么?
qodeninja

13

要检查当前可用的熵字节数,请使用

cat /proc/sys/kernel/random/entropy_avail

熵存储区的大小为4096字节,可以很快耗尽。

使用这个小的“ readspeed”工具(http://1wt.eu/tools/readspeed/),您可以测量使用不同方法填充信息存储桶的速度。

例如,启动:

$ ./readspeed < /dev/random

并移动鼠标。您会看到“ readspeed”在熵存储桶装满后立即清空,并且当您移动鼠标时,它会装满一点。

尝试不同的方法,似乎键盘输入和鼠标移动是补充存储桶的最有效方法。网络传输和硬盘副本影响不大。

最后,还有可用的熵生成设备,例如:http : //www.entropykey.co.uk/


4
urandom中没有“低质量熵”。urandom调用与/ dev / random相同的代码。这是一个神话,不应该传播。参见例如sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers或以下视频:media.ccc.de/v/32c3-7441-the_plain_simple_reality_of_entropy
Sebastian Wiesinger

这个答案是5岁。我们认为当时的urandom并不像随机的那样安全,但是此后情况发生了变化,并且urandom被认为是安全的。
朱利安·韦亨

1
事实是从一开始就是安全的。这些警告在7年前也是错误的。
Stijn de Witt

8

+1 for rng-tools

万一您陷入困境-没有权限在没有连接任何输入硬件(声卡,键盘,鼠标)的无头服务器上安装新软件(rng-tools)。您可以从连接到同一服务器的另一个终端运行此简单代码,以添加到熵。在开始之前还是之后开始运行它都没有关系gpg --gen-key

$ nice -n 19 bash
$ until [ $COUNT -lt 1 ]; do
  let COUNT=`cat /proc/sys/kernel/random/entropy_avail`
  echo "`date` COUNTER $COUNT"
done

第一行是启动一个具有较低优先级的新bash shell(我需要在许多用户共享的服务器上表现出色)。直到循环是无限的,因此请记住在生成密钥后将其中断。它正在做的所有事情都会导致网络流量增加熵。它还监视entropy_avail计数器,以显示gpg在另一侧如何填充和清空它。在我的情况下,计数器迅速填满至64,然后清空为0(猜测gpg在64的块中拾取)。我在服务器上等待4096位密钥生成超过3个小时。开始运行此脚本后,它在5分钟内完成。


我也没有远程服务器上的root用户访问权限,因此可以创建一些熵。我认为条件应更改为[ $COUNT -lt 0 ]。因为对于一个熵实际上很少的系统,它有时达到0并停止。GPG确实很饿。
Ajay Brahmakshatriya

谢谢,这对于我在气密的盒子上产生一些迷惑物应该足够了。除了我不会使用日期,因为那是可以预见的
grepsedawk

7

我被束缚并决心在无头的Ubuntu 14.04服务器上生成熵,以便使用以下命令生成4096个密钥 gpg --gen-key

有一个用于生成熵的程序包称为Haveged。安装示例:

sudo apt-get install haveged

我必须这样做,sudo apt-get install rng-tools因为它是以下测试中的依赖项。

一个测试示例,看看是否由Haveged产生了熵:

cat /dev/random | rngtest -c 1000

在任何随机数生成器中,很少的故障是可以接受的,但是当使用悬停时,您可以期望经常看到998-1000成功。

我在这里的教程中找到了它:

https://www.digitalocean.com/community/tutorials/how-to-setup-additional-entropy-for-cloud-servers-using-haveged

我现在跑步后有钥匙 gpg --gen-key


0

pacman-key --init在拱门上跑时遇到了这个问题。这里的其他解决方案对我来说效果不佳,但是我发现仅对路由器进行洪泛ping很好用:ping -f ip.of.my.router



0

haveged是最好的方法,但是如果您无法安装任何东西,则可以手动生成熵。此方法可以gpg --gen-ken在我的计算机上在1-2分钟内完成(与相比,只需10秒钟即可完成haveged)。因此速度要慢10倍左右。

在运行时在另一个终端gpg --gen-key上运行此命令:

while true; do
    # print entropy available
    cat /proc/sys/kernel/random/entropy_avail
    # write a 1 MB stream of zeros to /tmp/foo
    # "conv=fdatasync" flushes the disk cache
    dd bs=1M count=1 if=/dev/zero of=/tmp/foo conv=fdatasync
done

一班轮:

while true; do cat /proc/sys/kernel/random/entropy_avail; dd bs=1M count=1 if=/dev/zero of=/tmp/foo conv=fdatasync; done
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.