打开网易新闻 查看精彩图片

1971年,一台PDP-11计算机用当前时间做种子,生成了两个完全相同的"随机"密钥。相隔4毫秒。

这是计算机伪随机数历史上最昂贵的教训之一。工程师花了三周才定位问题:时间种子撞车,导致加密会话被复现。从此,"真随机"成了安全领域的执念。

确定性机器如何假装不可预测

确定性机器如何假装不可预测

计算机是设计来100%可预测的。输入相同,输出必同。这是 feature,不是 bug。但游戏需要随机地图,加密需要不可破解的密钥,机器学习需要打乱数据集——这些场景都要求一个确定性系统假装自己疯了。

随机数生成器(PRNG)就是这个魔术道具。它接受一个叫"种子"的数字,吐出一串看起来随机的序列。种子相同,序列必同。所以随机性的质量,完全取决于种子的不可预测性。

业余方案是用当前时间——自1970年1月1日以来的秒数或毫秒数。对游戏地形生成够用了。但对加密?攻击者如果猜到你在整点启动程序,就能复现你的全部"随机"序列。

C语言标准库的rand()函数用的是线性同余生成器(LCG)。计算极快,但极度可预测。从几个输出就能反推整个生成器状态。2008年,OpenSSL的Debian版被发现种子熵值不足,导致两年内生成的所有密钥理论上可被暴力破解。

加密场景需要"真"随机,但真随机不存在

加密场景需要"真"随机,但真随机不存在

密码学需要专门的加密安全伪随机数生成器(CSPRNG)。它的种子必须来自有足够熵的环境——系统噪声、硬件中断时间、鼠标移动轨迹、甚至大气噪声。

Linux的/dev/random会阻塞,直到收集到足够的环境噪声。/dev/urandom则不阻塞,但用熵池持续搅拌。2014年,FreeBSD发现某款CPU的RDRAND指令可能被植入后门,于是改成把RDRAND输出和多个其他熵源混合,而非单独信任。

云服务器是个特殊挑战。虚拟机没有物理硬件的噪声源,启动时熵池往往是空的。2012年,一台刚启动的Ubuntu云实例生成了重复的SSH密钥——因为种子撞车。现在的解决方案包括从宿主机注入熵,或者干脆等用户敲几下键盘再生成密钥。

机器学习把随机性当饭吃

机器学习把随机性当饭吃

随机森林算法,名字就写在脸上。它用随机子集训练多棵决策树,再投票表决。神经网络初始化权重如果全设成一样,所有神经元会学到完全相同的特征——模型废了。

Dropout随机丢弃神经元,强迫网络学冗余表示。数据增强随机裁剪、翻转、加噪,让模型见过更多"伪样本"。这些技术的共同点:用可控的随机性防止过拟合,强迫模型学通用规律而非死记硬背。

但这里的随机性要求不同。不需要密码学级别的不可预测,只需要统计上的均匀分布。PyTorch和TensorFlow默认用梅森旋转算法(MT19937),周期长达2^19937-1,足够训完所有大模型。

硬件随机数生成器:把物理噪声数字化

硬件随机数生成器:把物理噪声数字化

Intel的RDRAND指令从电路热噪声中提取随机性。量子计算机用量子叠加态的坍缩——这是目前最接近"真随机"的物理过程。Cloudflare的旧金山总部有一面墙,100个熔岩灯,摄像头持续拍摄灯内蜡滴的混沌运动,提取熵值。

但这些方案都有成本。硬件RNG速度慢,量子设备还关在实验室里。熔岩灯墙很酷,但多数系统用的还是软件CSPRNG,只是种子来源越来越花哨。

2019年,谷歌的Chromium浏览器开始把用户行为(鼠标移动、按键间隔)也纳入熵池。代价是隐私争议——你在生成随机数的同时,也在被测量。

下次你打开一个HTTPS网站,握手过程里交换的随机数,可能来自CPU的热噪声、你鼠标的抖动、以及服务器硬盘寻道时间的微小差异。三层熵源叠加,才换来地址栏那把绿色小锁。

但有个问题没人能回答:如果量子计算机真的能生成物理层面的真随机,我们怎么证明它不是伪装的?