OneKey 各型号钱包如何生成助记词,以及随机性从哪里来

要点总结
- 助记词只是熵的一种可读编码;只有创建时熵不可预测,钱包才安全。
- Pro、Classic 1S、Classic 1S Pure 的随机数来自 THD89 安全芯片 TRNG;Classic 用 ATECC608A SE TRNG;Mini 用 STM32 MCU 硬件 TRNG。
- OneKey 所有创建路径都不使用 libngu / Yasmarang / Coldcard / CKCC,并经多轮审计确认,因此不落入受影响的代码路径。
- SHA-256 只用于计算 BIP39 校验位,它不是随机数发生器,助记词的安全性取决于原始熵。
- 助记词一旦泄露或丢失,任何设备、App 或厂商都无法帮你找回,离线备份是你自己的责任。
本文说明 OneKey 各型号在创建新钱包时,如何生成熵和助记词,以及为什么近期关于某些软件随机数实现的担忧并不适用于 OneKey 的相关创建路径。
钱包安全,从一份不可预测的随机性开始
钱包的安全起点是熵(entropy):用于创建钱包的、不可预测的随机比特。助记词只是这份熵的一种可读编码。如果创建时的熵本身可预测,那么之后为它设计的安全机制——PIN、助记词的保管方式、地址派生——都无法补救。
OneKey 不同型号使用的硬件随机数来源并不相同。下面按产品逐一说明创建新钱包时,助记词所使用的熵来自哪里。
近期被讨论的问题,指向的是 libngu 中一处错误的 Yasmarang PRNG 配置,导致某些组合实现绕过了芯片的 TRNG。OneKey 的相关固件路径不使用 libngu、Coinkite、Coldcard 或 CKCC 依赖,并且经过多轮审计确认它确实调用了硬件或安全芯片的 TRNG。下文按设备说明实际调用的硬件随机数接口。
什么是熵,为什么钱包离不开它?
熵可以理解为“不可预测性的数量”,通常以 bit 计量。128 bit 熵意味着有 2^128 种可能的初始值;如果没有其他漏洞,攻击者只能靠猜。钱包的私钥、地址和签名能力,都会从这一个初始秘密确定性地派生出来。
因此,助记词的安全并不来自“英文单词看起来很多”,而来自其背后原始熵的不可预测性:
- 128 bit 熵对应 12 个 BIP39 单词;
- 192 bit 熵对应 18 个 BIP39 单词;
- 256 bit 熵对应 24 个 BIP39 单词。
弱随机数会让攻击者重现钱包创建时的输入,直接得到相同的助记词和私钥。SHA-256、PIN 或安全芯片存储,都不能把可预测的输入变成真正不可预测的熵。
从随机数到助记词,实际如何计算?
各型号细节不同,但 BIP39 钱包的共同计算模型可以概括为:
硬件真随机数发生器(TRNG)
↓
取得 128 / 192 / 256 bit 熵(ENT)
↓
取 SHA-256(ENT) 的前 ENT / 32 bit 作为校验位(CS)
↓
ENT || CS 按每 11 bit 分组,映射到 2048 个 BIP39 单词
↓
12 / 18 / 24 个助记词 → seed → 私钥、地址与签名密钥
例如,12 词助记词使用 128 bit 熵和 4 bit 校验位,共 132 bit,正好分成 12 组、每组 11 bit。每一组是 BIP39 词表中的一个索引。
这里的 SHA-256 用于 BIP39 校验位计算,它不是随机数发生器。助记词的随机性仍然取决于创建时获得的原始熵。
那么,OneKey 的这套实现为什么不受此次 ColdCard 问题的影响?下面按设备分别说明各型号最初的随机数如何产生,以及是否落入受影响的代码路径。
OneKey Pro
OneKey Pro
是否受到影响?
不受此次 ColdCard libngu / Yasmarang 问题影响。Pro 当前构建默认启用 THD89。在设备内创建钱包时,由 THD89 的 TRNG 提供随机输入,固件负责后续的 BIP39 或 SLIP39 编码。
生成流程
THD89 TRNG → 钱包初始化熵 → 固件编码 BIP39 或 SLIP39。
Pro 的 random.bytes() 默认 source=1,在 USE_THD89=1 的默认构建下调用 se_random_encrypted()。
随机性说明
- Pro 默认构建启用 THD89,随机字节通过
se_random_encrypted()获得;这不是 Yasmarang 或libngu的软件 PRNG 路径。 - OneKey 帮助中心说明,当前 EAL6+ 安全芯片的 TRNG 以电子噪声等物理过程作为随机性的基础。
OneKey Classic 1S
OneKey Classic 1S
是否受到影响?
不受此次 ColdCard libngu / Yasmarang 问题影响。Classic 1S 当前公开的设备内创建流程,以 THD89 安全芯片的 TRNG 提供熵,BIP39 助记词字符串由 MCU 固件编码。
生成流程
THD89 TRNG → 128 / 192 / 256 bit 熵 → MCU 按 BIP39 编码助记词。
随机性说明
- “助记词由 THD89 生成”这种说法并不精确:THD89 提供的是随机输入,BIP39 单词编码是在 MCU 固件中完成的。
- 固件调用的是 THD89 的
se_random_encrypted()接口,不使用 Yasmarang 或libngu。OneKey 帮助中心说明,当前 EAL6+ 安全芯片的 TRNG 基于电子噪声等物理过程产生随机数。
OneKey Classic 1S Pure
OneKey Classic 1S Pure
是否受到影响?
不受此次 ColdCard libngu / Yasmarang 问题影响。公开代码没有为 Classic 1S Pure 提供独立的熵生成分支;它与 Classic 1S 共用同一套 firmware-classic1s 体系。因此,Pure 创建钱包时的熵同样来自 THD89 TRNG,并由 MCU 编码为 BIP39 助记词。
已验证流程
THD89 TRNG → 128 / 192 / 256 bit 熵 → MCU 按 BIP39 编码助记词。
Pure 的无电池产品差异不会改变这条公开的创建路径。
随机性说明
- 不应因为 Pure 是单独销售的型号,就假设它有不同的熵生成机制。
- 与 Classic 1S 一样,公开的创建代码调用 THD89 随机数接口,不使用 Yasmarang 或
libngu。
OneKey Classic
OneKey Classic
是否受到影响?
不受此次 ColdCard libngu / Yasmarang 问题影响。在启用安全芯片的 Classic 固件路径中,由 SE 提供用于创建钱包的随机材料,MCU 再将其转换为 BIP39 助记词。
生成流程
SE 提供随机材料 → 取前 32 byte 作为熵 → MCU 按 BIP39 编码助记词。
随机性说明
- 该路径通过 SE 的初始化与导出接口取得随机材料,不调用 Yasmarang 或
libngu的随机数实现,因此不落入此次被讨论的受影响代码路径。 - 公开代码无法单独标明每一批 Classic 所用 SE 的型号及其认证信息。对外介绍时应以对应批次的芯片资料为准,而不是把其他型号的认证信息套用到 Classic。
OneKey Mini
OneKey Mini
是否受到影响?
不受此次 ColdCard libngu / Yasmarang 问题影响。Mini 的设备内创建流程,以 STM32 MCU 的硬件随机数发生器提供熵,MCU 再将其编码为 BIP39 助记词。
生成流程
STM32 MCU TRNG → 128 / 192 / 256 bit 熵 → MCU 按 BIP39 编码助记词。
在 Mini 的旧固件中,random32() 直接读取 STM32 RNG 外设,并拒绝连续重复的输出。设备内直接创建流程正是用这份随机数来生成助记词。
随机性说明
- MCU 直接读取 STM32 硬件 RNG 外设,固件还会拒绝连续重复的输出。这条路径不使用 Yasmarang 或
libngu。
给用户的安全建议
- 无论熵来自何处,助记词一旦泄露,任何人都能恢复钱包;离线、准确地备份助记词,始终是用户自己的责任。
- 助记词一旦丢失,也无法由设备、App 或厂商恢复。






