跳转到主要内容

加密货币中的熵与随机性:为何至关重要

每一个加密货币私钥、每一个助记词,以及你使用的每一个地址,都始于一个随机数。你的整个加密资产组合安全性都建立在一个前提上:这个数字必须真正不可预测。如果生成密钥的随机数生成器很弱、有偏差或可预测,你的资金就可能被盗走——不是通过破解密码学,而是通过猜中密钥。

本指南将解释在密码学语境下熵的含义、随机数生成器如何工作、历史上随机性失效时出了什么问题,以及如何确保你的密钥生成过程可靠。

什么是熵?

在信息论中,熵衡量的是一段数据中的不确定性或不可预测性。在密码学中,熵量化的是一个值包含了多少位真实随机性。

一个 256 位私钥应当具有 256 位熵——这意味着攻击者平均需要尝试 2^255 次猜测才能找到它(平均搜索空间的一半)。如果这个密钥实际只由 32 位熵生成(因为 RNG 有缺陷),攻击者只需约 2^31 次猜测——大约 20 亿次,现代计算机几分钟就能穷举完成。

熵的度量

熵以比特(bits)为单位。随机变量 X 的熵为:

H(X) = -sum(p(x) * log2(p(x))) for all possible values x

对于一个均匀随机的 256 位数字:

  • 每一位为 0 或 1 的概率都是 0.5。
  • 熵 = 256 位(该长度下的最大值)。

对于一个有偏生成器(每一位为 1 的概率是 0.7):

  • 每位熵 = -(0.7 * log2(0.7) + 0.3 * log2(0.3)) = 0.881 位。
  • 256 位总熵 = 225.5 位(比理想值低 11.9%)。

即使很小的偏差,在大量位数上也会累积,并显著降低有效安全级别。

BIP-39 场景下的熵

助记词长度安全级别以 10^12/秒暴力破解
12 个词128 位128-bit~10^19 年
15 个词160 位160-bit~10^28 年
18 个词192 位192-bit~10^38 年
24 个词256 位256-bit~10^57 年

这些数字都假设熵是真正均匀的。如果 RNG 有缺陷,实际安全级别可能会大幅下降。

随机数生成器的类型

真随机数生成器(TRNG)

TRNG 采样的是在量子层面本质不可预测的物理现象:

  • 热噪声 — 由电子热运动引起的电阻电压随机波动。
  • 散粒噪声 — 由电子流离散性导致的电流随机波动。
  • 放射性衰变 — 单次衰变事件发生时刻在根本上不可预测。
  • 大气噪声 — 来自闪电及其他大气过程的射频噪声。

像 Ledger 和 Trezor 这样的硬件钱包使用片上 TRNG。它们会采样物理噪声源,并通过白化与健康测试处理输出。

优点: 来自物理世界的真实随机性;没有可预测的确定性状态。
缺点: 依赖硬件;噪声源退化时可能静默失效;吞吐量可能受限。

密码学安全伪随机数生成器(CSPRNG)

CSPRNG 是一种确定性算法,只要种子足够随机,其输出就与真实随机不可区分:

  • Linux: /dev/urandom(使用 ChaCha20 或类似密码算法,由硬件熵播种)。
  • macOS: /dev/urandom(arc4random,由硬件熵播种)。
  • Windows: BCryptGenRandom(CNG provider)。
  • Web browsers: crypto.getRandomValues()(委托给操作系统 CSPRNG)。
  • Python: os.urandom()secrets 模块。
  • Node.js: crypto.randomBytes()

优点: 快速;算法研究充分;全平台可用。
缺点: 强度取决于初始种子熵;属于确定性系统——若内部状态泄露,后续输出都可预测。

非密码学 PRNG(绝不要用于密钥)

多数编程语言标准库中的随机函数是为统计模拟设计,而非密码学用途:

  • Python: random.random()(Mersenne Twister——确定性,可由 624 个输出恢复状态)。
  • JavaScript: Math.random()(V8 中为 xorshift128+——可预测)。
  • C: rand()(线性同余生成器——极易预测)。
  • Java: java.util.Random(线性同余——可预测)。

这些生成器熵低、周期短、状态可预测。将它们用于密钥生成,几乎等同于没有随机性。绝不要用这些函数生成私钥或助记词。

随机性失效的历史案例

Android SecureRandom 漏洞(2013)

2013 年 8 月,Android 对 SecureRandom 的实现被发现存在严重缺陷。某些 Android 设备上的 Java PRNG 未被正确播种,导致多个 Bitcoin 钱包应用从可预测状态生成私钥。攻击者利用该问题盗取了约 55 BTC。这个漏洞影响了 ECDSA 签名 nonce 的生成——同一 nonce 使用两次即可从两份签名中反推出私钥。

“Blockchain Bandit”(2019)

