跳转到主要内容

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 规定了两个过程:

  1. 生成助记词 —— 将随机熵转换为人类可读的单词序列。
  2. 派生种子 —— 将助记词(加上可选口令)转换为 512 位二进制种子,该种子可与 BIP-32 一起用于分层确定性密钥生成。

这两个过程被刻意分离。助记词是面向人的表示;种子是用于密钥派生的密码学输入。

步骤 1:生成熵​

流程从一段密码学安全的随机数据(熵)开始。BIP-39 支持五种熵长度:

熵(位)校验和(位)总计(位)单词数
128413212
160516515
192619818
224723121
256826424

在实践中,几乎所有钱包都使用 128 位(12 词)或 256 位(24 词)。其他长度在规范中有效,但很少实现。

熵源质量至关重要。如果随机数生成器存在偏差、可预测,或熵不足,攻击者就可能猜出生成的种子短语。有关该主题的详细说明,请参阅我们的熵与随机性指南。

熵来源​

  • 硬件随机数生成器(HRNG) —— 由 Ledger 和 Trezor 等硬件钱包使用。它们采样物理现象(热噪声、散粒噪声)来产生真正随机性。
  • 操作系统 CSPRNG —— Linux/macOS 上的 /dev/urandom、Windows 上的 CryptGenRandom,或浏览器中的 crypto.getRandomValues()。这些是密码学安全的伪随机数生成器(CSPRNG),其种子来自硬件熵源。
  • 掷骰子 —— 一些用户使用赌场级骰子手动生成熵,并将结果映射到二进制或词索引。这可以消除对任何软件或硬件 RNG 的信任依赖。

步骤 2:计算校验和​

生成熵后,会追加校验和:

  1. 计算熵字节的 SHA-256 哈希。
  2. 取哈希的前 ENT / 32 位(ENT 为熵长度,单位位)。
  3. 将这些校验和位追加到熵后面。

对于 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)的输入:

  1. 种子通过以 "Bitcoin seed" 为密钥的 HMAC-SHA512。
  2. 左侧 256 位成为主私钥。
  3. 右侧 256 位成为主链码。
  4. 二者共同组成主扩展私钥(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 工具

使用 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词数备注
LedgerYes24硬件,安全元件
TrezorYes12/24也支持 SLIP-39(Shamir)
ColdcardYes24仅 Bitcoin 硬件钱包
MetaMaskYes12浏览器扩展
Trust WalletYes12移动端
ExodusYes12桌面/移动端
ElectrumNo12使用自有方案
BlueWalletYes12/24偏重 Bitcoin 的移动钱包

测试与验证​

官方测试向量​

BIP-39 规范包含测试向量——已知熵值及其对应助记词和派生种子。这些用于验证实现是否正确。

你可以通过以下官方测试向量来验证钱包的 BIP-39 实现:

验证你的种子短语​

要验证你是否正确记录了种子短语:

  1. 在硬件钱包上生成种子短语。
  2. 仔细写下。
  3. 将硬件钱包重置为出厂设置。
  4. 使用你写下的种子短语恢复。
  5. 验证生成的地址是否一致。
  6. 确认钱包可以签名交易。

此过程可同时确认你的备份正确,以及钱包的 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 单词序列都构成有效助记词。

相关指南​