加密货币中的熵与随机性:为何至关重要
每一个加密货币私钥、每一个助记词,以及你使用的每一个地址,都始于一个随机数。你的整个加密资产组合安全性都建立在一个前提上:这个数字必须真正不可预测。如果生成密钥的随机数生成器很弱、有偏差或可预测,你的资金就可能被盗走——不是通过破解密码学,而是通过猜中密钥。
本指南将解释在密码学语境下熵的含义、随机数生成器如何工作、历史上随机性失效时出了什么问题,以及如何确保你的密钥生成过程可靠。
什么是熵?
在信息论中,熵衡量的是一段数据中的不确定性或不可预测性。在密码学中,熵量化的是一个值包含了多少位真实随机性。
一个 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 发现,有些钱包使用了极弱私钥生成——例如 1、2、3,或对简单字典词仅哈希一次。攻击者多年来系统性地从这些地址清扫资金,累计超过 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 证书以及任何加密货币密钥都已被攻破。
经验教训
- 不要在未经验证的情况下信任单一熵源。
- 微小实现错误也可能灾难性地降低熵。
- 攻击者会主动利用弱随机性——这不是理论风险。
- 对于熵关键操作,开源且经过审计的代码至关重要。
熵源详解
操作系统熵池
现代操作系统维护一个由多种来源喂入的熵池:
- 中断时序 — 硬件中断(键盘、鼠标、磁盘、网络)时序提供不可预测输入。
- 磁盘 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 Seed Phrase Generator 允许你输入自有熵(如掷骰结果)来生成 BIP-39 助记词。这样你既能验证随机性来源,又能受益于工具对 BIP-39 的正确实现。为获得最高安全性,请离线使用该工具——参见我们的离线密钥生成指南。
随机性的测试与验证
NIST 统计测试套件
NIST SP 800-22 定义了一组用于评估随机数生成器的统计测试:
- 频数测试 — 0 和 1 的数量是否大致相等?
- 分块频数测试 — 各子块位分布是否大致均匀?
- 游程测试 — 连续相同比特序列(runs)长度是否符合预期?
- 最长游程测试 — 最长游程是否在预期范围内?
- 矩阵秩测试 — 二进制矩阵秩是否符合预期分布?
- 谱测试 — 位序列 DFT 是否表现出预期特性?
这些测试可以检测偏差与模式,但不能证明生成器是安全的。它们只能发现失败迹象。
Dieharder 测试套件
更全面的统计测试电池,包含原始 Diehard 测试及额外测试。可在 Linux 上以开源软件形式使用。
用户可行的实用验证
多数用户无法运行 NIST 测试套件。可执行的验证步骤如下:
- 来源验证 — 工具是否使用
crypto.getRandomValues()、os.urandom()或硬件 RNG?检查源代码。 - 交叉生成测试 — 多次生成助记词,确认每次都不同。
- 熵显示 — 某些工具会显示原始熵;检查其看起来是否随机(无明显模式)。
- 开源审计 — 工具是否开源,且是否经过审计?
混合熵源
高安全级别密钥生成的最佳实践是混合多个熵源:
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/urandom、arc4random、BCryptGenRandom)。但 2006-2008 年 Debian OpenSSL 漏洞表明,OS 层漏洞可能灾难性地降低熵。请保持系统更新并使用经过充分审计的软件。