加密级 CSPRNG
crypto.getRandomValues() ——与保护 TLS 连接和密钥生成相同的来源。它保证不可预测性:即使知道其他所有层,结果仍然无法计算。
不可预测性技术
大多数网站写 Math.random() 然后称之为随机。我们通过 SHA-256 混合三个独立的熵源,并展示如何验证。
如果外部信标不可用,网站不会崩溃:仍有两个独立来源——加密级生成器和您操作产生的熵。
三层
每一层都弥补另一层的弱点。它们合在一起提供了任何单一生成器都无法提供的东西:不可预测性、物理属性和可验证性。
crypto.getRandomValues() ——与保护 TLS 连接和密钥生成相同的来源。它保证不可预测性:即使知道其他所有层,结果仍然无法计算。
不可预测性每一次鼠标移动、点击和按键,都是微米级精度的坐标和纳秒级波动的时序。我们把它们哈希进一个 256 比特的池中,每个事件都会更新。数据不会离开浏览器。
物理属性drand 是一个由独立组织(Cloudflare、EPFL、Protocol Labs 等)组成的分布式网络,每隔几秒发布一个签名的随机数据块。任何人都能验证签名,确认数值没有被替换。
可验证性可以在信标服务器上验证: https://api.drand.sh/public/6588551。BLS 签名由分布式委员会签发——无法单独伪造。
正在请求公共随机信标……
检验
我们用工具实际使用的同一生成器生成一个大样本,并用统计准则检验:字节均匀性(卡方)、比特平衡、序列相关性。
卡方检验生成数字的字节分布是否均匀。对于 255 自由度,正常值约为 255;p 值大于 0.05 表示统计上未发现偏离随机性的迹象。
如果不局限于 Math.random(),究竟会有什么变化。
| 特性 | Math.random() | 我们的生成器 |
|---|---|---|
| 来源 | 伪随机,仅初始化一次 | CSPRNG + 物理熵 + 公共信标 |
| 可预测性 | 根据若干值即可还原 | 无法还原 |
| 可验证性 | 否 | drand 签名轮次 |
| 离线时的来源 | 有 | 保留 CSPRNG + 动作 |
| 质量控制 | 否 | 公开的统计检验 |