安全研究员 Adrian Bednarek 发现,有些钱包使用了极弱私钥生成——例如 123,或对简单字典词仅哈希一次。攻击者多年来系统性地从这些地址清扫资金,累计超过 45,000 ETH。这个“土匪”只需枚举低熵密钥并检查是否有余额。

被清扫的密钥示例:

  • 私钥 0x0000000000000000000000000000000000000000000000000000000000000001(数字 1)
  • 由常见密码和短语派生的私钥

Milk Sad 漏洞(2023)

libbitcoin-explorer(bx)工具的 seed 命令使用了仅由 32 位系统时间播种的 Mersenne Twister。这意味着该工具生成的所有密钥最多只有 32 位熵——约 43 亿种可能。攻击者对这些密钥进行暴力破解并盗取了资金。

Debian OpenSSL 弱密钥漏洞(2008)

Debian 维护者意外删除了一行为 OpenSSL 随机数生成器提供熵的代码。在两年时间内(2006-2008),Debian 和 Ubuntu 系统上生成的所有密码学密钥都只有来自进程 ID 的 15 位熵,最多仅 32,767 个唯一密钥。受影响系统在此期间生成的所有 SSH 密钥、SSL 证书以及任何加密货币密钥都已被攻破。

经验教训

  1. 不要在未经验证的情况下信任单一熵源。
  2. 微小实现错误也可能灾难性地降低熵。
  3. 攻击者会主动利用弱随机性——这不是理论风险。
  4. 对于熵关键操作,开源且经过审计的代码至关重要。

熵源详解

操作系统熵池

现代操作系统维护一个由多种来源喂入的熵池:

  • 中断时序 — 硬件中断(键盘、鼠标、磁盘、网络)时序提供不可预测输入。
  • 磁盘 I/O 时序 — 读写操作的精确时序受机械与电子因素影响而变化。
  • 硬件 RNG — 现代 CPU(Intel RDRAND、AMD)包含片上随机数生成器。
  • 启动期熵 — 某些系统可跨重启保存熵(Linux 的 /var/lib/systemd/random-seed)。

操作系统使用密码学原语混合这些来源进入熵池,再用该池为其 CSPRNG 播种。在现代 Linux 内核(5.18+)中,/dev/urandom 会在启动时阻塞直至收集到足够熵,之后将不再阻塞。

浏览器熵(crypto.getRandomValues)

当你使用 SafeSeed 这类基于 Web 的工具时,会调用浏览器的 crypto.getRandomValues() API。它会委托给操作系统 CSPRNG:

  • Chrome: 委托给 OS CSPRNG(BoringSSL)。
  • Firefox: 委托给 OS CSPRNG(NSS)。
  • Safari: 委托给 OS CSPRNG(CommonCrypto)。

只要底层操作系统安全,这种方式就可被认为适用于密钥生成。主要风险在于运行环境中 OS CSPRNG 可能受损(例如熵源不足的虚拟机,或被攻陷的操作系统)。

硬件钱包熵

硬件钱包使用片上真随机数生成器:

  • Ledger (Secure Element ST33): 使用 ST33 芯片 TRNG 采样模拟噪声。输出在使用前通过 NIST SP 800-90B 健康测试。
  • Trezor: 使用 STM32 芯片硬件 RNG。Trezor 还支持混入用户提供的掷骰子熵。
  • Coldcard: 使用 ATECC608A 安全元件 TRNG 加 MCU 硬件 RNG,并混合两种来源。

掷骰子熵

手动掷骰子是最透明的熵生成方式:

  • 公平六面骰每次投掷产生 log2(6) = 2.585 位熵。
  • 掷 100 次可产生约 258.5 位熵——足够用于 24 词助记词。
  • 用户可通过物理方式验证随机性(公平骰子、公平投掷、无操纵)。

验证骰子公平性:

  • 使用赌场级精密骰子(锐边,不是圆角)。
  • 在坚硬平整且有挡板的表面投掷。
  • 不要“摆放”骰子——让其自由翻滚。
  • 每次结果立即按顺序记录。
SafeSeed Tool

SafeSeed Seed Phrase Generator 允许你输入自有熵(如掷骰结果)来生成 BIP-39 助记词。这样你既能验证随机性来源,又能受益于工具对 BIP-39 的正确实现。为获得最高安全性,请离线使用该工具——参见我们的离线密钥生成指南

随机性的测试与验证

NIST 统计测试套件

NIST SP 800-22 定义了一组用于评估随机数生成器的统计测试:

  • 频数测试 — 0 和 1 的数量是否大致相等?
  • 分块频数测试 — 各子块位分布是否大致均匀?
  • 游程测试 — 连续相同比特序列(runs)长度是否符合预期?
  • 最长游程测试 — 最长游程是否在预期范围内?
  • 矩阵秩测试 — 二进制矩阵秩是否符合预期分布?
  • 谱测试 — 位序列 DFT 是否表现出预期特性?

