常见的 BIP39 流程先把随机数据转换为备份词,也就是 Seed Phrase。备份词与可选的 passphrase(一项额外口令)共同生成 seed:一份秘密数据,BIP32 可以据此派生出钱包的密钥树。因此,随机数据、备份词、seed 和密钥是同一条路径上的不同阶段。其他备份格式可能采用不同流程。
假设你想让钱包备份更容易记住,于是从喜欢的书中挑选一些词。你可能觉得这些词很特别,但攻击者恰恰可以尝试名句和人们常用的选词模式。因此,BIP39 先生成计算机随机数据,再把它们表示为词。熵描述的是这些数据的不可预测性。备份词是秘密数据的可读记录,并不是让你自行编写一句话。 [1]
钱包需要真正取得随机数据,而不只是调用一个名字正确的函数。例如,Linux 提供 getrandom(),默认会等待系统随机源就绪。使用 GRND_NONBLOCK 时,它可能不再等待,而是报告 EAGAIN,表示数据尚不可用。程序必须检查调用结果以及实际获得的字节数;字节是数据的计量单位。如果读取失败后仍假装秘密输入已经生成,钱包可能表面上能用,实际上却不安全。 [2]
浏览器也提供获取安全随机数据的接口。Web Crypto getRandomValues() 将密码学安全的随机字节填入整数数组;请求超过 65536 字节时,会报 QuotaExceededError。但这只是对一个函数的说明,不是对整个网站的安全认证。网页可能取得了良好的随机数据,却在之后泄露备份词。因此,还必须检查加载的代码以及它如何处理结果。 [3]
如果你抄错了一个词,钱包可能通过校验和发现错误。校验和是根据原始数据计算出的简短检查值。BIP39 在 128 位输入后加入 4 位校验数据,形成 12 个词;256 位输入加上 8 位校验数据,形成 24 个词。位是信息的基本单位。这些校验位来自 SHA256 计算的数据指纹,并不是额外的独立熵。所以,校验和有效不能证明备份词保密,也不能证明生成过程安全。 [1]
词便于保存备份,软件则需要把它们转换为严格定义的数据。BIP39 使用派生函数 PBKDF2-HMAC-SHA512,经过 2048 次迭代,得到 512 位的 seed。除了备份词,计算还使用一个叫 salt 的参数:这里是固定文本 mnemonic 后接 passphrase;不使用 passphrase 时,接上的是空字符串。备份词和该参数按 UTF-8 NFKD 处理,以统一字符表示。输出变长不会创造原本缺少的随机性:输出长度并不能证明输入有 512 位熵。 [1]
下一步由 BIP32 定义。它派生出主私钥和 chain code,后者是继续派生其他密钥所需的辅助数据。这样,钱包就能从同一个起点生成新地址。技术上,它以固定文本 Bitcoin seed 作为 HMAC-SHA512 函数的密钥处理 seed,再把结果分开。这个公开文本不是你的秘密。派生出的私钥如果为零或超出允许范围,就无效。因此,seed 并不是换个名字就直接成为私钥。 [4]
开发者需要知道程序是否计算正确。测试向量提供已知输入和预期结果,供程序核对。BIP39 公布了包含熵、备份词和 seed 的测试数据,其中使用测试 passphrase TREZOR。结果一致说明这个输入的转换正确,却不能证明实际随机生成器会产生不可预测的秘密。测试数据是公开的,不能拿来作为真实资金的秘密备份。 [1]
从随机源到备份词,再到备份的保存,中间有多个环节。NIST SP 800-90C 说明了如何把熵源与随机数据生成机制结合起来。评估钱包时,还必须检查具体软件版本、错误处理方式和各环节之间的数据传递。一个经过充分验证的组件,不能保证另一个组件不会丢失或泄露秘密。检查的重点是整个过程,而不是寻找一个听起来可靠的名称。 [5]
要获得更完整的理解,请将本词条与以下词条结合阅读: Random Number Generator, BIP 39, HD Wallet, Seed Phrase. 反向关联还来自: Random Number Generator, CSPRNG, Deterministic RNG, Entropy Mixing.