术语表 /地址与密钥
强化派生与非强化派生
- 强化派生与非强化派生是什么?
- 强化派生和非强化派生将 BIP-32的子索引一分为二:非强化子密钥可由扩展公钥计算得出,强化子密钥则不能。
规定于 BIP-32。
强化是派生路径中的一道界线,而不是可以开关的设置。BIP-32于2012年2月11日分配编号,当时只有非强化派生;索引大于或等于0x80000000 的私钥派生于2013年4月16日加入,这些密钥于2014年1月15日改称强化密钥。这道界线落在哪里,决定了共享一个扩展公钥会交出您钱包的多大部分。
运作方式
非强化派生有一个强化派生刻意不具备的特性,BIP-32将这一差异记录为一个代数恒等式。设 N() 表示中和,即丢弃扩展密钥的私钥部分、保留32字节链码的步骤。在非强化层级上,N(m/a/b/c) 等于 N(m)/a/b/c,因此先中和再派生与先派生再中和得到同一个密钥。在强化层级上,这种改写不再成立:N(m/a') 无法转化为 N(m)/a',因为公钥派生只对非强化子密钥有定义,对其他任何索引都返回失败。
从机制上看,两种模式只差一个字段。两者都以父密钥的链码作为 HMAC-SHA512 的密钥,并附加4字节的索引。非强化模式提供父密钥的压缩公钥;强化模式提供父密钥的私钥,并在前面补一个零字节,使其达到同样的33字节宽度。只持有 xpub 的一方没有第二种输入,因此派生在界线处停止。
BIP-32对非强化密钥无法保护的内容说得相当直接。其安全性部分将两项特性列为缺失而非具备:已知父扩展公钥和一个子公钥,找出索引并不困难;已知同一个父扩展公钥以及任意一个非强化子私钥,恢复父扩展私钥同样并不困难。前者让您损失隐私,后者让您损失整个分支。
在哪里会遇到它
非强化层级使扩展公钥值得导出,BIP-32专门用一节介绍建立在其上的共享安排。审计人员拿到各账户的扩展公钥后,可以看到每个账户的每一笔收付,却看不到任何一个私钥。两家交易频繁的公司可以共享单个账户的外部链,将其作为固定的收款地址,双方就无需为每笔转账各自索取新地址。网店可以把同类密钥交给其网络服务器,由服务器生成收款地址,却无权花费其中的资金。
将界线设在账户层级的布局只是建议,并非规则。BIP-32称其主密钥、账户、链和子链结构仅供参考,并告知各实现可以为特定需要而偏离,因此一款合规的钱包可以比旁边另一款合规的钱包强化更多层级。
有一个互操作性陷阱值得了解,因为规范为此修补了两次。涵盖带前导零的强化派生的测试向量于2017年2月24日加入,并于2020年11月4日再次加入。强化输入固定为33字节,即一个零字节后接32字节的私钥,因此软件如果裁掉前导零而不是保持该宽度,就会对不同的数据做哈希,生成不同的分支,当有人在另一个程序中恢复该助记词时,就会发现钱包是空的。非强化派生永远不会遇到这个错误,因为压缩公钥总是以0x02 或0x03 开头,没有可丢失的前导零。