ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

熔岩灯生成加密随机数?揭秘Cloudflare LavaRand熵源原理

熔岩灯生成加密随机数?揭秘Cloudflare LavaRand熵源原理 如果只看照片你可能会以为 Cloudflare 旧金山办公室那面墙只是一种奇怪的企业文化展示约一百盏熔岩灯挂在墙上五颜六色的蜡状物在瓶子里缓慢浮沉。但真正懂行的人会知道这面墙是该互联网基础设施公司生产环境中一个真实存在的熵源。Cloudflare 用它拍摄熔岩灯运动的照片把图像转换成随机数据用来辅助生成互联网加密体系赖以生存的密钥。这篇文章不是讲酷炫办公设计的。我想讲清楚一个经常被低估的问题互联网加密到底有多依赖随机性为什么一台确定性的计算机需要一面熔岩灯墙来帮忙产生随机数以及这件事对正在写业务代码的你意味着什么——你日常使用的随机数接口真的是加密安全的吗读完你会得到三样东西一是对随机数与加密关系的基础认知二是对 LavaRand 这种从物理世界提取熵方案的技术拆解三是一套可以直接落到工程里的安全随机数实践清单。无论你是后端开发者、安全工程师还是单纯对 HTTPS 原理好奇的技术人这篇内容都值得花十分钟读完。1. 这篇文章真正要解决的问题很多人有一个误区觉得加密 复杂的数学运算 长长的密钥。只要密钥够长、算法够新就足够安全。这个判断只对了一半。现代加密算法AES、ChaCha20、RSA、ECDSA 等的数学基础是完全公开的任何人都能下载规范、查看源码。真正的秘密不在算法里而在密钥里。而密钥的质量完全取决于一件事生成它的随机数是否不可预测。如果随机数生成环节出了问题密钥再长也无济于事。这正是熔岩灯和互联网加密产生联系的起点。Cloudflare 处理着世界上相当大比例的 HTTPS 流量每次 TLS 握手中都需要生成新的临时密钥、随机挑战值、初始化向量。这些随机数的生成质量直接影响整个加密体系的安全。为了获得足够好的随机性他们除了在服务器里配置硬件随机数生成器之外还在办公室搭了一整面熔岩灯墙作为额外的熵源。这篇文章会从加密场景中的随机数需求讲起逐步拆解 PRNG、熵池、硬件熵源这些概念然后聚焦到一个非常典型的真实案例Cloudflare LavaRand 如何用熔岩灯照片产生加密随机数。最后我会给出普通开发者在生产环境中使用加密随机数的具体建议和避坑指南。2. 加密为什么需要真正的随机数2.1 随机数在加密中的几个关键用途很多人以为随机数只在生成密钥时用到实际上它贯穿了整个加密生命周期。至少包括下面几个场景密钥生成对称加密的密钥、非对称加密的私钥都需要随机字节来生成。初始化向量IVGCM、CBC 等分组密码模式需要随机 IV避免相同明文产生相同密文。随机数NonceTLS 握手、数字签名、防重放攻击中都依赖一次性随机数。盐值Salt对用户密码做哈希前加入随机盐防止彩虹表攻击。挑战值Challenge很多认证协议中服务器向客户端发送随机挑战值客户端必须正确回应才能通过认证。这些场景有一个共同点随机数一旦可以被预测整个安全体系就会崩溃。2.2 可预测随机数造成的真实灾难历史上因为随机数质量问题导致的安全事故并不少举两个典型的例子。第一个是 Debian OpenSSL 漏洞CVE-2008-0166。当时 Debian 的维护者在修复一个编译警告时删掉了 OpenSSL 中用于收集系统随机性的两行代码导致随机数生成器的唯一种子来源变成进程 PID。在 Linux 系统中 PID 的取值范围非常有限攻击者只需要枚举几万个可能性就能还原出服务器生成的 SSH 密钥和 SSL 证书。这个漏洞影响了 2006 到 2008 年间所有 Debian 系系统生成的安全密钥。第二个是 Android SecureRandom 误用事件2013 年。某些 Java 应用在初始化 SecureRandom 时使用了固定种子或者在不完善的虚拟化环境中使用了不安全的默认实现最终导致生成的比特币钱包私钥落在一个很小的集合里攻击者可以暴力枚举并转走对应的资产。这类事件反复说明同一个道理密码学中的随机不是指看起来乱就行而是必须做到计算上不可预测。这正是 LavaRand 想解决的核心问题。3. 计算机的随机数PRNG、CSPRNG 与熵池在介绍熔岩灯方案之前需要先建立几个基础概念。3.1 计算机本身不具备真随机能力计算机是严格的确定性机器给定相同的输入CPU 会执行完全相同的指令得到完全相同的结果。所以靠纯软件运算计算机永远无法自然产生真正的随机数。那编程语言里的random()函数是什么呢它是伪随机数生成器PRNGPseudo-Random Number Generator本质是一个确定性算法。只要初始状态种子相同它生成的序列就完全相同。PRNG 有很多种。比如 C 语言里的rand()常基于线性同余算法LCGJava 的java.util.Random也是一类可预测的 PRNG。这类生成器可以用来做模拟、抽奖、随机遍历等非安全场景但绝不能用来生成密钥。3.2 加密安全伪随机数生成器CSPRNG密码学对随机数有更严格的要求为此专门定义了加密安全伪随机数生成器CSPRNGCryptographically Secure Pseudo-Random Number Generator。它有两个关键特性不可预测性即使攻击者获得了当前输出的一部分也无法推断出后续输出。不可恢复性即使攻击者获得了当前内部状态也无法复原之前已经输出的内容。常见的 CSPRNG 包括 Linux 内核的/dev/urandom、OpenSSL 中的RAND_bytes、Java 的SecureRandom、Python 的secrets模块等。注意CSPRNG 仍然是伪随机的因为它的输出由一段确定性算法产生。它真正的随机性来源是种子seed也就是初始化时的内部状态。只要种子足够随机且保密CSPRNG 的输出就足够安全。3.3 熵池随机种子的收集器那种子从哪里来这就引入了熵的概念。在信息论和密码学里熵可以粗略理解为不确定性或不可预测性的量度。一个均匀随机的 256 位字符串它包含 256 比特的熵如果只有 100 万种可能取值那它的熵只有约 20 比特远远不够。操作系统通过熵池entropy pool来收集环境中不可预测的事件作为种子的来源。常见的软件熵源包括用户敲击键盘的时间间隔、鼠标移动轨迹、网络数据包到达的时间、磁盘 IO 的中断时间、CPU 周期计数等硬件熵源则包括 CPU 内置指令如 Intel RDRAND读取的热噪声。Linux 系统的熵池状态可以从/proc/sys/kernel/random/entropy_avail查看。如果你部署在一台安静的服务器上无人操作、网络单调、磁盘负载低熵的积累速度可能非常慢。早年很多依赖/dev/random的服务在熵不足时会阻塞读取导致启动变慢甚至卡死——这就是生产环境中熵饥饿问题的由来。从 Linux 5.6 开始内核随机数子系统做了一次大重构/dev/random在系统完成初始化后不再阻塞但理解熵池依然是排查随机性问题的基础。3.4 不同熵源的对比熵源类型速率适用场景典型代表系统事件时间软件低-中通用服务器键盘、鼠标、网络中断硬件热噪声硬件高服务器、桌面 CPUIntel RDRAND大气噪声物理高公共随机数服务random.org量子现象物理高高安全场景量子随机数生成器熔岩灯流体运动物理中专用熵源Cloudflare LavaRand4. 熔岩灯方案Cloudflare LavaRand 是什么现在可以聊主角了。4.1 背景一家全球 CDN 公司为何需要大量随机数Cloudflare 是一家全球性的 CDN 和网络安全公司它的大部分业务都发生在 TLS 加密连接中。当浏览器访问某个使用 Cloudflare 服务的网站时浏览器和 Cloudflare 的边缘服务器要完成一次 TLS 握手这中间会生成大量随机数。边缘服务器数量众多、握手请求频繁对随机数的需求量非常大。作为一家把安全写进商业模式的公司Cloudflare 一直对随机数生成质量很敏感。他们在 2017 年公开的博客中详细介绍了自己的经验只依赖操作系统自带的熵池和 CPU 内置的随机数指令还不够他们希望有更多样化、更不可预测的熵源。于是团队里有人提议用办公室里的熔岩灯把她的混沌运动变成随机数素材。4.2 熔岩灯墙的构成Cloudflare 旧金山办公室有一面专门的熔岩灯墙上面陈列了约一百盏熔岩灯。这些灯并没有统一的开关时间每盏灯因灯泡老化程度、电压波动、温度差异等因素呈现出完全不同的运动节奏。墙对面安装了一个工业级摄像头每隔几秒拍一张照片。每张照片大约 1MB包含了大量细节每盏熔岩灯的形态、颜色分布、气泡位置、背景光线变化等。这些细节本身充满了微小而不可预测的变化。4.3 为什么不担心被复制熔岩灯运动是一个典型的混沌系统。蜡状物的浮沉取决于灯内液体的温度分布、对流模式、蜡的凝固温度、瓶壁的摩擦系数等大量参数而这些参数又受到灯泡温度、环境温度、电压的小幅波动影响。混沌系统的核心特征是对初始条件极其敏感——哪怕初始状态的差异小到无法测量一段时间后系统状态也会出现巨大分歧。因此即使给两个观察者相同的熔岩灯复制品让他们从同一时刻开始拍摄几十分钟后拍到的照片也会完全不同。这种物理层面的不可预测性正是密码学意义上良好的熵源。4.4 从照片到随机字节知道了是什么还要知道怎么变成随机数。从 Cloudflare 公开的技术描述看LavaRand 的流程大致如下摄像头定时拍摄熔岩灯墙。原始图像被压缩降低体积同时保留足够多的视觉随机特征。压缩后的图像经过哈希、编码等处理提取出熵字节。得到的熵字节与系统已有的熵源混合一起作为密码学随机数生成器的种子材料。注意LavaRand 并不是直接用照片本身作为随机密钥而是把照片处理后的熵注入到 CSPRNG 中作为众多种子来源之一。这是很关键的设计思路——它不追求唯一随机源而是追求多个独立随机源互相增强。5. LavaRand 的技术细节拆解这一节我们更深入一些看几个值得关注的技术决策。5.1 为什么选择摄像头而不是内置传感器理论上直接在熔岩灯中放置温度传感器、压力传感器也能采集数据。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进