本文三章节分别讲述 分层确定密钥 的起源、基本原理、程序实现。前两节面向所有人科普,第三节需要阅读者掌握 Go 编程语言。阅读全文预计需要 3-5 分钟,感谢 Tinvee 帮助审阅。

  分层确定密钥(Hierarchical Deterministic keys) 是一种应用在比特币系统中的密钥管理技术,源自于 BIP32 分层确定性钱包。使用分层确定密钥可以帮助用户更加方便的备份、找回自己的密钥串。

0x1 分层确定性密钥——应运而生

  比特币钱包中保存的是一系列的 <地址, 私钥> 对;地址通过 Base58(Hash(公钥)) 算法计算得出;私钥是一个随机数,是用于控制地址上存储的比特币的唯一凭证。所以,安全便捷的管理、备份私钥尤其重要。   但是,早期的比特币钱包被称为不确定性钱包,备份私钥并不方便。其中的私钥都是随机生成的,私钥之间没有任何关联。BIP32 的贡献开发者 Eric Lombrozo 指出 Bitcoin Core 初始钱包的密钥管理非常复杂:

当新地址生成的时候,你必须不断备份钱包,以此来保证安全,这种方式非常烦人。

  如果个用户使用的是不确定性钱包,并且没有及时备份私钥,一旦私钥遗失,那他就永远失去了对应的比特币。人们迫切需要一种安全并更便捷的方案来备份自己的私钥,BIP32 协议应运而生,其核心技术便是分层确定密钥

0x2 「道生一,一生二,二生三,三生万物」

  分层确定密钥 首先需要生成一个随机数当做种子(Seed),用于创建 确定性密钥链。然后由种子通过 单项离散方程(哈希) 算法得出 主密钥,主密钥再使用自身和子密钥索引(子密钥序号)生成 子密钥, 继而由 子密钥 生成 孙密钥,逐层生子成密钥,无穷无尽的密钥呈现出树形结构。 种子生成密钥

0x3 术

  讲完基本原理,接下来我们使用 Go 语言的 bitgoin/address 包来实现确定分层密钥

  首先,生成随机数作为种子: img   接着,使用种子生成主密钥: img   然后,逐层生成子密钥(示例只生成一层): img   完整示例源代码如下: img   示例运行结果如下: img