我正在开发一个嵌入式系统,它将在系统第一次启动时生成一个 SSL 密钥。我想避免Heninger 等人发现的问题。和伦斯特拉等人。低熵的嵌入式系统倾向于生成相同的密钥。我的理解是,Linux 的熵来自以下来源(幻灯片 19):
- 硬件 RNG
- 键盘
- 老鼠
- 磁盘旋转
我正在使用的嵌入式硬件不会有上述任何熵源。
在这种情况下,获得良好熵的最佳实践是什么?我对可以在生产中信任的解决方案感兴趣(我不是在寻找科学实验)。
我正在开发一个嵌入式系统,它将在系统第一次启动时生成一个 SSL 密钥。我想避免Heninger 等人发现的问题。和伦斯特拉等人。低熵的嵌入式系统倾向于生成相同的密钥。我的理解是,Linux 的熵来自以下来源(幻灯片 19):
我正在使用的嵌入式硬件不会有上述任何熵源。
在这种情况下,获得良好熵的最佳实践是什么?我对可以在生产中信任的解决方案感兴趣(我不是在寻找科学实验)。
在Stackoverflow上提出并回答了类似的问题。产生熵的一些方法:
IBM在这里也有一个最佳实践指南。它建议:
在生成密钥之前评估可用的核熵数量。在生成密钥之前立即评估可用的内核熵的数量有助于确保随机性。
确保制造过程不会克隆密钥或熵源。
阻止或限制网络访问。如果可能,通过阻止 Internet 访问或限制网络访问来提高安全性。
使用特定于节点的数据播种或初始化内核熵池以提高密钥强度。
通过添加设备事件计时不确定性来增加内核熵池。如果您构建自己的内核设备,则可以通过添加设备事件计时不确定性来增加内核熵池,从而增加熵。
在需要密钥之前生成密钥(而不是在首次启动期间)。
如果你有它,你绝对应该使用它,如果你对要使用的硬件有任何选择,那就推动它。硬件 RNG 不一定很昂贵——Raspberry Pi 和每个智能卡都有一个。
请注意,大多数硬件 RNG 都基于振荡器,在通电后需要一段时间才能变得随机。在熵变得足够之前,您可能需要等待或绘制一定数量的字节。
如果您的平台上没有 RNG,但除了 ROM 之外至少还有一点持久性存储,那么您可以在生产过程中注入一些熵。
如果设备的存储是内部的,这意味着您需要在生产过程中给它上电一次,并与它通信几百字节。在您的设备上准备代码映像,以便在第一次启动时准备好接受熵注入。生产链上的任何 PC 都可以生产。
如果设备的存储是单独制造的,您可以在初始化存储的代码或数据映像中注入熵。
如果您的容量非常小,无论是由于通信带宽还是由于存储限制,熵源可以兼作私钥或密钥。任何设备独有且保密的东西都可以。
如果在制造阶段无法注入熵,但设备在投入生产时可以访问网络,则可以在第一次启动时注入熵——让设备从受信任的服务器请求熵。然而,这个过程很容易受到主动或被动的中间人攻击。设备可以验证熵服务器(硬编码公钥),但没有办法保护通信免受窃听,因为窃听者可以复制设备上的所有计算。
因此,如果您在制造阶段无法注入熵,则需要在设备用户部署时让设备用户参与熵注入。例如,您可能要求设备连接到受信任的 PC,用户将在该 PC 上运行您提供的软件以注入熵(从 PC 生成或从您的服务器获取,这无关紧要)。在那之后,该设备将仅与生成熵的 PC 一样值得信赖。