订阅以接收新文章的通知:

治理 Cloudflare 办公室里的混乱情况

2024/03/08

21 分钟阅读时间
Harnessing chaos in Cloudflare offices

在儿童读物《蜗牛和鲸鱼》一中,主人公在经历了一次出乎意料的远行冒险后,回到对“时光飞逝”和“成长”的扪心自问中。距我们上次撰写关于 LavaRand 的报道已过去四年,在此期间,关于 Cloudflare 如何借助物理熵源强化互联网安全的故事广为流传,并成为许多人关注的焦点。起初只是一种物理熵源——熔岩灯,如今已经发展成多种多样的形式。我们想稍微向您介绍一下 LavaRand 的故事。本文将介绍加入 LavaRand 的新曾“混沌”源,以及如何在您的下一个应用程序中利用这些混沌。我们将探讨公共随机性如何开启对公众可信随机性的应用。想象一下,当“随机抽签”的发起者声称抽签结果未受到某种操纵时,我们无需轻信其言辞。最后,我们将探讨时间锁加密,这是一种确保消息在未来某个选定时间之前无法解密的方法。

LavaRand 起源

旧金山熔岩灯墙的熵长期以来在确保 Cloudflare 连接的随机性方面发挥着作用。

Lava lamps with flowing wax.
流动着蜡的熔岩灯

Cloudflare 的服务器每秒总共要处理多达 5500 万个 HTTP 请求,其中绝大多数都通过 TLS 协议来确保真实性和保密性。在底层,类似 TLS 这样的加密协议需要一个可靠的随机源,否则安全保证就会崩溃。

密码学中使用的安全随机性需要在计算上与“真实”的随机性做到无法区分。为此,其既需要时通过统计随机性测试,又需要确保其输出结果对于任何计算能力受限的对手都是不可预测的,无论其已经观察到了多少之前的输出结果。实现这一点的典型方法是获取某些随机“种子”,并将其输入一个密码学安全伪随机数生成器 (CSPRNG) 中,该生成器可以根据请求生成一个本质上无穷尽的不可预测字节流。CSPRNG 的属性可确保所有输出结果对于不知道其内部状态的人来说,与真正的随机输出结果几乎无法区分。但这一切的关键都在于从一开始就存在一个安全的随机种子。阅读本博客,了解有关真随机性与伪随机性的更多详情;阅读博客,了解 了解不安全随机性可能带来的问题的若干卓越示例。

Cloudflare 的服务器多年来始终依赖本地熵源(如数据包到达的精确时间或键盘事件)为其熵池提供种子。尽管相信这些服务器上的本地熵源是安全的且不容易遭到入侵,但我们仍希望针对这种可能性进行防范。我们的解决方案是建立一个系统,使我们的服务器能够定期从外部获取真正的随机性,来刷新其熵池。

这就引出了“LavaRand”。"LavaRand" 长期以来始终是用于生成随机性的系统的代名词(最早由Silicon Graphics 于 1997 年提出)。Cloudflare 于 2017 年推出了 LavaRand 系统实例, 该系统从我们旧金山办公室的熔岩灯墙上收集熵,并通过内部 API 提供。随后,我们的服务器会定期查询 API,从 LavaRand 获取新的随机性,并将其纳入熵池。LavaRand 的作用可以看作是向熵池混合物中加入的调料!(请阅读我们的上一篇博文,以了解更多技术细节)。

Lava lamps in Cloudflare’s San Francisco office.
Cloudflare 旧金山办公室的熔岩灯。

为办公室增添随机性

多年来,我们在旧金山的熔岩灯始终不知疲倦地为我们的系统提供新熵,如今,它已经在全球范围内有了更多同伴来共同完成这些任务!随着 Cloudflare 的发展壮大,我们办公室中的熵源种类也在不断增加。Cloudflare Places 团队致力于确保我们的办公室能够反映我们的价值观和文化。我们几处较大的办公地点都安装了物理熵系统,随着时间的推移,我们已经逐渐将这些系统融入到 LavaRand 中。这些系统之所以引人注目和激动人心,是因为它们以物理力学为基础,并且我们可以直观地观察到其随机性。在熔岩灯中,温暖上升的“熔岩”在熔岩灯中漂浮,与冷却下沉的斑点相互交织,吸引着我们的注意,就像其他不可预测的(通常还很美丽的)动态系统一样让我们着迷。

