你的助记词到底有多难猜?ColdCard 又是怎么让它变好猜的

要点总结
• ColdCard 的一次固件错误更新,让钱包从硬件随机数发生器静默退回到了软件伪随机数生成器
• 这使可能的助记词总数从 2^256 缩小到约 2^40(约 1.1 万亿),Mk2/Mk3 受影响最重,Mk4/Mk5/Q 约为 2^72
• 攻击者从未破解设备本身,只是猜中了那些不再难猜的助记词
• 一套正常生成的 24 词 BIP-39 助记词发生碰撞的概率,比下一秒遭遇灭绝级伽马射线暴还要小约 5×10^60 倍
• 真随机数发生器取自物理噪声,即使攻击者掌握设备型号、序列号、启动时间和全部源代码也无从推算
本文以科普为主,为了便于理解,部分技术细节做了简化和类比处理,可能与实际实现存在出入。如涉及具体的资产安全处置,请以官方公告为准,并咨询专业人士。
2026 年 7 月 30 日,比特币链上发生了一起异常的集中转账事件:短短 15 分钟,500 个地址先后向同一个地址转入约 594.48 枚比特币(约合 3800 万美元)。随后,其中约 562 枚比特币又被集中转往另一个地址。这显然不是正常的转账事件,后经证实,这是黑客盗取比特币资产之后转移赃款的手段。链上记录
500 个来源地址 → 同一个归集地址(约 594.48 BTC / 约 3800 万美元) → 另一个地址(约 562 BTC)
随着受害者陆续发声,一个共同点逐渐浮出水面:他们都用过 Coldcard 硬件钱包。当天,Coldcard 的厂商 Coinkite 发布了安全警告,他们的官方调查和独立技术分析都确认,确实是 ColdCard 钱包出了问题。问题出在随机数生成环节,这导致攻击者并不需要破解 Coldcard,只需要猜中用户的助记词就可以盗取资产。
到底是怎么一回事呢?
这次安全事故,问题出在了生成助记词这个环节。
举个例子,正常情况下,硬件钱包生成助记词,就像从一座近乎无穷大的钥匙库里随机抽出一把交给你,用这把钥匙打开只属于你的保险箱。但 Coldcard 的程序出了问题,抽钥匙的范围从整座钥匙库缩成了一个小抽屉。只要把抽屉里的钥匙一把一把地试过去:试开一把,就搬空一个。
当然,这个比喻并不准确——但原理就是这样。更准确点说,是 ColdCard 固件团队的一次错误更新,使得钱包在生成助记词时无法调用更安全的硬件随机数生成器,而是用了"伪随机"的软件随机数生成器,使得生成的"密码"——也就是助记词——的安全性不足,最终导致了这场事故。
看到这里,你可能会疑惑:为什么我的助记词和随机数有关呢?黑客是怎么找到保险箱对应的密码的呢?随机数生成器又是个啥?别着急,听我慢慢道来。
助记词背后究竟是什么?
助记词为什么能证明资产属于你?
在说助记词的来源之前,我们先要搞懂一个东西:你的资产、钱包和助记词的关系。
助记词其实并不是很像保险箱钥匙。在区块链的底层设计中,你的资产其实一直公开在区块链上,就像放在银行里的现金,现金本身没有印上所有者的姓名,所有人都能看见,理论上所有人都有权处置任何资产。但事实显然不是所有人都能无限量地取钱,这是因为在进行转账等操作前,区块链会要求你出具"凭证",证明你有这么多资产,这笔资产是属于你的,而这个"凭证"就是助记词。
也就是说,不管是谁,只要在区块链上输入助记词,查询到这串助记词对应的资产就是谁的,哪怕背后操作人不是你,因为区块链只会看到有人提交了证明资产的"凭证"。
有人发起一笔转账 → 区块链要求出示凭证 → 用助记词生成的签名 → 验证通过,资产可动
链只认凭证,不认人。
所以,助记词的性质比较像"房产证",或者一枚带有"特殊数字标记"的公章。公章本身很容易仿造,真正起到防伪作用的是它携带的特殊"数字"——按照助记词的设计,这串数字几乎不可能被别人猜中。
所以问题的关键就聚焦在这串"数字"上了,它是怎么来的?又怎么保证资产安全呢?
助记词是怎么从数字变成单词的?
我们都知道,计算机使用的是二进制。无论是文字、图片还是密码,到了计算机内部,最终都会变成一串由 0 和 1 组成的代码。助记词当然也不例外。
比如,它在计算机里可能长成这样:
010101000010
但你可能会问了:助记词明明是一个个英文单词,又不是数字,它到底是怎么从这串 0 和 1 里变出来的呢?
其实没有那么复杂。我们可以先准备一本"字典",规定每一段数字分别对应哪个单词。为了方便理解,先随便做一本只有 16 个单词的小字典:
接下来,我们把刚才那串代码切成三部分:
0101 | 0100 | 0010
然后拿着这三段数字去查字典:
0101 → squirrel
0100 → coffee
0010 → moon
这样,一串原本看起来很难读的二进制代码,就变成了三个容易记录的词:
squirrel coffee moon
这就是助记词最核心的原理:它并不是凭空冒出来的一组单词,而是把一串数字切成很多小段,再按照固定词表,把每一段翻译成对应的单词。
当然,真实的助记词会比这个例子复杂一些:它使用的词表更大、数字更长,还会加入校验信息。但核心逻辑并没有变——助记词只是那串数字更方便人类抄写、保存和恢复的另一种表达方式。
24 个单词到底有多难猜?
理解了这个之后,我们就可以说到真正的助记词了。现在生成助记词的标准有很多,可以简单理解为那本"字典"有很多本,我们以最常用的那"本"——BIP-39 为例,讲一讲助记词的安全性到底来源于什么。
BIP-39 这本字典,内部足足有 2048 个单词,比我们刚才例子中使用的字典大得多,但本质差不多,它也是由一串很长的二进制代码切割出来的。具体来说,它是由一个长 264 位的代码切割出来的,每 11 位表示一个单词,每个单词有 2^11 也就是 2048 种可能,刚好对应字典中的 2048 个单词。
但是计算机使用的是二进制,生成的随机数只能是 2 的倍数,不能直接生成 264 位随机数,因此我们可以让它先生成一个 256 位的随机数,再把前 8 位数字挪到末尾,这样就有 264 位随机数了,可以生成 24 位助记词。
还记得我们前面讨论过的吗?助记词这个"公章"的安全性,来源于一串特殊的数字,这个数字就是助记词背后对应的随机数。同时我们也说过,"公章"之所以安全,就是因为别人猜不到上面的数字是多少,猜一个错的数字去声明一笔资产属于自己肯定是不可能的吧。那么这串数字到底有多难猜呢?关键就在随机数的位数:256 位随机数足足有 2^256 种可能性,就是对应 2^256 串助记词,也可以是 2^256 个钱包地址。
这个数字到底有多大呢?常见的可观测宇宙基本粒子数量大约 10^80,而 2^256 ≈ 10^77,也就是说,我们几乎可以给宇宙中所有的可观测粒子一个钱包地址!而地球上的总人口才大约 2^33,每个人也能分到约 2^223 个——也就是 1 后面跟着 67 个零那么多:
10,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000
所以黑客想要猜到你的助记词,就像从这么多地址中精准捕捉到一个有余额的地址,这个难度非常非常大。
但是这个时候有人可能就会问了:可不可能计算机会偶然生成两个一模一样的钱包地址呢?这样后来者就可以偷走前面人的资产了啊?好问题,而且这个可能确实存在,不过现实生活中这不可能发生。对于两套独立、正常生成的 24 词 BIP-39 助记词,完全相同的概率是 1 / 2^256 ≈ 8.6 × 10^-78。
而据权威论文估算,下一秒地球遭遇一次足以引发大规模物种灭绝的伽马射线暴的概率,大约是 4.4 × 10^-17。也就是说,助记词撞车的概率比物种大灭绝的概率还要小约 5 × 10^60 倍。
可想而知,助记词到底有多难猜。
ColdCard 究竟犯了什么错?
从 2 的 256 次方缩小到 2 的 40 次方
理解了助记词背后究竟是什么,就可以理解 ColdCard 究竟犯了什么错了。
ColdCard 团队的一次错误的更新,使得生成助记词时,本来应该有 2^256 种可能的助记词,实际却只剩下 2^40 种,相差了巨大的数量级。当然你可能会问 40 位随机数是怎么生成 24 个助记词的,但是不用纠结这个,只需要知道,这个错误让 ColdCard 生成的钱包地址被猜中的可能性大幅上升。
需要说明的是,不同型号受到的影响程度并不一样:本文提到的约 40 位主要针对 Mk2/Mk3,Mk4/Mk5/Q 的估算约为 72 位。
这样一对比,答案就呼之欲出了:用 ColdCard 生成的助记词总共只有 1,099,511,627,776 串。对黑客来说,只要动用高性能计算机一个一个地试,就有机会盗取资产。虽然仍然费力,但这已经不再是人类现阶段无法处理的数量级了。
事情到这里,还不算太糟糕,毕竟 1,099,511,627,776 这个数字也挺大了,叠加网络波动,黑客或许需要试好几年才查到一个有余额的地址。
但非常遗憾的是,ColdCard 的失误还导致连生成这些可能值的计算方法都有迹可循,这大幅降低了破解难度。
软件随机数为什么会被猜中?
这是因为 ColdCard 生成助记词随机数使用的是一个"软件随机数生成器",这类生成器严格意义上来说都是"伪随机",其算法都是有迹可循的。为什么这么说呢?
先想象一下什么是随机。假设我们正在抛一枚硬币,我们一般说硬币正反面朝上的可能性是均等的 50%,随机出现正面或者反面。这是因为我们在抛硬币的时候,硬币在空中翻转,运动轨迹受到多重因素影响,比如:我们抛掷的力度、地球的重力、房间里空调的风力风向、地转偏向力,甚至地壳运动微小的震动等等我们能想到的、甚至想不到的因素。这些因素叠加,导致我们不可能计算硬币在空中的轨迹,从而无法判断结果,所以我们相信抛硬币的结果是"随机"的。
但是"软件随机数生成器"生成随机数的算法是固定的。一般来说,会根据某几个初始条件,经过固定的算法,算出固定的随机数;换言之,我们只需要知道它生成随机数的这几个初始条件,就知道它生成的随机数是什么,也就是助记词。
好巧不巧的是,生成的初始条件,大家一般用的都是以下几个:生成时的时间戳、设备开机的时间戳、设备序列号等等。这意味着黑客只需要推测一下这些数字,就可以设计算法来攻破 ColdCard 生成的助记词。也就是说,黑客根本不需要乱猜,因为助记词的生成方式本身就有规律可循。
硬件随机数生成器到底怎样保证安全?
一切一切的根源,其实是 ColdCard 没有使用"真随机数发生器",也就是 SE 芯片的硬件随机数发生器。就像上面说的,普通软件 PRNG 是一个确定公式:
设备编号 + 时间 + 算法 → 随机数
如果攻击者能枚举设备编号和时间,就能重新计算所有结果。
而真随机数发生器则利用物理现象,例如:
- 电路热噪声;
- 振荡器抖动;
- 晶体管亚稳态;
- 雪崩噪声;
- 某些设备中的量子噪声;
- 宇宙射线导致的随机内存错误。
等等来生成助记词,就像抛硬币的过程中有很多人类无法预测的干扰因素一样。过程变成:
不可预测的物理噪声 → 采样并数字化 → 整理、哈希 → 用于初始化密码学安全 PRNG → 生成助记词
即使攻击者知道设备型号、序列号、启动时间和全部源代码,也无法倒推出当时电路噪声的具体波形。这才是真正可靠的随机性。
衡量随机性的参数——"熵"
什么是熵?
"熵"听起来很复杂,其实可以简单理解成:在答案揭晓之前,一件事究竟有多少种可能。
比如,一枚正常的硬币有正面和反面两种可能。抛一次硬币,就相当于产生了 1 位熵,因为 2^1 = 2。连续抛两次,就有 4 种可能:正正、正反、反正、反反,相当于 2 位熵,因为 2^2 = 4。以此类推,连续抛 256 次,就会有 2^256 种不同的结果,这就相当于产生了 256 位随机性。
但熵的关键,不只是结果看起来杂乱,更重要的是别人不能提前知道结果。如果一枚硬币被做了手脚,每次都会落在正面,那么即使抛 256 次,它产生的熵仍然是 0,因为结果早就可以被预测。
如果连真随机数发生器也不相信呢?
如果你连硬件钱包里的真随机数发生器也不相信,还有一个更加朴素的办法:自己抛硬币,亲手制造随机数。
你可以把正面记为 0,反面记为 1,连续抛 256 次,并把每一次结果记录下来。这样就得到了一串 256 位的二进制数字。然后,在完全离线的环境中,按照 BIP-39 标准为这串数字计算校验码,再把它转换成 24 个英文单词,这就是一套完整的助记词。
抛 256 次硬币 → 记录正面和反面 → 得到 256 位二进制数字 → 按 BIP-39 计算校验码 → 转换成 24 个助记词 → 导入硬件钱包
这里要注意:硬币只能替代"生成随机数"这一步,不能替代硬件钱包。之后的钱包保管、地址生成和交易签名,仍然应该在硬件钱包的隔离环境中完成。联网设备只负责观察和广播交易,不应该接触你的助记词。
不要把真实的硬币结果输入联网网页,也不要凭感觉随便编一串 0 和 1。只有每一次结果都确实来自不可预测的抛掷,这串数字才真正具有随机性。
常见问题
没有。设备本身并未被攻破。固件缺陷导致助记词从一个小得多的取值范围中生成,因此攻击者可以直接暴力穷举猜出助记词,而不需要攻击硬件。
不同型号受影响程度不同。本文讨论的约 40 位随机性主要针对 Mk2 和 Mk3,Mk4、Mk5 和 Q 的估算约为 72 位。确切影响范围请以 Coinkite 官方公告为准。
软件生成器是一套固定算法,输入是时间戳、设备序列号等少数初始条件,任何人只要能猜到这些输入就能重算出它的输出。硬件生成器采集电路热噪声、振荡器抖动等不可预测的物理噪声,无法从公开信息中重算出来。
24 词 BIP-39 助记词背后是一个 256 位随机数,共有 2^256 种可能,约合 10^77,接近可观测宇宙的基本粒子总数。
可以。把正面记为 0、反面记为 1,连续抛 256 次,然后在离线环境中按 BIP-39 计算校验码并转换成 24 个单词。但硬币只能替代生成随机数这一步,钱包保管和交易签名仍应在硬件钱包中完成,且结果绝不能输入联网网页。






