从 Coldcard 事件看随机数的重要性
2026 年 7 月底,一批由 Coldcard 生成的钱包被集中盗取。早期公开统计显示,首轮扫荡在约 41 分钟内涉及 1,196 个地址、超过 1,000 BTC;此后受影响地址和损失数字仍在增加。
最令人后背发凉的是:攻击者自始至终没有接触过任何一台设备,没有侵入过任何网络,用户没有点错任何钓鱼链接,设备上的防篡改封装也完好无损。 这些钱包绝大多数被持有人默默存放在保险柜里,冷放了数年之久。
问题发生在所有防护措施之前:钱包生成的种子不够随机。
Coldcard 事件不是对比特币算法的破解,而是一次典型的密码学工程失败。它说明,离线、安全芯片和复杂的签名协议都建立在同一个前提上——最初那把钥匙必须无法被猜中。
一把看似正常的弱钥匙
创建钱包时,设备首先收集一份不可预测的熵,再把它编码成 BIP-39 助记词。助记词与可选的 passphrase 经过密钥拉伸得到 seed,随后按 BIP-32 等公开规则派生整棵私钥树。
后面的计算都是确定的。整个钱包真正的不可预测性,来自最开始的那份熵。
典型的安全实现会从硬件真随机数发生器(TRNG)取得物理噪声,经调理后播种密码学安全伪随机数生成器(CSPRNG/DRBG),再由后者稳定地产生随机字节:
物理噪声 → TRNG → 调理与 CSPRNG → BIP-39 助记词 → Seed → HD 私钥树根据 Coinkite 的技术复盘,2021 年迁移密码学组件后,Coldcard 的种子生成路径没有调用预期的板级 TRNG,而是落入 MicroPython 的软件 PRNG 回退实现。正确的 TRNG 代码仍然存在于固件中,错误实现也拥有相同的函数签名,因此固件可以正常编译,设备也能照常生成助记词。
一切功能都正确,只有安全性错了。
厂商目前估计,受影响的 Mk2/Mk3 种子约有 40 位有效熵;Mk4/Mk5/Q 因额外混入安全芯片数据,约有 72 位,而不是预期的至少 128 位安全强度。
2⁴⁰ 大约是一万亿种候选。一次候选测试还涉及助记词、密钥派生和地址计算,不能简单等同于“一万亿次普通哈希”;但从密码学尺度看,40 位已经从不可行的攻击退化为可以通过专用优化、预计算和并行硬件处理的工程问题。
攻击者不必求解椭圆曲线离散对数,只需枚举生成器真正可能产生的种子,推导对应地址,再与公开区块链上的 UTXO 匹配。找到地址,也就找到了能够支配资金的私钥。
这就是为什么设备躺在保险柜里仍然会丢币:离线能够保护一个已经生成的秘密,却无法弥补它出生时缺失的随机性。
随机数为什么是密码学的地基
密码算法通常是公开的。攻击者知道曲线、哈希函数、签名算法和派生路径。系统的安全性不依赖算法被隐藏,而依赖攻击者不知道具体的密钥。
一串私钥即使有 256 位,如果它实际上只由 40 位内部状态决定,其有效安全性也至多是 40 位。哈希可以把短输入变成长输出,却不能凭空创造攻击者不知道的信息;24 个格式正确、看起来杂乱的单词,也可能只是一个很小候选集合的编码。
所以,熵不是字符串有多长,也不是输出看起来有多乱,而是攻击者还剩多少种合理猜测。
这里需要澄清一个常见误解:伪随机并不等于不安全。现代密码系统本来就广泛使用 CSPRNG。TRNG 负责提供不可预测的初始熵,CSPRNG 负责安全、高效地扩展这份熵。真正危险的是初始熵不足、播种状态可预测,或者硬件熵源失效后静默回退到非密码学 PRNG。
Math.random()、C 语言的 rand() 和 MT19937 可以生成统计性质良好的序列,却不能用于生成密码学密钥。以 MT19937 为例,获得足够的完整输出后即可恢复内部状态,继而预测后续结果。密码学需要的不是“分布看起来均匀”,而是攻击者即使知道算法并观察过输出,仍无法在现实成本内预测未知结果。
评估熵源时,密码学尤其关心最小熵:
H∞(X) = −log₂(maxₓ P(X = x))
假设一个随机源以 50% 的概率输出 0,其余 50% 均匀分布在 2¹²⁸ 个值上。它的 Shannon 熵约为 65 位,但攻击者第一次猜 0 就有一半成功率,因此最小熵只有 1 位。密码学关注的正是这种“最佳一次猜测”有多危险。
最危险的是,它不会报错
随机数故障是一种沉默故障。
解密实现出错,接收方可能无法解密;签名实现出错,节点可能拒绝交易;随机数只有 40 位有效熵时,钱包却仍然可以正常创建、备份、恢复、收款和签名。弱助记词与强助记词在屏幕上没有区别,也都会通过格式校验。
系统没有停止工作,只是失去了安全工作的能力。
类似教训在密码学史上反复出现:Debian OpenSSL 曾因熵收集代码被移除,使密钥空间大幅缩小;Android 的 SecureRandom 播种缺陷曾导致部分比特币钱包的 ECDSA nonce 可预测;Sony PS3 因签名 nonce 重复而暴露代码签名私钥。这些事件没有破解底层算法,而是绕开了算法赖以成立的随机性前提。
随机数故障还具有追溯性。今天修好生成器,无法给昨天的密钥补充熵。由缺陷 RNG 生成的种子,只要仍在控制资金,就仍然处于风险中。
行业应该吸取什么教训
第一,熵源异常必须失败关闭(fail closed)。硬件 RNG 不可用或健康检测失败时,设备应拒绝生成种子,不能在用户不知情的情况下回退到较弱实现。
第二,测试真实调用链,而不只是检查输出。低熵输出同样可以“看起来随机”,统计测试也不能证明调用了正确的硬件。构建期应验证实际链接的 RNG 符号,发布测试应覆盖从“创建钱包”到实际熵源的完整路径。
第三,把密钥生成视为最高风险代码。随机数、签名 nonce、密钥派生和备份恢复路径的任何改动,都应接受独立审计、可复现构建和版本差分检查。开源使审计成为可能,但代码可以被看到,不代表关键路径真的有人验证过。
第四,用独立性降低单点失败。大额资金可采用跨厂商、跨实现的多签。关键不只是使用多台设备,而是让密钥来源和代码体系真正独立;如果多把密钥都由同一缺陷实现生成,多签并不能自动消除风险。
确定性签名也能减少签名阶段对随机 nonce 的依赖,例如 RFC 6979 ECDSA、EdDSA,以及正确实现的 BIP340 Schnorr。但它们解决不了密钥生成本身的弱随机问题:创建钱包的那一刻仍然需要可靠的熵。
用户补充骰子熵可以构成纵深防御,却不应成为厂商逃避责任的理由。一个承诺生成安全种子的产品,其默认流程就必须安全。
结语
Coldcard 事件并不意味着硬件钱包或离线存储没有价值。它们仍能隔离大量来自联网设备、恶意软件和远程入侵的风险。但“冷”只是安全链条中的一段,真正的安全必须从密钥生成的第一比特开始。
密码学安全不在于密钥写了多少位,而在于攻击者还剩多少种可能;不在于源代码中有没有 TRNG,而在于关键路径是否真的调用了它;也不在于设备是否离线,而在于整条信任链有没有静默降级。
随机数很少是安全产品宣传中的主角,却是密钥、nonce 和安全证明共同站立的地基。地基一旦变薄,再高的城墙也守不住一把可以被猜中的钥匙。