这些测试可以检测偏差与模式,但不能证明生成器是安全的。它们只能发现失败迹象。

Dieharder 测试套件

更全面的统计测试电池,包含原始 Diehard 测试及额外测试。可在 Linux 上以开源软件形式使用。

用户可行的实用验证

多数用户无法运行 NIST 测试套件。可执行的验证步骤如下:

  1. 来源验证 — 工具是否使用 crypto.getRandomValues()os.urandom() 或硬件 RNG?检查源代码。
  2. 交叉生成测试 — 多次生成助记词,确认每次都不同。
  3. 熵显示 — 某些工具会显示原始熵;检查其看起来是否随机(无明显模式)。
  4. 开源审计 — 工具是否开源,且是否经过审计?

混合熵源

高安全级别密钥生成的最佳实践是混合多个熵源:

Final Entropy = Hash(Hardware RNG output || OS CSPRNG output || User dice rolls || Timing data)

混合来源可确保即使某一个来源被攻破或有偏差,只要至少有一个来源提供足够熵,最终输出仍然安全。这正是设计良好的硬件钱包和密钥生成工具采用的方法。

XOR 混合

一种简单的混合方法是 XOR:如果你有来源 A 的 256 位和来源 B 的 256 位:

Mixed = A XOR B

只要 A 或 B 其中之一是真随机,结果就是真随机。若两者都存在偏差但相互独立,结果通常会比任一单独来源偏差更小。

哈希混合

对于长度或质量不同的来源,可将其一起哈希:

Mixed = SHA-256(Source_A || Source_B || Source_C)

哈希函数可充当熵提取器,无论输入格式如何都产生均匀输出。

多重签名中的熵

多重签名钱包提供了一种熵冗余:即使某一个密钥由弱熵生成,攻击者仍需攻破其他密钥。一个每把密钥都独立生成的 2-of-3 multisig,其安全性等同于最强密钥,而不是最弱密钥。

这也是高价值资产存储采用多重签名方案的有力理由。

常见问题

加密货币中的熵是什么?

熵是用于生成密码学密钥的数据中随机性或不可预测性的度量。在加密货币中,你的私钥和助记词安全性完全取决于是否具有足够熵。一个 256 位密钥应包含 256 位真实随机性——如果熵更低,密钥就会变得可猜测。

安全钱包需要多少熵?

12 词 BIP-39 助记词提供 128 位熵,24 词提供 256 位。以当前技术来看,两者都可抵抗暴力破解。对于高价值的长期存储,建议使用 256 位(24 词)以获得最大安全余量。

Math.random() 可以安全生成加密密钥吗?

绝对不可以。Math.random() 及类似的非密码学 PRNG(Python 的 random、C 的 rand())是确定性的、可预测的且熵很低。它们绝不能用于密码学密钥生成。浏览器请始终使用 crypto.getRandomValues(),Python 使用 os.urandom(),或使用硬件随机数生成器。

我可以靠“自己想随机数”来生成熵吗?

不可以。人类在生成随机数方面非常不可靠。研究持续表明,人为选择的“随机”序列熵远低于看起来的水平。应改用物理过程(骰子、硬件 RNG)或密码学安全的软件 RNG。

如何验证钱包的随机数生成器是安全的?

检查钱包源代码(如其开源)以确认其使用 CSPRNG 或硬件 TRNG。查找对 crypto.getRandomValues()os.urandom() 或硬件 RNG API 的调用。对于硬件钱包,查看厂商安全文档和第三方审计报告。

“blockchain bandit” 是什么?它对熵有什么启示?

“blockchain bandit” 是一名系统性盗取弱私钥钱包资金的攻击者(例如私钥是 1、2、3,或由简单密码派生)。这证明攻击者会主动枚举低熵密钥并清扫发现的资金。它强调了使用高熵随机数生成的关键重要性。

硬件钱包随机数生成器值得信任吗?

硬件钱包 TRNG 通常值得信任,但它们仍是单点信任。为达到最高安全性,你可以将硬件 RNG 输出与用户提供熵(掷骰)混合。一些硬件钱包(如 Trezor 和 Coldcard)原生支持这种混合。这可确保即使硬件 RNG 被攻破,生成密钥仍保持安全。

操作系统(Linux、macOS、Windows)会影响密钥安全吗?

会。操作系统 CSPRNG 的质量与实现会影响密钥安全。现代 Linux、macOS 和 Windows 都提供密码学安全随机数生成器(/dev/urandomarc4randomBCryptGenRandom)。但 2006-2008 年 Debian OpenSSL 漏洞表明,OS 层漏洞可能灾难性地降低熵。请保持系统更新并使用经过充分审计的软件。

相关指南