比特币钱包:同一助记词配不同口令,为什么每个口令都能开出一个钱包
同一个助记词配不同口令(passphrase),每个口令都能打开一个钱包,但通常只有当初设置的那个口令,才能看到你想要的那份资产。原因不在钱包软件“认错人”,而在 BIP39 的种子生成规则:助记词和口令一起参与运算,口令不同,算出的种子就不同,由种子派生出的钱包也就不同。按 BIP39 原文的说法,这提供的是“合理否认性”(plausible deniability)——每个口令都会生成一个有效种子,因而生成一个确定性钱包,但只有正确的那个口令才会让想要的钱包可用。
具体机制可以拆开看。BIP39 把助记词句子(UTF-8 NFKD)当作 PBKDF2 的密码,把字符串“mnemonic”加上口令(同样是 UTF-8 NFKD)当作盐,迭代 2048 次,用 HMAC-SHA512 作为伪随机函数,导出 512 位(64 字节)的种子。这个种子随后可按 BIP-0032 或类似方法生成确定性钱包。也就是说,口令不是“验证密码”,而是种子推导的输入之一;它不参与“对错判断”,只参与“算出什么”。
这解释了两个常见现象。第一,输错口令不会报错,而是进入另一个结构完全正常的钱包——因为任何口令都能算出合法种子,软件没有理由拒绝。第二,那个“空钱包”并不是故障,只是该口令对应的派生路径下没有资产;你想要的资产在另一个口令对应的种子上。可以假设这样一个案例:某用户用同一组英文单词(示例设为 12 词),先设口令 A 并接收资产,后误用口令 B 恢复,看到的是一个全新钱包;改回 A 后资产重新可见。这里不涉及找回服务或资产追回,只是同一助记词在不同口令下的确定性结果。
适用范围需要交代清楚。上述流程来自 BIP39 规范,原文的测试向量统一使用口令“TREZOR”。规范同时强烈不建议使用非英文词表生成助记词,因为绝大多数 BIP39 钱包只支持英文词表。还有一个限制:种子依赖生成助记词时所用的词表,把助记词翻译成另一种词表会得到完全不同的种子;并且从种子无法反推助记词,转换是单向的。因此,讨论“同一个助记词”时,前提是词表、规范化方式和推导路径保持一致,否则差异不只来自口令。
对普通用户而言,可操作的结论只有一条:口令是种子的一部分,必须与助记词分开、准确地备份;恢复时逐字核对口令,包括大小写、空格和符号。不要把它当成可选的小开关,也不要在没有备份的情况下随意试错。至于“每个口令都能开钱包”本身,是规范设计的结果,不是异常。