伦敦变幻莫测的钟摆

我们伦敦办公室的访客可以看到一堵由双摆组成的墙,其优美的摆动可提供除了 LavaRand 和 Cloudflare 服务器随机性池之外的另一个熵源。

Close-up of double pendulum display in Cloudflare’s London office.
Cloudflare 伦敦办公室的双摆展示特写。

对于未经训练的眼睛来说,摆锤支架的阴影和后墙上旋转臂投下的阴影可能会显得杂乱无章。如果是这样,那么该装置应该说是成功的!不同的光照条件和那些阴影使该熵源捕捉到的瞬间更加混乱。

Double pendulum display in Cloudflare’s London office with changing light conditions.
Cloudflare 伦敦公室的双摆展示,光照条件不断变化。

事实上,即使对于这些被限制在二维运动中的摆臂,其轨迹也表现出令人着迷的多样性,并且可以在数学上证明具有混沌性质。即便我们忽略空气阻力、温度和环境,并假设变异是完全确定的,最终的长期运动仍然难以预测。特别是,系统对初始条件非常敏感,而初始状态的设置方式与确定性行为相结合,产生了一条独特的轨迹,一直延续到钟摆停下。随后,将由伦敦的一名 Cloudflare 员工将其再次启动。

奥斯汀令人着迷的移动装置

漂亮的 Cloudflare 德克萨斯州奥斯汀新办公室最近迎来了开业一周年庆典。 这间办公室对物理熵做出了自己的贡献:悬挂在奥斯汀市中心 Cloudflare 办公室入口上方的是一个半透明彩虹色移动装置。这些移动装置不断旋转,映射着变幻的光线,并在周围的墙壁上投下五彩斑斓的图案。 悬挂移动装置及其投影的展示对于包括门的开合、暖通空调变化和环境光等物理环境非常敏感。这一混沌系统迷人而不断变化的场景将被定期捕捉,并输入到 LavaRand 的随机流中。

Hanging rainbow mobiles in Cloudflare’s Austin office.
在 Cloudflare 的奥斯汀办公室悬挂着彩虹色移动装置。

将新源纳入 LavaRand

我们以与现有的溶岩灯相同的方式将办公室的新混沌源整合到 LavaRand 系统中(尽管包含的内容远不止溶岩灯),这一过程与我们之前已详细描述过的现有溶岩灯相同。

简而言之,在重复的间隔中,摄像机会捕捉随机显示当前状态的图像。由于底层系统是真正随机的,因此所生成的图像也包含真正的随机性。即便是阴影和持续变化的光线条件也能产生独特且不可预测的效果!我们还要分享一个秘密:在基本层面上,现实世界中的图像传感器通常会产生足够多的噪声,以至于即使是在没有取下镜头盖的情况下拍摄的图像,也能有效地充当熵源!我们认为,在这些装置优美的混沌运动中,这些额外的噪音是一种偶然的补充。

Close-up of hanging rainbow mobiles in Cloudflare’s Austin office.
Cloudflare 奥斯汀办公室悬挂的彩虹移动装置特写。

一旦获得获得捕捉特定时间点随机显示状态的静态图像,我们就会计算图像的紧凑表示,即哈希值,以生成一组固定大小的真正随机字节。

Process of converting physical entropy displays into random byte strings.
将物理熵显示转换为随机字节串的过程。

随后,这些随机字节(连同先前的种子和来自系统本地熵源的某些随机性)作为输入,传递到密钥派生函数 (KDF) 中,用于计算新的随机性种子。该种子将被输入到一个密码学安全伪随机数生成器 (CSPRNG) 中,该生成器可以在请求时生成一个几乎无穷尽的不可预测字节流。CSPRNG 的特性可确保所有输出对于不了解其内部状态的任何人来说几乎无法与真正随机输出加以区分。随后,LavaRand 通过一个简单的内部应用程序接口 (API) 公开该随机流,使客户端能够请求最新的随机数据。

