跳转到正文
buybitcoinsmart

术语表 /地址与密钥

强化派生与非强化派生

强化派生与非强化派生是什么?
强化派生和非强化派生将 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 开头,没有可丢失的前导零。

常见问题

别人能否通过我共享的扩展公钥派生出我的强化账户?

不能。公钥派生只对非强化子密钥有定义,对任何大于或等于0x80000000 的索引都返回失败,因此扩展公钥无法跨越强化层级。持有它的人只能看到您所导出层级以下的分支,看不到其上或其旁的任何内容。

既然强化派生更安全,BIP-32为何还要保留非强化派生?

因为非强化派生是扩展公钥唯一能够执行的派生。仅观察钱包、审计人员对所有账户的访问权限,以及在不保管任何机密的网络服务器上生成收款地址,都依赖于它。若将每一层级都强化,扩展公钥就毫无用处。

BIP-32为何为带前导零的强化派生添加测试向量?

因为强化输入固定为33字节,即一个零字节后接32字节的私钥,所以如果某个实现裁掉前导零而不是保持该宽度,就会对不同的数据做哈希,派生出不同的分支。这些测试向量于2017年2月24日加入,并于2020年11月4日再次加入;未通过这些测试的实现,会将助记词恢复到错误的地址。

接着阅读

相关术语

地址与密钥中的更多术语

阅读本页英文版