《精通比特币》里提到从xpub衍生一个分支公钥的能力是很重要的,但牵扯一些潜在风险。访问xpub并不能访问子私钥。但是,因为xpub包含有链码,如果子私钥被知道或者被泄漏的话,链码就可以被用来衍生所有的其他子私钥。泄露的私钥如果再加上父链码,就可能暴露所有子项的所有私钥。更糟糕的是,子私钥与父链码可以用来推断父私钥。
为了应对这种风险,HD钱包使用一种替代衍生函数,叫做强化衍生(hardened derivation),“打破”了父公钥以及子链码之间的关系。这个强化衍生函数使用了父私钥去推导子链码,而不是父公钥。这就在父/子顺序中创造了一道“防火墙”,链码就不能危害父私钥或者同级私钥。
当使用强化私钥衍生函数时,得到的子私钥以及链码与使用一般衍生函数所得到的结果完全不同。得到的密钥“分支”可以被用来生产不易被攻击的扩展公钥,因为它所含的链码不能被用来泄露任何私钥。强化衍生也因此被用在使用扩展公钥的密钥树的上一层创造“隔层”。
简单来说,如果想利用xpub的便捷来衍生公钥的分支,又不想冒泄露链码的风险, 就该从强化父密钥,而不是一般父密钥衍生。最好的方式是,为了避免主密钥泄露,主密钥所衍生的第一层级的子密钥总是通过强化衍生得来。
看到这时估计也有人疑惑,为何公钥衍生的子私钥被知道或者被泄漏的话,链码就可以被用来衍生所有的其他子私钥,而强化衍生密钥不易泄露。
下面解释了为什么强化衍生密钥可以在泄露某一个私钥和扩展公钥的时候,不会把该私钥的父私钥给泄露出去。
扩展密钥同时包含了链码和密钥信息,这对于继续派生子密钥很方便, 但同时也带来了安全上的隐患。下图中展示了第N层链码和公钥及其某个 后代私钥泄漏的情况下,受影响的公钥和私钥:
解决的办法是改变密钥派生的算法,使用父私钥而不是父公钥来生成子链码 及子密钥,这样得到的子密钥被称为强化密钥(hardened key):
比特币根据子密钥序号来区分派生普通密钥还是强化密钥:当序号 小于0x80000000时,生成普通子密钥,否则生成强化子密钥。
网友评论