熔岩灯如何为 Internet 加密助力?

Cloudflare 将 100 盏熔岩灯的照片转换为随机数据,以用于 SSL 加密。

Share facebook icon linkedin icon twitter icon email icon

熔岩灯加密

学习目标

阅读本文后,您将能够:

  • 了解为什么加密密钥需要随机性
  • 说明为什么计算机无法自己创造随机性
  • 了解计算机如何使用随机输入生成随机输出
  • 了解什么是密码种子
  • 了解熔岩灯如何产生密码种子所需的随机数据

为什么 Cloudflare 使用熔岩灯来帮助加密?

随机性对于安全加密非常重要。计算机用来加密数据的每个新密钥都必须真正随机,以使攻击者无法找出密钥并解密数据。但是,计算机设计为基于给定的输入提供可预测的逻辑输出,无法生成创建不可预测加密密钥所需的随机数据。

要生成强加密所需要的不可预测的杂乱数据,计算机必须具有随机数据源。不过,“现实世界”是随机性的绝佳来源,因为物理世界中的事件是不可预测的。

正如大家期望的那样,熔岩灯始终是随机的。熔岩灯中的“熔岩”永远不会再次出现相同的形状,因此,观察一组熔岩灯是获取随机数据的不错来源。

Cloudflare Lava Lamp Wall

为了收集这一数据,Cloudflare 在 Cloudflare 总部大厅的一面墙壁上安排了大约 100 盏熔岩灯,并且安装了一台朝向这些熔岩灯的相机。相机以固定间隔拍摄熔岩灯的照片,并将图像发送到 Cloudflare 服务器。实际上,所有数码图像实际上都由计算机存储为一系列数字,每个像素有其自己的数值,因此每一幅图像都会变成一串完全随机的数字,Cloudflare 服务器可以其为起点来创建安全加密密钥。

因此,在熔岩灯的帮助下,CloudFlare 能够向客户提供极强的(并且足够随机的)SSL/TLS 加密。考虑到超过27百万 Internet 资产使用了 Cloudflare,这一点尤其重要。

密码学中的“随机”是什么意思?

在密码学中,随机并不仅仅意味着统计学上的随机;它也表示不可预测性。假设有人将一个六面骰子掷了二十四次,结果如下:

1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6

从统计学上看,这是掷骰子结果的随机分布。每个数字的投掷概率相同,因此出现这一序列在概率范围之内。

但是,这个顺序并非不可预测。如果将它用于加密,攻击者可能会找出这种模式。

为什么真正不可预测性对于加密很重要?

加密的数据看起来应该像完全随机的数据,因为可预测的数据是能被猜到的。如果存在某种模式,例如特定的值用于加密的频率高于其他值,或者值始终以一定的顺序出现,那么数学分析能够挑选出这种模式,从而使攻击者更容易地猜测到加密所用的密钥。基本而言,如果加密数据可以预测,那么它或许已遭到破坏。

加密过程本身是可预测的过程:加密后的数据加上正确的密钥等于解密后的数据,而且解密后的数据与加密之前的数据相同。但是,使用的加密密钥必须不可预测。

为了解为什么不可预测性为何如此重要,我们可以想象两位扑克玩家:鲍勃总是在有好牌时加注,牌不好时则弃牌(拒绝跟注)。爱丽丝则混合使用下注策略,因此没有明显的模式:有时在牌好时加注,有时满足于跟注,有时甚至会在牌不好时通过加大注来诈牌。如果爱丽丝和鲍勃参加同一届扑克锦标赛,爱丽丝的存活时间要比鲍勃更长,因为鲍勃太容易预测。对手很快就会知道鲍勃什么时候有好牌,并做出应对。即使看不到他的牌,他们也可以大致分辨出他手里的牌。

同样,即使攻击者看不到通过网络发送的“牌”(或加密的内容),但如果隐匿内容的方法太容易预测,他们仍然可以猜测到。

为什么计算机无法创造随机性?

计算机以逻辑为基础运行。计算机程序基于 if-then 语句:如果满足某些条件,则执行指定的操作。如果程序的输入相同,那么每次都会产生相同的输出。

这是设计使然。输入应导致预期的输出,而不是意外的输出。想象一下,如果打印机打印出与文档中文本不同的随机,或者智能手机呼叫的电话号码与用户输入的不同,那就混乱不堪了。计算机的用处正是源于它的(相对)可靠性和可预测性。但是,在生成安全加密密钥时,这种可预测性成为了不利因素。

