在下面的视频中:Linux HOWTO:使用 PGP 保护您的数据,第 2 部分,您将看到如何使用 创建密钥对gpg
。大约 时1:50
,讲师说了以下内容:
在生成密钥时,最好移动鼠标一点点给它更多的随机数熵来创建密钥对。
在我看来,这似乎是一个神话,特别是因为命令行工具通常不应受到光标的影响。另一方面,我不知道 Linux 的随机数生成器是如何工作的,无论它是由 GUI 共享的还是独立于 GUI 的。他所声称的内容是否有任何依据,或者这是一个例子货物崇拜编程?
答案1
这有一定道理,事实上比神话更真实,但尽管如此,这种说法反映了对正在发生的事情的根本误解。是的,在使用 GPG 生成密钥时移动鼠标可能是个好主意。是的,移动鼠标会产生一些熵,使随机数变得随机。不,移动鼠标并不会使密钥更安全。
所有适合密码学的优秀随机生成器(Linux 就属于此类)都具有两个组件:
熵必须来自计算机外部的源。用户是熵的来源之一。用户所做的大部分不是随机的,但是击键和鼠标移动的精细时机是不可预测的,因此有点随机——不是很随机,而是一点一点地积累。其他潜在的熵源包括网络数据包的计时以及摄像头或麦克风白噪声。不同的内核版本和配置可能使用不同的源集。一些计算机具有基于放射性衰变的专用硬件 RNG 电路,或者不太令人印象深刻的不稳定电子电路。这些专用源在嵌入式设备和服务器中特别有用,它们在首次启动时可以具有相当可预测的行为,而无需用户做奇怪的事情。
Linux 通过两种设备向程序提供随机数:/dev/random
和/dev/urandom
。从任一设备读取都会返回加密质量。两种设备都使用相同的内部 RNG 状态和相同的算法来转换状态并生成随机字节。它们有特殊的局限性,这使得它们都不是正确的:
/dev/urandom
如果系统尚未积累足够的熵,则可以返回可预测的数据。/dev/random
计算可用熵的数量并在没有足够的情况下进行阻止。这听起来不错,只不过计算是基于理论考虑,使得可用熵的量随着每个输出位线性减少。因此/dev/random
往往会很快阻塞。
Linux 系统将内部 RNG 状态保存到磁盘并在启动时恢复。因此,熵会从一只靴子转移到另一只靴子。 Linux 系统可能缺乏熵的唯一情况是在新安装时。一旦系统中有足够的熵,熵就不会减少;只有Linux的有缺陷的计算减少了。有关此考虑因素的更多解释,请阅读/dev/urandom
适合生成加密密钥,由专业密码学家。参见阿苏你能解释一下 random.c 中使用的熵估计吗。
移动鼠标会给系统增加更多的熵。但gpg 只能读取/dev/random
,不能/dev/urandom
(解决这个问题的一个方法是制作/dev/random
与/dev/urandom
),因此它永远不会面临接收不够随机的随机数的风险。如果你不移动鼠标,按键是尽可能随机的;但可能发生的情况是 gpg 可能会被阻止在读取中/dev/random
,等待内核的熵计数器上升。
答案2
GPG 使用 Linux(内核)随机数生成器。内核生成器从各个地方获取熵(随机性),其中包括对于某些中断的中断时序。移动鼠标(以及打字、磁盘活动等)都会产生中断。
因此,移动鼠标确实可能会输入到随机数生成器中。但是否确实取决于所使用的确切内核版本;较新的版本不(至少在我的测试中)使用键盘或鼠标中断来获取熵。然而,磁盘活动确实如此(因此,例如,运行sync
将增加潜在的大量熵,具体取决于刷新的量)。
简而言之:在当前的 Linux 版本上情况并非如此。这是在较旧的身上。
但是,如果生成器耗尽了熵,它应该会停止,因此您的密钥生成将挂起,直到生成一些熵。所以这将是一个永久性的问题,而不是安全问题。
您可以通过 看到有多少熵可用cat /proc/sys/kernel/random/entropy_avail
。
答案3
Tails 的密钥生成速度非常快,因为它haveged
安装了:
sudo apt-get install haveged