跟大家一起学习区块链技术系列之一 比特币之钱包(5)加固密钥
加固密钥
加固扩展密钥解决了普通扩展密钥潜在的问题。如果一个攻击者得到了一个普通的父链码和父公钥,他可以暴力算出由他们得到的所有链码。如果攻击者也得到了子、孙、进一步继承的私钥,他就可以用链码生成由这个私有继承来的所有扩展私钥。如下图所示,
可能更糟,攻击者可以颠倒普通的子私钥的推导公式并通过减去父链码来恢复父私钥,如图中所示的子代和父代情况。这意味着获得扩展公钥和任意从它继承来的私钥的攻击者恢复公钥对应的私钥和从它继承的所有的密钥。
因此,扩展公钥的链码部分要比标准的公钥更安全的保护起来,用户不要在任意可能不安全的环境下导出非扩展私钥。
这个问题可以解决,通过一些平衡,用加固的密钥推导公式来代替普通的密钥推导公式。
普通的密钥推导公式,如上节所描述的,组合索引号、父链码和父公钥一起创建子链码,并且这个整数值和父私钥一起组合创建了子私钥。
加固公式,如上图,组合索引号,父链码,父私钥一起创建用于生成子链码和子私钥的数据。这个公式使得在不知道父私钥的情况下不可能生成子公钥。换句话说,父扩展公钥不能创建加固的子公钥。
因为这样,一个加固的扩展私钥没有普通的扩展私钥有用-然而,加固的扩展私钥却创建了防火墙,使得多层密钥推导泄露不会发生。因为加固子扩展公钥自己不能产生孙链码,父扩展公钥和孙私钥同时泄露,不能推导出重孙扩展私钥。
HD协议使用不同的索引号来表明生成普通还是加固密钥。索引号从0到0x7fffffff将生成普通密钥。索引号从0x80000000到0xffffffff将生成加固密钥。为了简单描述,很多开发者用撇表明加固密钥,所以第一个普通密钥是0,第一个加固密钥是0′ 。
(比特币开发者经常用ASCII码的撇号,而不用unicode的撇号)
这个约定的描述进一步用斜线加m或M的前缀组合表示层级和密钥类型,m代表私钥,M代表公钥。比如,m/0′/0/122′表示主私钥的第一个加固儿子的第一个普通儿子的第123个加固密钥。下面层级图图示了撇号和加固密钥防火墙。
钱包遵从BIP32 HD协议仅仅创建主私钥(m)的加固孩子,防止主密钥泄露后导致子密钥的泄露。因为主密钥没有普通孩子,主公钥在HD钱包是不用的。所有其他的密钥可以有普通孩子,所以用相应的扩展公钥来代替使用。
HD协议也描述了扩展公钥和扩展私钥的序列化格式。细节的话请看BIP32全部的HD协议规范。
相关阅读