简而言之:我没有提出另一个关于何时使用/dev/random
而不是 的问题/dev/urandom
,而是提出了以下场景,在该场景中,我发现自己处于我正在构建的应用程序中:
- 虚拟机或容器环境(即全新安装,在应用程序第一次运行时可能只有几秒钟的时间)
- 需要在安装的剩余生命周期(几个月或更长时间)中使用加密安全的随机字节作为密钥材料
- 可以接受阻塞(即使是几分钟,如有必要)的用户故事和界面
我想知道:这是阻塞随机源(即,getrandom
与阻塞模式标志一起使用)的罕见但正确的用例吗?
更长的形式:
显然/dev/urandom
vs/dev/random
是一个引发争议性讨论的话题。就我而言,我认为/dev/urandom
在几乎所有典型用例中都更可取——事实上,我以前从未使用过阻塞随机源。
在这个流行而精彩的答案中,Thomas Pornin 说明urandom
手册页有些误导(同意),并且一旦正确播种,urandom
池在任何实际情况下都不会“耗尽”熵 - 这符合我的理解也是。
然而,我认为他urandom
说“唯一/dev/urandom
可能由于低熵而暗示安全问题的时刻是在新的自动化操作系统安装的最初时刻”。
我的理解是,典型的 Ubuntu 服务器启动的“启动时熵洞”超过一分钟!这是基于J. Alex Halderman 在密歇根大学的研究。
Halderman 似乎还说熵池在每次启动时都会填满,而不是像 Pornin 在他的回答中所说的那样,在第一次安装操作系统时。虽然它对我的应用程序来说并不是非常重要,但我想知道:它是什么?
我已经阅读了Thomas Hühn 的“关于 Urandom 的神话”的帖子,但由于几个原因,我觉得它没有说服力,与我的申请最相关的是,该帖子基本上归结为“人们不喜欢以他们的方式被阻止。他们将设计变通办法,编造奇怪的阴谋来让它运行。” 尽管这无疑是正确的(这也是我一直/dev/urandom
在其他地方使用的原因,尤其是对于 Web 内容),但有些应用程序用户可以忍受等待,尤其是当他们是第一次安装它时。
我正在构建一个旨在在终端设置中本地运行的应用程序,并且我已经有理由期望初始安装过程会有点涉及。我毫不犹豫地要求用户稍等片刻,如果它可以针对重复的密钥对增加少量的鲁棒性。
事实上,Halderman 说他能够计算出 105,728 台 SSH 主机的私钥——超过他扫描的主机的 1%——因为使用了弱熵池来生成密钥对。在这种情况下,主要是嵌入式设备可能具有糟糕的熵源,因此很难填满它们的池。
但是——这可能是我的问题的核心——在一个应用程序在完全幼稚的容器中交付的时代,意味着在一个闪亮的、新的操作系统安装上运行只有几秒钟的时间,我们不是有理由担心这一点吗?现象?我们不需要一个实用的阻塞接口吗?那getrandom
是打算成为的吗?
当然,在许多情况下,可以将熵从主机共享给客人。但是为了这个问题的目的,让我们假设作者决定不这样做,要么是因为她对部署的细节没有足够的控制权,要么是因为主机上没有可用的熵池。
再想一想:对于像我上面描述的那样新鲜和幼稚但在初始熵生成前景相当糟糕的设备上运行的环境的最佳实践是什么?我正在考虑带有很少或没有 HID 的小型嵌入式设备,这些设备在初始安装过程中可能是气隙的。
编辑:更新:因此,从 PEP524 开始,Python(编写有问题的应用程序)使用getrandom
whenos.urandom
被调用,并在熵池未收集到至少 128 位的情况下阻塞。所以作为一个实际问题,我想我有我的答案 - 只需使用它,它只会在必要时os.urandom
表现得像。然而,我对这里的首要问题感兴趣(即,容器化时代是否意味着重新思考“总是只使用 urandom”的正统观念)。/dev/random