硬件钱包中的非确定性随机数(Nonce)漏洞看似只是微小的代码失误,却可能让攻击者获取加密地址背后的私钥。虽然该设备将私钥离线存储,但其生成的每一笔签名都会公开在区块链上。
每笔签名都包含一个隐藏值,称为“非确定性随机数”(Nonce)。当固件存在缺陷或芯片生成该值的质量不佳时,签名本身就会开始泄露秘密。这一切的关键在于私钥的工作原理:谁持有私钥,谁就控制着资金。
硬件钱包是一种小型物理设备,用于离线存储私钥并在设备内部对交易进行签名。这类设备处于硬件钱包和冷存储的核心地位,因为私钥从未接触过联网的计算机。
签名依赖于数字签名方案。比特币和以太坊均使用 ECDSA(椭圆曲线数字签名算法),这是美国政府数字签名标准涵盖的方案。每个 ECDSA 签名都需要一个非确定性随机数。
“Nonce”是“Number Used Once”(仅使用一次的数字)的缩写。钱包为每次签名创建一个全新的秘密值,然后将其与私钥和交易哈希混合。
这个词在其他加密货币领域也有出现。例如,“挖矿 Nonce”是矿工在寻找有效区块时不断尝试更改的数字;而“以太坊账户 Nonce”仅是已发送交易的数量计数器。这两者与此处讨论的签名 Nonce 无关,只有签名 Nonce 才是关键所在。
签名数学将非确定性随机数与私钥绑定在一起。如果非确定性随机数保持保密且随机,私钥就是安全的。如果非确定性随机数重复或可被预测,这种联系就会暴露。
最明显的失败情况是重用。当一个密钥使用相同的非确定性随机数对两笔不同的交易进行签名时,两个签名会共享相同的“r”值。监控区块链的扫描工具可以发现这一匹配,并通过简单的代数运算推导出私钥。
较弱的缺陷同样会造成损害。研究表明,如果故障生成器泄露了每个非确定性随机数的少量可预测位,收集足够的签名后,攻击者可以通过格基约简攻击(Lattice Attack)恢复私钥。由于签名是公开的,收集它们没有任何成本。
在这些情况下,设备本身从未被触碰。泄露完全发生在公开数据中,这正是硬件钱包非确定性随机数漏洞如此隐蔽且难以察觉的原因。
| 非确定性随机数重用 | 同一密钥两次使用相同值 | 从两笔签名中解出密钥 | 可预测的非确定性随机数 | 弱种子或初始化不良的生成器 | 攻击者猜测非确定性随机数并推导密钥 | 有偏见的非确定性随机数 | 每次签名泄露几位比特 | 从大量签名中恢复密钥 | 错误的签名步骤 | 故障损坏输出结果 | 错误的签名揭示线索 |
大约在 2010 年,某游戏机制造商的固件签名代码对每次签名使用固定的非确定性随机数。研究人员从公开文件中重建了主签名密钥,这一教训从此铭刻在密码学家的记忆中。
更大的加密货币事件发生在 2013 年 8 月。Android 随机数生成器的缺陷导致某些比特币钱包应用重用非确定性随机数。随后,攻击者扫描区块链以查找重复值并进行盗窃。
这两种情况都不涉及硬件钱包。然而,硬件钱包非确定性随机数漏洞背后的机制是相同的,专用设备的区别仅在于故障生成器的位置发生了变化。它位于一个密封的芯片内,用户无法检查。
小型嵌入式芯片比笔记本电脑具有更少的噪声输入。它们依赖电气噪声、时间差异或专用的熵电路来创建随机数。
问题通常始于以下几个地方:生成器可能在启动时种子设置不良;固件库可能包含编码错误;调试值可能混入发货代码中,或者更新可能悄然改变生成器的行为方式。
公开固件代码允许外部审查人员检查硬件钱包非确定性随机数漏洞修复背后的逻辑。尽管审查不能保证完美无缺,但闭源代码意味着更少的人关注这一过程。
预防硬件钱包非确定性随机数漏洞的标准解决方案是非确定性随机数确定化生成(Deterministic Nonce Generation)。与其在签名时请求随机数生成器,不如通过基于哈希的函数从私钥和消息中派生非确定性随机数。该方法作为 RFC 6979 发布。
相同的消息产生相同的非确定性随机数;不同的消息产生不同的非确定性随机数。这样,故障生成器就无法导致重复。
一些设计在此基础上增加了额外的随机性,以帮助抵抗故障攻击。常见的保护措施包括:
遵循已发布的 RFC 6979 方法的确定性非确定性随机数派生。 经过测试并由真实硬件熵电路支持的随机数生成器。 内部签名检查,阻止损坏的输出离开设备。 独立的固件审计,并公开披露发现的任何漏洞。受影响设备的用户通常遵循供应商的建议。标准的响应是进行固件更新,然后将资金转移到使用新种子创建的新钱包中,因为一旦私钥暴露,就无法再使其安全。
硬件钱包非确定性随机数漏洞的影响范围取决于钱包的设置。泄露的密钥控制其自己的地址,而更广泛的暴露则取决于该钱包如何派生其他地址。
地址重用会增加风险。来自同一密钥的每笔额外签名都为攻击者提供了更多材料,这对于有偏见的非确定性随机数尤为重要。为每笔交易使用新地址可以保持每个密钥的签名数量较低,而安全的加密钱包设置通常从一开始就建立这一习惯。
硬件钱包非确定性随机数漏洞将普通的签名变成了线索。私钥虽然留在设备内部,但有缺陷的随机性使得公开数据能够揭示它。相关的数学原理古老且广为人知。
引人注目的是,造成问题的错误少得惊人。一个重复的值就足够了,而且证据永远保存在区块链上。尽管确定性非确定性随机数降低了风险,但谨慎的工程实践仍然至关重要。
目前尚不确定的是哪些当前设备存在硬件钱包非确定性随机数漏洞。供应商建议、固件版本说明和已发布的审计报告是下一步需要检查的地方。