BIP39 是一种将随机数据转换为恢复词的标准,这组词也称为 Seed Phrase。钱包利用这些词和可选的 passphrase(额外的秘密信息)计算出种子,即生成密钥的起始数据。这能帮助你备份对比特币的控制权,但词语本身不存放比特币或付款记录。
Alice 创建了一个使用 BIP39 的钱包,并按照提示安全地记录了恢复词。后来,她的手机坏了。比特币并没有因此从网络中消失;她失去的是保存付款签名密钥的设备。在可信的替代设备上,她可以使用兼容钱包的恢复功能。相同的词语、相同的顺序,再加上原来使用的同一 passphrase(如果有),会生成相同的种子。后续流程从种子重新生成所需的私钥,钱包再从 Bitcoin 网络中查找付款记录。这不是可以找客服重置密码的账户登录。如果 Alice 使用了 passphrase,就必须同时提供它;旧手机的 PIN 不能代替它。恢复后余额为零,也不一定意味着比特币丢失:除了词语和 passphrase,还需要检查是否选对了账户,以及恢复设置是否正确。因此,在存入较大金额前验证完整恢复流程很有必要。 [1] [5] [13] [14]
与冗长的计算机数据表示相比,词语更容易让人抄写和核对。Marek Palatinus、Pavol Rusnak、Aaron Voisine 和 Sean Bowe 提出了一种方法,把计算机生成的随机数据转成适合手工抄写的形式。该提案日期为 2013 年 9 月 10 日,规范中的状态为 Deployed。备份词应当来自高质量的随机输入,不能根据自己喜欢的一句话凭空编造。那样得到的是依赖可预测的人类秘密的 Brainwallet。Bitcoin 节点不会检查 BIP39:节点验证的是交易和区块,而不是钱包生成密钥的方法。 [1]
一份记录只有能用于恢复钱包才有意义。在存入重要资金之前,先用可信设备验证厂商建议的恢复流程。除了准确的词语顺序,还要保留所需的 passphrase、钱包信息,以及可能用到的派生或签名设置。对于普通的单签钱包,持有完整备份和所需 passphrase 的人,即使没有原设备也可以派生出密钥;对于 Multisig,还必须满足额外密钥和其他规则的要求。照片、云端副本、打印机或剪贴板历史,都可能把秘密暴露给其他人和服务。纸和金属各有不同的物理局限,任何材料本身都无法防止盗窃。 [9] [13] [14]
为了兼容性,BIP39 强烈建议使用英文词表,因为许多钱包不支持其他词表。翻译备份不能保留原钱包,因为参与派生的是短语本身。也要注意其他系统。Electrum 对其原生备份采用自己的版本机制;词语看起来相似,并不意味着它就是 BIP39。SLIP39 是另一种格式,使用自己的 1 024 词词表,并规定恢复需要多少个分片。它不是简单地把 BIP39 备份切成几份。把 24 个词分装进几个信封,并不会得到 Shamir Secret Sharing,反而可能削弱保护和恢复能力。你始终需要知道备份真正采用的格式。 [1] [11] [12]
起点是熵,也就是长度为 ENT = 128、160、192、224 或 256 比特的随机数据。接着加入校验和:取原始数据 SHA-256 结果的前 CS = ENT/32 比特。将整体按每组 11 比特分组,每组确定一个词。因此,MS = (ENT+CS)/11 这个关系恰好得到 12、15、18、21 或 24 个词。12 个词表示 128 比特的随机性和 4 比特的校验信息,并不是全部 132 比特都构成独立的秘密。24 个词对应的是 256+8 比特。备份的可靠性首先取决于随机数生成器,而不是这些词看起来有多奇怪。 [1]
每组 11 比特从一个有序的 2 048 词列表中选出一项。因此,第一个词并不是第一把私钥:所有词共同表示原始数据及其校验和。在英文词表中,前四个字母就足以区分各个词。但这并不是适用于所有语言的通用规则,也不意味着恢复时可以随意缩写备份词。改变顺序、换成近义词或翻译词语,都会改变输入数据。有时会导致校验和无效,有时则会形成另一份有效备份。因此,词语本身及其顺序都必须准确保存。 [1] [2]
计算机必须明确自己实际收到的是哪些字符。BIP39 规定,备份短语和 passphrase 都要先做 Unicode NFKD 规范化,再进行 UTF-8 编码。NFKD 会统一某些不同的字符写法,例如将部分带变音符号的字母分解。因此,两种不同的写法可能在规范化后得到相同结果,但仅仅外观相似并不能保证这一点。词语顺序、空格以及 passphrase 中的字符仍然重要。采用不同的规范化方法,恢复时可能会派生出不同的种子。参考实现和公开测试向量可以帮助检查程序是否遵循了规定流程。 [1] [3] [4]
PBKDF2 函数接收两个彼此分开的输入。password 输入是实际的备份词。另一个输入叫 salt,是参与密码学计算的附加数据。在这里,它由字面字符串“mnemonic”开头,后面不加分隔符,直接拼接 passphrase。这里不会再次放入备份词本身。两个输入都要经过 NFKD 规范化,并编码为 UTF-8。BIP39 规定使用 HMAC-SHA512,迭代 2 048 次,输出长度为 512 比特,即 64 字节。没有 passphrase 时,salt 仍然是“mnemonic”;空的只是 passphrase。这一计算不是在解密备份词,也不会创造新的独立随机性。因此,备份词一旦泄露,单靠迭代次数并不能保护容易猜中的 passphrase。 [1] [10]
BIP39 的工作到生成 64 字节种子为止。接下来的 BIP32 标准通常使用以固定字符串“Bitcoin seed”为密钥的 HMAC-SHA512,从种子派生出主私钥和 32 字节的 chain code。chain code 是一份附加数据,会与密钥一起用于派生后续密钥。这两项数据构成整棵密钥树的起点。BIP44、BIP49、BIP84 和 BIP86 等规则规定了不同的派生路径和脚本类型。因此,恢复时即使输入了正确的词语和 passphrase,如果程序寻找的是另一个账户、另一个分支或另一种地址类型,仍可能显示零余额。gap limit 也很重要,它规定程序查找时允许连续遇到多少个未使用地址。原钱包名称、账户信息、派生路径或 Output Descriptor,可以补充备份词本身不包含的信息。 [5] [6] [7] [8] [9] [14]
Passphrase 是派生种子时额外使用的秘密输入。它不是设备的 PIN,而且 BIP39 无法提示你输入了错误的 passphrase:换成其他值,仍然能计算出结果。输入错误如果改变了规范化后的内容,通常会导向另一个钱包,在那里看不到自己的资金。反过来,不同写法如果经过 NFKD 后结果相同,就会派生出同一个种子。拿到备份词,并掌握足以辨认目标钱包的信息的人,可以离线尝试 passphrase 候选值。如果使用 passphrase,就需要足够的强度、可信的输入方式,以及一份独立可靠的备份。分开存放是为了降低二者同时被盗的风险,而不是让它成为随你离去便永远消失的秘密。 [1] [13]
校验和有助于发现输入错误,但不能证明备份属于谁,也不能证明它是安全生成的。12 个词的校验和为 4 比特,24 个词则为 8 比特。因此,从对应词表中均匀随机选出的词语序列通过检查的概率,分别为 1/16 和 1/256。许多错误能被发现,但并非全部,而且校验和本身不会修正错误。攻击者可以构造另一份校验和有效的备份。规范要求在不匹配时发出警告,并区分词语检查与种子派生本身。因此,遇到无效校验和时,应根据原钱包及其格式处理,不要把真实备份输入网上的检查工具。 [1]
词语、校验和与种子
BIP39 将 128 比特熵与 4 比特校验和组合起来。得到的 132 比特被分为 12 组,每组 11 比特,用来从词表中选择单词。备份词随后作为 PBKDF2-HMAC-SHA512 的 password 输入;salt 则由字面前缀“mnemonic”和可能使用的 passphrase 组成。经过 NFKD 规范化和 UTF-8 编码后,通过 2 048 次迭代派生出 512 比特种子。校验和不会增加随机性。
要获得更完整的理解,请将本词条与以下词条结合阅读: Seed Phrase, HD Wallet, BIP39 passphrase, Trezor, Bitcoin, BIP39 checksum. 反向关联还来自: Seed Phrase, HD Wallet, Cold Storage, BIP (Bitcoin Improvement Proposal).
01BIP 39 是 Bitcoin 共识的一部分吗?+
不是。它是钱包用来表示随机性和派生种子的约定。Bitcoin 节点验证交易和区块时,不需要知道密钥是否通过 BIP 39 生成。
02任何由 12 或 24 个词组成的短语都兼容 BIP 39 吗?+
不是。仅凭词数还不足以判断是否兼容:词表、词序、校验和、NFKD 规范化以及种子派生方式都必须符合要求。恢复原钱包时,还需要正确的 passphrase(如果曾使用),以及相应的派生路径和脚本类型。