在下面的视频中:Linux HOWTO:使用PGP保护数据,第2部分,显示了如何使用创建密钥对gpg
。大约在1:50
,讲师说:
生成密钥时,最好将鼠标稍稍移动一下,以便为创建密钥对提供更多的随机数熵。
在我看来,这就像是一个神话,尤其是因为命令行工具通常不应受到光标的影响。另一方面,我不知道Linux的随机数生成器是如何工作的,无论它是由GUI共享还是独立于GUI。他声称有什么存货,还是这是一个货运崇拜计划的例子?
在下面的视频中:Linux HOWTO:使用PGP保护数据,第2部分,显示了如何使用创建密钥对gpg
。大约在1:50
,讲师说:
生成密钥时,最好将鼠标稍稍移动一下,以便为创建密钥对提供更多的随机数熵。
在我看来,这就像是一个神话,尤其是因为命令行工具通常不应受到光标的影响。另一方面,我不知道Linux的随机数生成器是如何工作的,无论它是由GUI共享还是独立于GUI。他声称有什么存货,还是这是一个货运崇拜计划的例子?
Answers:
这样做有一定道理,实际上比神话还重要,但尽管如此,该声明还是对正在发生的事情有根本的误解。是的,在使用GPG生成键时移动鼠标可能是一个好主意。是的,移动鼠标会产生一些熵,使随机数成为随机数。不可以,移动鼠标不会使按键更安全。
所有适用于密码学的良好随机生成器,而Linux属于该类别,具有两个组件:
熵必须来自计算机外部的来源。用户是熵的一种来源。用户所做的大部分不是随机的,但是击键和鼠标移动的良好时机是如此难以预测,以至于有些随机-不是很随机,而是一点一点地积累。熵的其他潜在来源包括网络数据包的定时以及相机或麦克风的白噪声。不同的内核版本和配置可能使用不同的资源集。一些计算机具有基于放射性衰变的专用硬件RNG电路,或者基于不稳定的电子电路(不那么令人印象深刻)。这些专用源在嵌入式设备和服务器中特别有用,这些设备和服务器在首次启动时可以具有相当可预见的行为,而无需用户做任何奇怪的事情。
Linux通过两个设备为程序提供随机数:/dev/random
和/dev/urandom
。从任一设备读取将返回加密质量。两种设备都使用相同的内部RNG状态和相同的算法来转换状态并生成随机字节。它们具有特殊的局限性,这使得它们都不是正确的事情:
/dev/urandom
如果系统尚未累积足够的熵,则可以返回可预测的数据。/dev/random
计算可用熵的数量,如果不够,则进行阻塞。这听起来不错,除了计算是基于理论上的考虑,这些理论使可用熵的数量随每个输出位线性减小。因此/dev/random
往往会很快阻塞。Linux系统将内部RNG状态保存到磁盘并在启动时将其还原。因此,熵会从一个引导转移到另一个引导。刚安装Linux系统时,唯一可能缺少熵的地方是。一旦系统中有足够的熵,熵就不会减少;只有Linux的错误计算减少了。有关此注意事项的更多说明,read /dev/urandom
适合由专业密码学家生成密码密钥。参见aso 可以解释random.c中使用的熵估计。
移动鼠标会增加系统的熵。但是GPG只能读取/dev/random
,不能/dev/urandom
(一种方法来解决这个问题,使/dev/random
同样的1:9装置/dev/urandom
),所以这是从来没有在接收未随机足够的随机数的风险。如果您不移动鼠标,则该键将尽可能随机。但是可能发生的是,gpg可能在读取时被阻塞/dev/random
,等待内核的熵计数器上升。
add_input_randomness
in 的调用drivers/input/input.c
,但是我不知道它在什么情况下实际上会注入熵。
GPG正在使用Linux(内核)随机数生成器。内核生成器从各种地方获取熵(随机性),其中包括某些中断的中断时间。移动鼠标(以及键入,磁盘活动等)都会产生中断。
因此,移动鼠标确实确实有可能馈入随机数生成器。但是,是否确实取决于所使用的确切内核版本。较新的版本(至少在我的测试中)不使用键盘或鼠标中断来获取熵。但是,磁盘活动确实如此(因此,例如,运行sync
将增加潜在的大量熵,具体取决于刷新的量)。
简而言之:在当前的Linux版本上不是这样。它是在较旧的。
但是,如果生成器的熵用完了,应该停止运行,因此您的密钥生成将挂起,直到生成一些熵为止。因此,这将是一个永远解决的问题,而不是安全问题。
您可以通过看到多少熵cat /proc/sys/kernel/random/entropy_avail
。
rngd
人工输入熵池之类的工具。
haveged
它是人为地补充熵池的另一个很好的工具。