seed = KDF(new image || previous seed || system randomness)
rng = CSPRNG(seed)
…
rand1 = rng.random()
rand2 = rng.random()

如何使用 LavaRand?

应用程序通常使用两种安全随机性中的一种:私人随机性和公共随机性。

私人随机性用于生成密码、加密密钥、用户 ID 等永久保密的数值。正如我们之前所述,我们的服务器会定期向 LavaRand 请求新的私有随机性,以帮助更新其熵池。因此,LavaRand 的随机性基本上是向外界开放的!开发人员可通过在 Cloudflare Worker 中使用 Web Crypto API 的getRandomValues 函数或使用已经构建好的函数,比如 csprng.xyz)来轻松利用 LavaRand 的私有随机性。

公共随机性由不可预测且无偏的随机值组成,这些随机值发布后,所有人均可获得,因此不应用于生成加密密钥。一些公共随机值的实例包括中奖的彩票号码和体育赛事开始时的硬币投掷。一个双面硬币不会是一个无偏和不可预测的熵源,而且还会对体育博彩界产生巨大影响。

除了不可预测和无偏之外,公共随机性还应当是可信的,以确保使用者相信这些数值是按照公正的原则生成的。如果人们认为中奖彩票未被公平选择,那么很少有人会购买彩票!事实上,腐败的内部人员为了个人利益而破坏公共随机性的案例屡见不鲜,例如州立彩票公司的员工就曾 操纵彩票随机数生成器,让自己的亲朋好友赢得了数百万美元的奖金。

公共随机性的一个基本挑战在于,人们必须信任产生随机输出的权威机构。对于许多应用来说,信任像 NIST 这样的知名权威机构 可能已经足够,但对于其他应用(尤其是对去中心化非常重要的应用)来说,则可能会存在问题。

drand:分布式、可验证公共随机性

为了解决这一信任问题,Cloudflare 于 2019 年与其他七个独立且地理分布广泛的组织联合成立了熵联盟旨在使用 drand (发音为 dee-rand)协议启动公共随机性信标。每个组织都将自身独特的随机性贡献到用于种子化 drand 网络的熵池中,当然,Cloudflare 采用的是来自 LavaRand 的随机性!

尽管熵联盟最初只是一个实验性网络,但在 Protocol Labs的 drand 团队的指导和支持下,熵联盟已发展成一个可靠的、可投入生产的核心互联网服务,被各种应用程序所广泛依赖,从分布式文件存储线上游戏再到再到时间戳证明时间锁加密 (将在下文进一步讨论)。与此同时,熵联盟也在不断发展壮大,目前有来自四大洲的组织加入 drand 网络。

熵联盟的 drand 信标(每个信标都具有不同的参数,例如随机值产生的频率以及随机性是否连锁--下文将详细讨论)具有两个有助于提高其可信度的重要特性:去中心化可验证。去中心化可确保一两个不良行为者无法颠覆或歪曲随机性信标,而可验证性则使任何人都能够检查随机值是否根据 drand 协议生成,并且得到了 drand 网络中至少半数(通常更多)参与者的参与。因此,随着每个新成员的加入,drand 网络的可信度和可靠性都会不断提升。

我们将在下文简要介绍 drand 如何通过分布式密钥生成和阈值签名来实现这些特性。要深入了解,请参阅我们之前的博客文章以及 drand 团队的出色文章

分布式密钥生成和阈值签名

在 drand 信标的初始设置过程中,网络中的节点运行基于 Pedersen承诺方案的分布式密钥生成 (DKG) 协议。其结果是,每个节点都持有一个分布式群组密钥的"份额"(密钥对),该密钥在信标的整个生命周期内保持不变。为了对群组密钥执行实用操作,比如签署消息,网络中至少必须有一个阈值(例如 9 个中的 7 个)的节点参与构建 BLSBLS 阈值签名。以下是熵联盟主网 drand 网络上 quicknet 信标的群组信息:

