密码学爱好者看过来:如何确保生成真正的随机数?看看这个
可能有些开发者听说过 CloudFlare 办公室里的熔岩灯,这些熔岩灯持续工作多年,主要工作内容就是亮着,CloudFlare 会定时拍摄照片然后生成哈希值作为随机数生成器的种子。
熔岩灯虽然一直亮着它们在细节方面是不停变化的,CloudFlare 要的就是这种变化 (熵),这样取得的随机数安全性更高。
当然标题中说的真正的随机数其实不准确,因为 CloudFlare 最终也是将哈希作为种子放到加密安全伪随机数生成器 (CSPRNG) 中生成数据的,只不过这种处理方式可以提供更强大的安全性。
为什么要不停地生成随机数:
CloudFlare 的服务器每秒需要处理超过 5500 万个 HTTP 请求,其中绝大多数请求是通过 TLS 协议进行保护的,以确保真实性和机密性。
在幕后,像 TLS 这样的加密协议需要安全随机性的底层来源,否则安全保证就会崩溃。
密码学中使用的安全随机性在计算上需要与 “真正的” 随机性取法区分,为此,它必须通过统计随机性测试,并且输出对于任何计算有限的对手来说都是不可预测的。
实现这个目的的典型方法就是获取一些随机种子并将其放到 CSPRNG 中,该生成器可以根据请求生成本质上无限的、不可预测的字节流。
CloudFlare 的种子:
在以前 CloudFlare 的种子主要是旧金山办公室里的熔岩灯,其原理是定时对这组熔岩灯进行拍照,然后对图片计算哈希值,将这个哈希值作为种子放到 CSPRNG 中。
对 CloudFlare 来说这组熔岩灯产生的不停变化的照片就是熵源,该公司需要确保服务器可以定期从外部源获得真正的随机性刷新其熵池,而熔岩灯的在不停变化,所以它们具有真正的随机性。
新增的熵源:
为了给熵池增加更多熵源,CloudFlare 在全球几个办公室增加了一些基于物理学的熵系统,这些系统可以直观地认为就是随机的。
例如在伦敦办公室有一堵双摆墙,这些双摆在无规则的摆动中会在墙上投下不停变换的阴影,摄像机定时拍摄照片传递到服务器中,服务器计算哈希值后放到熵池中。
在奥斯汀的办公室里也有一个熵源,在办公室入口悬挂了大量半透明的彩片,同理,在办公室开门、关门、空调开关、环境光变化都会让整个背景发生发生变化,因此这也可以认为是随机的。
在 CloudFlare 这种随机系统名为 LavaRand,如果你是开发者对 LavaRand 有兴趣的话,可以点击这里查看博客:https://blog.cloudflare.com/harnessing-office-chaos