BIP-39 标准详解:助记词种子短语如何工作
BIP-39(Bitcoin Improvement Proposal 39)定义了生成助记句的标准——也就是常见的 12 或 24 个单词序列——这些单词编码了用于派生加密货币钱包密钥的熵。BIP-39 于 2013 年由 Marek Palatinus、Pavol Rusnak、Aaron Voisine 和 Sean Bowe 发布,现已成为几乎所有主流加密货币钱包备份的主导标准。
从技术层面理解 BIP-39,可以让你更有把握地确认种子短语备份的可靠性,并帮助你评估不同钱包实现的安全属性。
BIP-39 概览
BIP-39 规定了两个过程:
- 生成助记词 —— 将随机熵转换为人类可读的单词序列。
- 派生种子 —— 将助记词(加上可选口令)转换为 512 位二进制种子,该种子可与 BIP-32 一起用于分层确定性密钥生成。
这两个过程被刻意分离。助记词是面向人的表示;种子是用于密钥派生的密码学输入。
步骤 1:生成熵
流程从一段密码学安全的随机数据(熵)开始。BIP-39 支持五种熵长度:
| 熵(位) | 校验和(位) | 总计(位) | 单词数 |
|---|---|---|---|
| 128 | 4 | 132 | 12 |
| 160 | 5 | 165 | 15 |
| 192 | 6 | 198 | 18 |
| 224 | 7 | 231 | 21 |
| 256 | 8 | 264 | 24 |
在实践中,几乎所有钱包都使用 128 位(12 词)或 256 位(24 词)。其他长度在规范中有效,但很少实现。
熵源质量至关重要。如果随机数生成器存在偏差、可预测,或熵不足,攻击者就可能猜出生成的种子短语。有关该主题的详细说明,请参阅我们的熵与随机性指南。
熵来源
- 硬件随机数生成器(HRNG) —— 由 Ledger 和 Trezor 等硬件钱包使用。它们采样物理现象(热噪声、散粒噪声)来产生真正随机性。
- 操作系统 CSPRNG —— Linux/macOS 上的
/dev/urandom、Windows 上的CryptGenRandom,或浏览器中的crypto.getRandomValues()。这些是密码学安全的伪随机数生成器(CSPRNG),其种子来自硬件熵源。 - 掷骰子 —— 一些用户使用赌场级骰子手动生成熵,并将结果映射到二进制或词索引。这可以消除对任何软件或硬件 RNG 的信任依赖。
步骤 2:计算校验和
生成熵后,会追加校验和:
- 计算熵字节的 SHA-256 哈希。
- 取哈希的前
ENT / 32位(ENT 为熵长度,单位位)。 - 将这些校验和位追加到熵后面。
对于 256 位熵,这会产生 8 位校验和,总计 264 位。
校验和用作错误检测机制:当你在钱包中输入种子短语进行恢复时,钱包会重新计算校验和。如果任一单词错误或顺序错误,校验和会失败,钱包将拒绝该助记词。它能防止抄写错误,但不能纠错——只能检测到有问题。
校验和的含义
由于助记词最后一个单词编码了校验和位,因此对于给定序列,并非所有单词都能作为最后一词。对于 24 词助记词,最后一个单词编码 3 位熵和 8 位校验和,因此在给定前 23 个单词时,2,048 个候选词中只有 8 个有效。这就是为什么你不能随意选择最后一个单词。
步骤 3:映射为单词
将合并后的熵 + 校验和位按每组 11 位拆分。每个 11 位组表示从 0 到 2,047 的索引,对应 BIP-39 词表中的一个单词。
264 bits / 11 bits per word = 24 words
132 bits / 11 bits per word = 12 words
英文词表
BIP-39 英文词表恰好包含 2,048 个单词。该词表经过精心筛选,具备以下特性:
- 前四字母唯一前缀 —— 任意两个单词的前四个字符都不相同。这意味着
abandon可以被无歧义地识别为aban,适合紧凑型金属备份。 - 常用词汇 —— 单词简单、常见、广为人知。不含术语、专有名词或生僻词。
- 避免相似词 —— 尽量排除容易混淆的单词(如 "woman" 和 "women")。
- 字符长度 —— 所有单词长度都在 3 到 8 个字符之间。
其他语言词表
BIP-39 定义了九种语言词表:
| 语言 | 状态 | 备注 |
|---|---|---|
| 英语 | 参考标准 | 支持最广 |
| 日语 | 已标准化 | 使用片假名;空格为表意空格(U+3000) |
| 韩语 | 已标准化 | |
| 西班牙语 | 已标准化 | |
| 中文(简体) | 已标准化 | |
| 中文(繁体) | 已标准化 | |
| 法语 | 已标准化 | |
| 意大利语 | 已标准化 | |
| 捷克语 | 已标准化 | |
| 葡萄牙语 | 已标准化 |
重要兼容性说明: 使用某一词表生成的助记词,不能用另一种语言词表恢复。不同语言之间词索引不同。创建备份时务必记录所使用的语言。
步骤 4:种子派生(PBKDF2)
助记句不会直接作为密码学密钥使用。它会先经过 PBKDF2-HMAC-SHA512 的密钥拉伸:
PBKDF2(
password = mnemonic sentence (words joined by spaces, normalized to UTF-8 NFKD),
salt = "mnemonic" + optional_passphrase,
iterations = 2048,
key_length = 512 bits
)
这会生成一个 512 位种子,作为 BIP-32 分层确定性密钥派生的输入。
BIP-39 中 PBKDF2 的关键属性
密钥拉伸 —— PBKDF2 的 2,048 次迭代会增加暴力破解的计算成本。虽然按现代密码哈希标准看 2,048 次并不高,但主要安全性来自助记词本身的熵(128 或 256 位),而不是拉伸因子。
支持口令 —— 盐值包含可选口令(即“第 25 个单词”)。如果不提供口令,盐值就是字符串 "mnemonic";如果提供口令,盐值变为 "mnemonic" + passphrase。这意味着同一助记词配合不同口令会生成完全不同的种子——进而得到完全不同的一组密钥和地址。
口令无校验 —— 与助记词校验和不同,口令没有校验和。任意口令都有效。输入错误口令不会报错;它会静默生成另一个(空)钱包。这是可否认性特性的一部分,但对忘记口令的用户来说也有风险。
Unicode 归一化 —— 在传入 PBKDF2 之前,助记词和口令都会按 UTF-8 NFKD(兼容分解规范化)归一化。这可确保不同实现之间的种子派生一致,不受操作系统内部字符表示差异影响。
步骤 5:从种子到密钥(BIP-32)
PBKDF2 生成的 512 位种子会作为 BIP-32(Hierarchical Deterministic Wallets)的输入:
- 种子通过以
"Bitcoin seed"为密钥的 HMAC-SHA512。 - 左侧 256 位成为主私钥。
- 右侧 256 位成为主链码。
- 二者共同组成主扩展私钥(xprv)。
之后,BIP-44 派生路径定义了派生特定币种密钥和地址的标准化树结构。
示例演算
下面通过一个简化示例演示 BIP-39,使用 128 位熵(12 词助记词):
1. 生成 128 位熵
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
(这是全零熵,仅用于演示。实际中绝不要使用。)
2. 计算 SHA-256 哈希
SHA256(0x00000000000000000000000000000000) = 374708fff7719dd5979ec875d56cd2286f6d3cf7ec317a3b25632aab28ec37bb
3. 取哈希前 4 位作为校验和
首字节:0x37 = 00110111。前 4 位:0011。
4. 将校验和追加到熵后
128 位全零 + 0011 = 共 132 位。
5. 按 11 位分组
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000000 → 0 → "abandon"
00000000011 → 3 → "about"
结果:abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about
这是全零熵的知名测试向量。最后一个单词是 "about"(而不是 "abandon"),原因是校验和位。
6. 使用 PBKDF2 派生种子
PBKDF2("abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", "mnemonic", 2048, 64)
这会生成用于 BIP-32 派生的 512 位种子。
使用 SafeSeed Seed Phrase Generator 直观看到 BIP-39 的工作过程。你可以生成种子短语,并实时查看熵、校验和与单词映射。为获得最高安全性,请离线运行该工具。
BIP-39 的安全性分析
熵安全性
对于 24 词助记词(256 位熵):
- 搜索空间为 2^256,约 1.16 x 10^77 种可能。
- 即使每秒尝试一万亿(10^12)次,穷举搜索也需要约 3.67 x 10^57 年,远长于宇宙年龄(1.38 x 10^10 年)。
对于 12 词助记词(128 位熵):
- 搜索空间为 2^128,约 3.4 x 10^38 种可能。
- 按每秒一万亿次尝试,穷举搜索约需 10^19 年。
在经典计算条件下,这两者都不可行。
PBKDF2 注意事项
2,048 次迭代的 PBKDF2 会给暴力破解增加一个常数因子,但不是主要安全屏障。一些安全研究者指出,与 Argon2 或 bcrypt 等现代密钥派生函数相比,2,048 次偏低。不过由于助记词熵(128 或 256 位)才是主导因素,因此在实践中这只是次要问题。
校验和局限性
校验和能捕获大多数抄写错误,但:
- 它只能检测,不能纠错。
- 对 12 词助记词而言,只有 4 位校验和,意味着随机修改中约有 1/16 会通过校验和。
- 校验和不能防止恰好仍满足校验和的词序重排。
口令风险
口令功能很强大,但也引入风险:
- 如果你忘记口令,资金将无法恢复(没有“重置”机制)。
- 口令不做有效性校验——任意字符串都会生成有效钱包。
- 攻击者若获得助记词但未获得口令,必须暴力破解口令;额外安全性取决于口令本身的熵。
对 BIP-39 的批评
在 Bitcoin 开发社区内部,BIP-39 也并非没有争议。
无版本机制
BIP-39 不包含版本字节,意味着派生流程被永久固定。如果未来改进需要不同的密钥派生函数或参数,无法在助记词格式内发出版本信号。这也是一些钱包(尤其 Electrum)采用自有带版本助记方案的原因。
与词表强耦合
助记词依赖于精确词表。如果词表未来被修改,现有助记词将无法恢复。虽然词表自标准化后已冻结,但这种不灵活性被一些人视为设计限制。
密钥拉伸偏弱
如前所述,PBKDF2 的 2,048 次迭代按现代标准较弱。尽管这对高熵助记词的安全性影响不大,但对较短或用户自定义口令的保护较弱。
Electrum 的替代方案
Electrum 钱包使用自有助记方案,包含版本机制且不依赖固定词表。Electrum 助记词与 BIP-39 不兼容。这意味着 Electrum 种子短语不能在 BIP-39 钱包中恢复,反之亦然。务必确认你的钱包使用的是哪种标准。
BIP-39 实现情况
几乎所有主流钱包都实现了 BIP-39:
| 钱包 | BIP-39 | 词数 | 备注 |
|---|---|---|---|
| Ledger | Yes | 24 | 硬件,安全元件 |
| Trezor | Yes | 12/24 | 也支持 SLIP-39(Shamir) |
| Coldcard | Yes | 24 | 仅 Bitcoin 硬件钱包 |
| MetaMask | Yes | 12 | 浏览器扩展 |
| Trust Wallet | Yes | 12 | 移动端 |
| Exodus | Yes | 12 | 桌面/移动端 |
| Electrum | No | 12 | 使用自有方案 |
| BlueWallet | Yes | 12/24 | 偏重 Bitcoin 的移动钱包 |
测试与验证
官方测试向量
BIP-39 规范包含测试向量——已知熵值及其对应助记词和派生种子。这些用于验证实现是否正确。
你可以通过以下官方测试向量来验证钱包的 BIP-39 实现:
验证你的种子短语
要验证你是否正确记录了种子短语:
- 在硬件钱包上生成种子短语。
- 仔细写下。
- 将硬件钱包重置为出厂设置。
- 使用你写下的种子短语恢复。
- 验证生成的地址是否一致。
- 确认钱包可以签名交易。
此过程可同时确认你的备份正确,以及钱包的 BIP-39 实现符合预期。
常见问题(FAQ)
BIP-39 代表什么?
BIP 是 Bitcoin Improvement Proposal 的缩写。BIP-39 是第 39 号提案,定义了如何创建密码学熵的助记词(人类可读)表示标准。它于 2013 年提出,现已被几乎所有主流加密货币钱包采用。
所有 12 词种子短语都是 BIP-39 吗?
不是。一些钱包(尤其 Electrum)使用与 BIP-39 不同的自有助记方案。虽然两者都从词表生成 12 词短语,但编码、词表和派生流程不同。BIP-39 短语不能用于 Electrum 方案,反之亦然。请始终查阅钱包文档。
我可以通过自己选词来创建 BIP-39 种子短语吗?
不建议。虽然技术上可以先选 23 个词再计算合法的第 24 个词(满足校验和),但人工选词无法提供足够熵。BIP-39 的安全性依赖于单词来自高质量随机数据,而不是人为选择。应让 CSPRNG 生成熵。
为什么 PBKDF2 的盐值使用单词 "mnemonic"?
字符串 "mnemonic" 是 BIP-39 规定的固定盐值。使用口令时,会将口令追加到该盐值后(例如 "mnemonicMyPassphrase")。使用固定已知盐值可确保所有实现之间的种子派生一致,且无需助记词和可选口令之外的额外信息。
BIP-39 只用于 Bitcoin 吗?
不是。BIP-39 被几乎所有主流加密货币使用,包括 Ethereum、Litecoin、Cardano、Solana 等。助记词生成与种子派生过程是相同的;只有后续密钥派生路径(由 BIP-44 币种类型定义)在不同链之间不同。
BIP-39 和 SLIP-39 有什么区别?
BIP-39 生成一个表示完整秘密的单一助记词。SLIP-39(Satoshi Labs Improvement Proposal 39)实现了 Shamir 秘密共享,将秘密拆分为多个分片(如 3-of-5)。达到阈值数量的分片可重建秘密,而不足阈值不会泄露信息。SLIP-39 使用与 BIP-39 不同的词表和编码。
有多少个有效的 BIP-39 助记词?
对于 24 词助记词:2^256(约 1.16 x 10^77)。对于 12 词助记词:2^128(约 3.4 x 10^38)。这些数字表示熵空间。校验和会约束词组合,但不会降低熵——它仅表示并非任意 24 个 BIP-39 单词序列都构成有效助记词。