我最近一直在研究应用程序来学习交易和签名工具。第一步是导入高清。本以为古圣经《掌握比特币》中出现的这个概念大家都已经知道了,但经过实际研究,发现中文技术社区的大部分文章都是BIP32的直接翻译,或者是简单的接口使用讨论,更深入的问题,例如:“为什么强化的派生密钥是安全的?”没有讨论。本文记录了我的关注和理解,为想进一步了解HD原理的朋友提供一些参考。
2.高清的由来
HD 是分层确定性 ( ) 钱包的缩写。在HD出现之前,比特币钱包通过随机数生成多个不相关的私钥。这种类型的钱包称为非确定性钱包(或随机钱包)。
在中本聪的 UTXO 模型中,默认情况下客户端只能使用每个比特币地址一笔交易。因此,钱包在使用过程中,需要反复备份、导入,然后使用密钥来签署交易,非常不方便。
为了解决非确定性钱包的私钥管理问题,社区成员提出了一种利用“种子”利用哈希函数单向生成一组私钥的方法。在此思想的基础上,增加了密钥导出(BIP32)、助记词(BIP39)、导出路径规范(BIP43/44)等功能,形成了现在统一标准化的HD。
3. BIP32 和它的朋友
BIP32是分层确定性钱包的核心改进,提出了一套基于严格密码学算法的先进钱包管理方法。在BIP32首次提出的时代,确定性钱包主要有两种:普通钱包和BIP32钱包;这两个钱包的算法和设计相似,但最终BIP32钱包成为了后来的标准。
BIP39 是比特币 HD 规范中最用户友好的。任何使用过数字钱包的人都会对它印象深刻。您还记得手写的私钥吗?它从一组易于记住的单词(助记符)生成确定性钱包的种子密钥。
BIP43和BIP44统一了钱包软件对分层路径和数字数字的理解和使用,允许用户使用相同的助记词在同一个区块链中确定性地生成相同的一组密钥。
BIP39、BIP43、BIP44都是兼容BIP32的协议,后来被比特币以外的区块链采用,形成了区块链行业的共识。本文重点介绍密钥推导BIP32的细节,其他改进协议不再一一介绍。
4.BIP32相关问题
第一次阅读《掌握比特币》时,大多数人可能对密码学还知之甚少。对于超出理解范围的知识,他们可能会选择跳过或抓住结论而忽略过程。这样我们就得到了对HD的第一个层次的理解:
HD钱包是通过哈希算法逐层推导私钥,获得用一个种子(或助记词)管理无数密钥的方法。
当我再次阅读本章时,我注意到了“扩展密钥”这个特殊术语,并来到了对HD的第二个层次的理解:
HD钱包的设计是实现父私钥导出子私钥,父公钥导出子公钥,子私钥和子公钥是一对“密钥”。
忍不住想问一下:
“父私钥”生成“子私钥”,“父公钥”生成“子公钥”。这是使用某种神奇的算法实现的吗?或者某种协议?还是整个系统只使用一把“真实私钥”,而“子私钥”和“扩展密钥”只是定义的抽象概念?
5. 确定性钱包的特点
我们说确定性钱包有两个直观的特征:
可以通过父密钥获取子密钥(包括:父私钥获取子私钥、父公钥获取子公钥),但反之则不然;
主公钥可以公开,不用担心资金损失。
宣传此功能的主要场景是在层级组织中,例如公司向部门提供子私钥、向会计师和审计员提供子公钥、向财务主管提供根私钥。这种算法带来的近乎神奇的功能,让很多人(包括懂技术的人)对高清的功能神化了。但这种对分层钱包的描述有一个致命的缺陷。
这个缺陷也是我对HD的第三个层次的理解:虽然可以安全地分发子私钥而不会给父私钥带来风险,也可以分发主公钥而不会给主私钥带来风险,但它不能这样做两者同时进行。操作。风险隐藏在分层确定性钱包的算法中。在介绍这个缺陷之前,我们先来研究一下BIP32以及密钥导出函数。
6.BIP32规范
为了更准确地介绍BIP32的定义和内涵,我建议有计算机专业背景的读者直接阅读BIP32规范。
BIP32规范使用了很多密码学公式来定义HD如何推导密钥,这对于非计算机专业的学生来说不太友好。这里我们抛开密码学严格的定义和推导,用大白话来描述BIP32规范。
BIP32主要引入了三个概念:密钥导出函数、密钥树和主密钥生成。
6.1 密钥导出函数(Child Key)
密钥导出函数是专门设计的函数。核心部分是使用消息认证码HMAC-(本质上是先对数据进行哈希处理,然后进行对称加密)。 HMAC-有一个特点,当输入Data和Key已知时,就可以得到输出I;仅知道输出 I 和输入 Key 并不能推导出数据。
I = HMAC-(密钥,数据)
父层I决定将前32位和后32位分别作为扩展私钥和加密密钥。密钥是加密密钥。将扩展私钥(或扩展公钥)与数字i简单拼接得到数据。 。
然后通过严格的算法证明,我们得出前面提到的结论:父私钥衍生子私钥,父公钥衍生子公钥,子私钥和子公钥是一对密钥。 (参考下面的原图)
此外,与一般的密钥导出函数不同,另一个函数是人为设计的,用于“强化”密钥导出。这里,使用数字i的第一位(共32位)作为标识符。当第一位为0时,即数字i < 2^31时,使用通用密钥推导函数。第一位为1,即当i >= 2^31时,使用“硬化”密钥导出函数。对于“硬化”的密钥推导功能,无论是获取子私钥还是子公钥,都需要使用父私钥进行推导计算,因此失去了一般密钥推导中公钥的特征功能是公钥可以直接推导出公钥。它变得不那么灵活了,但同时也变得更加安全和“硬化”。硬键的使用场景稍后介绍。
6.2.关键树
由于密钥派生关系可以进行多级迭代,因此可以用一个密钥派生出它的多级,从而构建树形的密钥层次结构。如果是正常的密钥派生关系,派生子公钥的公钥的特征也可以逐层传递。当某个级别的密钥派生关系被“硬化”时,这种传输关系就终止。可以表示为:
N(m/a/b/c) = N(m/a/b)/c = N(m/a)/b/c = N(m)/a/b/c = M/a/b/ c.
N(m/aH/b/c) = N(m/aH/b)/c = N(m/aH)/b/c。
_H 代表硬密钥派生_
6.3.主密钥生成
前面提到了密钥推导函数和多级推导关系。 BIP32还初步讨论了生成种子密钥和主密钥的方法。如上图所示,种子可以是任意长度的值。经过HMAC计算后,得到主密钥。
BIP32 建议使用 PNG 文件来处理种子数据的随机性。 BIP32、BIP39、BIP43、BIP44的各位朋友进一步标准化了主密钥生成。
7.BIP32安全讨论
BIP32 的安全问题是撰写本文的动机之一。 BIP32 中的一个已知漏洞是,当父公钥和子私钥同时分发时,父私钥将面临风险。 2013年我就已经在博客中指出了这个风险,并用代码进行了演示。他分别对钱包和BIP32钱包进行了测试,结果表明,通过知道父公钥和子私钥,不仅可以获得其他子私钥的对等点对,而且还可以破解父私钥。
> wp = (w)
> w0 = (w,0)
> (wp,w0)
”
因此,在密钥的分级管理中,当有可能同时泄露父公钥和子私钥时,不宜采用通用的密钥派生方法,而可采用“硬化”的密钥派生方法。
为了防止这个漏洞,公司或组织在使用BIP32的分层钱包时需要特别注意。对于普通用户来说,无需过多担心高清的安全性。由于相关约定规范了钱包衍生过程并考虑了加固环节,同时个人使用场景一般不涉及子密钥分发问题,因此HD钱包仍然是密钥管理的首选安全选择。
八、总结
HD是当今主流数字钱包的首选。作为用户,您可以在不同的钱包应用中轻松管理自己的密钥;作为开发者,它提供了一套现成的、多语言的开发工具,降低了钱包软件的开发成本。作为一名产品经理,想要深入研究钱包的原理,利用分层钱包的特性设计一些创新场景,在设计时需要注意安全考虑,避免大规模使用后密钥泄露。
9. 参考文献
掌握比特币
BIP32.en..it/wiki/
关键…/2014/848.pdf
HD钱包详解:第二部分——BIP32注释.//6.htm
..,他们和他们的//---缺陷-
千里大堤被蚁巢毁掉(高清慎用)//36233