curl -s https://drand.cloudflare.com/52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971/info | jq
{
  "public_key": "83cf0f2896adee7eb8b5f01fcad3912212c437e0073e911fb90022d3e760183c8c4b450b6a0a6c3ac6a5776a2d1064510d1fec758c921cc22b0e17e63aaf4bcb5ed66304de9cf809bd274ca73bab4af5a6e9c76a4bc09e76eae8991ef5ece45a",
  "period": 3,
  "genesis_time": 1692803367,
  "hash": "52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971",
  "groupHash": "f477d5c89f21a17c863a7f937c6a6d15859414d2be09cd448d4279af331c5d3e",
  "schemeID": "bls-unchained-g1-rfc9380",
  "metadata": {
    "beaconID": "quicknet"
  }
}

(上述 URL 中的十六进制值 52db9b...是信标配置的哈希值)。请访问 https://drand.cloudflare.com/chains 查看我们主网 drand 节点支持的所有信标)。

网络中的节点被配置为定期(对于 quicknet 是每 3 秒一次)协同工作,以生成某个约定信息的签名,例如当前轮次编号和上一轮的签名(将在下文将详细介绍)。每个节点利用其组密钥的份额对当前轮次的消息进行部分签名,并将其广播给网络中的其他节点。 当节点收集到足够的部分签名后,它可以将其进行汇总并生成给定轮次的组签名。

curl -s https://drand.cloudflare.com/52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971/public/13335 | jq
{
  "round": 13335,
  "randomness": "f4eb2e59448d155b1bc34337f2a4160ac5005429644ba61134779a8b8c6087b6",
  "signature": "a38ab268d58c04ce2d22b8317e4b66ecda5fa8841c7215bf7733af8dbaed6c5e7d8d60b77817294a64b891f719bc1b40"
}

每轮组签名都代表随机性(在上述输出中,对于更倾向于较短、固定大小输出的应用程序,随机性的数值就是签名的 sha256 哈希值)。只要足够多的节点(至少是大多数,但可以配置得更高)在 drand 网络中是诚实且非共谋的,签名就是事先不可预测的。另外,任何人都可以使用信标的群组公钥验证特定轮次的签名。建议开发人员利用 drand 客户端 CLI 对从信标获取的每个值执行验证。

链式随机性与非链式随机性

当熵联盟于 2019 年推出第一代 drand 信标时,计算组签名的每轮消息都包含了前一轮的签名。这就形成了一条从第一轮“起源”开始的随机性链。链式随机性为单源随机性信标提供了某些很好的特性,并已作为一项要求被纳入 NIST 的可互操作公共随机信标规范

但早在 2022 年,drand 团队就就引入了非链式随机性的概念,即要签名的消息是可预测的,不依赖于前几轮的任何随机性,并展示其能够为 drand 网络提供与链式随机性相同的安全保证(两者都需要节点的诚实阈值)。在 quicknet 中实现非链式随机性时,要签名的消息只需包含轮次编号即可。

# chained randomness
signature = group_sign(round || previous_signature)

# unchained randomness
signature = group_sign(round)

非链式随机性提供了某些强大的特性和可用性改进。就可用性而言,随机性信标的用户无需重构到起源轮的整个随机性链,就能完全验证特定轮次,其唯一需要的信息是当前轮次编号和组公钥。这为客户端提供了更大的灵活性,因为他们可以选择消耗随机性轮次的频率,而无需持续跟踪随机性链。

由于要签名的消息事先已知(因为它们只是轮次编号),无链随机性还解锁了一个强大的新特性:时间锁加密。

Rotating double pendulums.
旋转双摆。

时间锁加密

时间锁(或“延时揭秘”)加密是一种加密消息的方法,使得在特定时间之前无法解密该消息。Rivest、Shamir 和 Wagner 描述了两种基本的时间锁加密方法:

- 使用 "时间锁谜题"--如果不连续运行计算机至少一定时间,将无法解决某些计算问题。

- 使用承诺在特定日期之前不披露特定信息的可信代理。

使用可信代理显然有一个问题,那就是要确保代理的可信度。可以使用秘密共享的方法来缓解这种顾虑。

