为什么计算机天生无法自己产生真正的“随机数”,以至于互联网公司要靠摄像头拍一整面墙的熔岩灯来保护全球网络安全?

Gemini 4 Argon

如果你走进互联网基础设施巨头 Cloudflare 位于旧金山总部的大厅,你会看到一面颇具迷幻色彩的墙:整整 100 盏五颜六色的熔岩灯(Lava Lamps)整齐排列在架子上,灯管里的蜡团受热后缓慢升起、拉丝、分裂,又在冷却后下沉。

绝大多数访客会以为这只是硅谷公司常见的复古装饰。但在正对着这面墙的天花板下方,架设着一台高分辨率摄像机,它正以固定的频率全天候拍摄这些熔岩灯的画面,并将图像实时传输进机房的服务器集群。

这些不断翻滚的彩色蜡块,并不是为了取悦路过的程序员,而是为了支撑全球近五分之一互联网流量的 SSL/TLS 加密安全。

这听起来像是一个荒诞的赛博朋克笑话:我们已经造出了每秒能执行百亿亿次浮点运算的超级计算机,造出了能写诗、写代码的大语言模型,为什么当计算机需要“随便想一个数字”时,却还得求助于几十年前的廉价装饰灯?

答案藏在计算机科学最底层的基因里:计算机不仅不擅长随机,它从诞生那一刻起,就是为了消灭“随机”而存在的。


一、冯·诺依曼的警告:活在“罪恶”中的算术

要理解计算机为什么造不出真正的随机数,首先要回到图灵机和冯·诺依曼架构的本质。

人类制造计算机的初衷,是建造一台绝对确定性状态机(Deterministic State Machine)。在计算机的世界里,因果律是铁板一块的:只要给定完全相同的初始状态和完全相同的输入指令,无论你运行一万次还是一亿次,它都必须给出分毫不差的输出结果。如果一台计算机在计算 1 + 1 时偶尔因为“心情不好”算出 3,那它就不是有了自由意志,而是硬件出了故障。

但这就带来了一个逻辑上的死结:既然每一步运算都严格遵循确定的数学公式,你又怎么可能通过一套确定的公式,算出一个“完全不可预测”的结果?

1951 年,现代计算机之父约翰·冯·诺依曼(John von Neumann)就曾留下一句著名的辛辣断言:

“任何企图用算术方法来生成随机数的人,毫无疑问都处于一种罪恶状态(in a state of sin)。”

我们在编程时调用的 Math.random() 或 rand(),生成的根本不是真正的随机数,而是伪随机数(Pseudo-Random Numbers,简称 PRNG)。

它的原理其实就像一本极其厚重、但早已印刷好的密码本。算法内部维护着一个初始数值,叫做“种子”(Seed)。当你向计算机索要一个随机数时,算法只是把当前的“种子”丢进一个复杂的数学搅拌机(比如线性同余法或梅森旋转算法),经过乘法、取模、位移等一系列操作,吐出一个看似毫无规律的数字,并把这个数字作为下一次运算的新种子。

对于不知情的人来说,这串数字通过了所有的统计学检验,均匀、混乱、毫无规律;但在上帝视角——或者任何一个知道算法和初始“种子”的黑客眼里,这串数字的未来走向从第一秒起就已经被锁死了。


二、当“伪随机”被看穿:价值百万美元的灾难

你可能会问:既然伪随机数看起来已经足够乱了,为什么不能凑合用?在写个贪吃蛇小游戏或者抽奖小程序时,伪随机数确实绰绰有余。可一旦进入密码学与网络安全的世界,“看似随机”和“真正随机”之间的微小裂隙,就会变成足以摧毁信任的深渊。

1999 年,当时全球最受欢迎的在线德州扑克平台 Planet Poker 为了向玩家证明自己没有作弊,主动公开了他们用来洗牌的源码算法。一副扑克牌有 52 张,洗牌的可能性一共有 http://www.w3.org/1998/Math/MathML">52!52!(约 http://www.w3.org/1998/Math/MathML">8×10678 \times 10^{67})种,几乎相当于宇宙中的原子数量。平台方自信地认为,只要用随机数算法洗牌,没人能猜中牌局。

然而,几位计算机安全专家只看了一眼代码,就发现了致命破绽:这个洗牌程序使用了系统的实时时钟(精确到毫秒)作为伪随机数的“种子”。

一天只有 http://www.w3.org/1998/Math/MathML">86,400,00086,400,000 毫秒。攻击者根本不需要在 http://www.w3.org/1998/Math/MathML">8×10678 \times 10^{67} 种可能里大海捞针,他们只需要把自己的电脑时钟与服务器同步,再根据桌上发出的前五张公共牌逆向比对几万个毫秒级种子,就能在不到一秒钟内锁定服务器当前的“种子”。一旦种子被锁定,不仅整副牌接下来的发牌顺序一览无余,连桌上每一个对手手里的底牌都成了透明的明牌。

更惊心动魄的事故发生在 2006 年。Debian Linux 系统的维护者在修复 OpenSSL 加密库的一行代码警告时,无意间注释掉了一行负责向随机数池注入外部混乱数据的代码。这一改动导致生成的加密密钥不再依赖真实的随机源,而是只取决于当前进程的 ID(PID)。