有些计算机程序擅长模拟随机性,但对创建加密密钥来说仍然不够。

计算机如何使用现实世界中的随机输入来生成随机数据?

一种称为伪随机数生成器(PRNG)的软件程序能够获取不可预测的输入,并用它来生成不可预测的输出。从理论上讲,PRNG 可以从随机输入产生无限的随机输出。

这种算法之所以称为“伪随机”而非“随机”,是因为它的输出实际上并不是完全随机的。为何会如此?主要有两个原因:

  1. 连续两次给定相同的种子作为起点,PRNG 会产生完全相同的结果。
  2. 很难证明它生成的结果在整个时间内完全随机(如果 PRNG 无限期运行)。

由于第 2 个原因,该算法不断需要新的随机输入。随机输入称为“密码种子”。

密码安全伪随机数生成器是什么?

密码安全伪随机数生成器(或 CSPRNG)是满足更严格标准的 PRNG,能够更安全地用于加密。CSPRNG 满足 PRNG 不一定满足的两个要求:

  1. 必须通过某些统计随机性检验才能证明不可预测性。
  2. 攻击者即使对程序有部分访问权,也肯定无法预测 CSPRNG 的输出。

如同 PRNG 一样,CSPRNG 需要以随机数据(密码种子)为起点,从中生成更多随机数据。

为了生成用于 SSL/TLS 加密的加密密钥,Cloudflare 使用 CSPRNG,并将从熔岩灯收集的数据作为密码种子的一部分。

什么是密码种子?

密码种子是 CSPRNG 于生成随机数据的起点数据。尽管从理论上讲 CSPRNG 可以从单个密码种子产生无限的随机输出,但是定期更新密码种子要安全得多。攻击者最终可能会攻破初始的密码种子。另请记住,如果被提供相同的种子,CSPRNG 会再次产生完全相同的输出,因此攻击者可以复制随机输出。此外,即使是经过最严格测试的 CSPRNG,也无法保证无限期产生不可预测的结果。

通过使用熔岩灯,Cloudflare 可以不断获得新的加密种子数据。相机拍摄到的每张熔岩灯照片都是不同的,从而能产生可用作种子的不同随机数值序列。

熔岩灯是不是加密种子的唯一来源?

许多操作系统都有自己的随机数据源来用于密码种子,例如来自用户操作(鼠标移动、键盘输入等),尽管它们获取数据的速度相对较慢。Cloudflare 将获取自熔岩灯的随机数据与 Linux 操作系统在两台不同机器上生成的数据混合在一起,以便在为 SSL/TLS 加密创建加密种子时最大化熵。

什么是熵?

一般而言,“熵”表示无序或混乱。但是,熵在密码学中有一个特定的含义:它指的是不可预测性。密码学家实际上根据熵的位数来衡量给定数据集具有熵的大小。因此,Cloudflare 将熔岩灯墙称为“熵墙”。

如果有人站在熔岩灯前面会如何?

因为熔岩灯墙位于 Cloudflare 总部繁忙的大厅中,所以这种情况一直存在。人们在大厅里进进出出,走过这些熔岩灯或在灯前面停下来聊天。这样的障碍物成为相机捕获的随机性的一部分,因此,部分遮挡相机的熔岩灯视线的人实际上有助于产生熵。

如果有人关闭或损坏相机会如何?

如果发生这种情况,Cloudflare 仍然可以从 Cloudflare 服务器上运行的 Linux 操作系统中获得另外两个随机来源。此外,Cloudflare 可以轻松对相机进行物理访问,因为它位于 Cloudflare 拥有的空间内,并且 Cloudflare 也可快速将其重新开机或根据需要进行更换。

是否所有 Cloudflare 办事处都有熔岩灯墙?

Cloudflare 的另外两个主要办事处分别在伦敦和新加坡,并且每个办事处各自都有从现实世界输入中生成随机数据的方法。伦敦办事处从安装的双摆系统拍照(摆锤与摆锤相连,其运动在数学上不可预测);新加坡办事处则测量铀颗粒(足够小以至无害)的放射性衰变。

Cloudflare 是不是第一家将熔岩灯用于加密的公司?

出乎意料,并不是。一家名为 Silicon Graphics 的公司在 1996 年设计了一个类似的系统,称为“Lavarand”,尽管其专利已过期。

如需了解有关 Cloudflare 熔岩灯墙的更多信息,请阅读以下两篇博客文章:

请参见此页面,以了解如何使用 Cloudflare 的免费 SSL 加密