drand 网络是一组使用秘密共享确保可信度的独立代理,而“特定日期之前不可泄露的确定性信息”听起来很像每轮随机性!接下来,我们将介绍如何在如何在具备非链式随机性的 drand 网络上实现时间锁加密,最后进行实际演示。尽管我们不深入探讨使这一切成为可能的双线性组和基于配对的密码学,但如果您感兴趣,我们鼓励您阅读由 Nicolas Gailly、Kelsey Melissaris 和 Yolan Romailler合著的《tlock:基于阈值 BLS5 的实用时间锁加密》

如何设置时间锁以保护您的秘密

首先,确定一旦揭示就会解密您时间锁加密消息的随机轮次。一个重要的发现是,由于 drand 网络在固定的时间间隔产生随机性,drand 信标中的每一轮都与特定的时间戳密切相关(网络实际产生信标的延迟很小),该时间戳可以通过取信标的起始时间戳,然后加上轮次乘以信标周期来轻松计算.

轮次确定后,双线性组的特性将允许您使用 drand 信标的组公钥对消息进行加密。

ciphertext = EncryptToRound(msg, round, beacon_public_key)

在 drand 网络中的节点协作推导出轮次的随机性之后(实际上只是使用信标的组秘钥对轮次数字进行签名), 任何人都可以解密密文(这就是双线性组的的神奇之处)。

random = Randomness(round)
message = Decrypt(ciphertext,random)

为了实现实际应用,时间锁定信息实际上就是对称方案的秘钥。这意味着我们使用对称密钥加密消息,然后用时间锁定对密钥进行加密,以便在未来对其进行解密。

现在,为了实际演示时间锁加密,我们使用了我们其中一位工程师在 Cloudflare Workers 上构建的工具。如果你想深入了解它的工作原理,源代码是公开可用的。

# 1. Create a file
echo "A message from the past to the future..." > original.txt

# 2. Get the drand round 1 minute into the future (20 rounds) 
BEACON="52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971"
ROUND=$(curl "https://drand.cloudflare.com/$BEACON/public/latest" | jq ".round+20")

# 3. Encrypt and require that round number
curl -X POST --data-binary @original.txt --output encrypted.pem https://tlock-worker.crypto-team.workers.dev/encrypt/$ROUND

# 4. Try to decrypt it (and only succeed 20 rounds x 3s later)
curl -X POST --data-binary @encrypted.pem --fail --show-error https://tlock-worker.crypto-team.workers.dev/decrypt

接下来?

我们希望您和我们一样喜欢重温 LavaRand 的故事,并受到启发,期待您未来能亲临 Cloudflare 的办公室,亲眼见证随机性展示,并在下一个项目中使用来自 drand 的可验证公共随机性和时间锁加密。

确保互联网安全的加密技术需要混沌。Cloudflare 的 LavaRand 将继续将我们物理世界的混沌之美转化为随机性流,即使增加了新的来源,也将为我们所有探索者提供新颖用途,就像那只蜗牛一样,可能性是无限的。

她凝视着天空、大海、陆地,波涛、洞穴和金黄的沙滩。她凝视着,被这一切惊叹不已,然后对鲸鱼说:“我感觉自己是如此渺小。”

A snail on a whale.
鲸鱼背上的蜗牛

敬请关注更多新闻、公告和引发思考的对话!请勿错过 Security Week 中心页面的完整内容。

我们保护整个企业网络,帮助客户高效构建互联网规模的应用程序,加速任何网站或互联网应用程序抵御 DDoS 攻击,防止黑客入侵,并能协助您实现 Zero Trust 的过程

从任何设备访问 1.1.1.1,以开始使用我们的免费应用程序,帮助您更快、更安全地访问互联网。要进一步了解我们帮助构建更美好互联网的使命,请从这里开始。如果您正在寻找新的职业方向,请查看我们的空缺职位
Security Week (CN)Randomness (CN)LavaRand (CN)简体中文

在 X 上关注

Luke Valenta|@lukevalenta
Thibault Meunier|@thibmeu
Cloudflare|@cloudflare

相关帖子

2024年3月08日 14:05

Log Explorer:在没有第三方存储的情况下监视安全事件

借助 Security Analytics + Log Explorer 的综合功能,安全团队可以在 Cloudflare 中本地分析、调查和监控安全攻击,无需将日志转发给第三方 SIEM,从而缩短解决时间并降低客户的总体拥有成本...