而在 Linux 系统中,进程 ID 默认最大只有 32,768 个。这意味着,在此后长达两年的时间里,全世界数百万台服务器、银行网关和 SSH 通道生成的“高强度公私钥”,实际上总共只有区区三万多种可能。任何一台普通笔记本电脑,只要花上几个小时把这三万多把钥匙全部试一遍,就能堂而皇之地打开那些原本需要超级计算机算上亿年才能破解的数字大门。


三、向物理世界“借一点混乱”

既然纯靠代码逻辑走不出确定性的牢笼,计算机科学家们想出了唯一的破局之道:把鼻子伸出机箱外,去真实的物理世界里收集“混乱”。

在信息论中,这种不可预测的混乱程度被称为“熵”(Entropy)。数字世界没有原生的熵,但物理世界到处都是。

事实上,此时此刻你正在使用的电脑或手机,后台就有一个名叫“熵池(Entropy Pool)”的隐秘容器,正在不知疲倦地捕捉你身边最微小的物理杂音:

  • 你手指敲击键盘时,两次按键之间精确到纳秒级的时间间隔差异;
  • 你移动鼠标或滑动屏幕时,手部肌肉无法察觉的细微抖动轨迹;
  • 机械硬盘磁头寻道时受空气湍流影响产生的微小延迟;
  • 甚至是芯片内部硅原子因热运动产生的“热噪声”(Thermal Noise)。

操作系统会把这些来自物理世界的毛刺、抖动和噪声收集起来,碾碎成一串串毫无规律的 0 和 1,源源不断地注入内核的熵池(在 Linux 中对应 /dev/random 和 /dev/urandom)。当程序需要生成真正安全的密钥时,计算机就会从这个熵池里舀出一勺“物理世界的混沌”,作为密码学安全伪随机数生成器(CSPRNG)的种子。

这对个人电脑来说已经足够安全,因为没有哪个黑客能精确复现你刚才抓耳挠腮时鼠标划过的纳秒级轨迹。

但对于数据中心里的服务器来说,问题又来了:机房里的服务器没有键盘,没有鼠标,放在恒温恒湿的机架上,日夜不停地执行着高度规律的网络请求。 在最需要高强度随机数的服务器集群里,物理熵反而最容易枯竭。


四、熔岩灯、单摆与宇宙底噪

这就是 Cloudflare 在旧金山大厅里摆满 100 盏熔岩灯的真正原因。

熔岩灯内部的蜡块受热上浮、冷却下沉,本质上是一个高度复杂的流体力学与热力学混沌系统。哪怕两盏灯一模一样,受到周围空气微弱对流、灯丝发热不均以及环境震动的影响,每一秒钟蜡块的形状、位置和光影折射都是独一无二、不可复现的。

当摄像头拍下这面熔岩灯墙的照片时,这张照片在计算机里就是由数百万个像素点组成的矩阵。哪怕熔岩灯没有任何变化,相机传感器本身受热激发产生的感光噪点(Shot Noise)也会让每一个像素的 RGB 数值产生微小的随机跳动。服务器将这一整张充满了流体混沌与光学噪点的图片转化为一串长长的哈希值,注入生产环境的随机数生成器中,瞬间就能为数以亿计的加密连接提供源源不断的真随机种子。

不仅如此,为了防止有人潜入旧金山大厅破坏这面墙,他们在伦敦办公室挂了一组做着混沌运动的双摆(Double Pendulum)——物理学中最经典的“蝴蝶效应”模型;在新加坡办公室则放置了一台盖革计数器,用一块无害的微量放射性铀矿石,通过捕捉原子核衰变这一量子力学层面上绝对不可预测的事件,来汲取宇宙最底层的随机性。

甚至还有一个名为 RANDOM.ORG 的著名网站,自 1998 年起就用灵敏的无线电接收器对着天空,全天候采集大气层中雷暴与电磁干扰产生的无线电噪声,将大自然的静电杂音转化为真随机数,免费或付费提供给全球的彩票系统、科研机构与加密网络。


五、秩序的尽头,由混沌守护

当我们把目光从那面发光的熔岩灯墙上收回,会发现这几乎是现代科技中最富哲学意味的一幕奇观。

在过去的一个世纪里,人类倾尽全力在硅片上构建一个纯粹秩序的帝国。我们用纳米级的光刻机雕刻电路,用严丝合缝的布尔代数消除一切模棱两可,试图在充满偶然与无常的自然界中,开辟出一片百分之百可预测、可控制的确定性净土。

然而,当这座秩序大厦越建越高,我们却惊讶地发现:纯粹的秩序是脆弱的。 如果一切都可以被完美推导,那么秘密就不再存在,信任就无法建立,整个数字文明的安全底座就会在一瞬间坍塌。

于是,最精密的数字机器不得不低下高傲的头颅,通过镜头去凝视一团受热融化的彩色石蜡,去倾听大气层里的雷电杂音,去捕捉原子核衰变的脉搏。

原来,计算机世界里最坚不可摧的秩序,最终必须由真实世界里最不可捉摸的混沌来守护。

添加新评论