主页 > imtoken冷钱包官方版 > 文档/比特币钱包密钥管理概述

文档/比特币钱包密钥管理概述

imtoken冷钱包官方版 2023-06-28 05:20:16

比特币钱包密钥管理概述

钱包在整个区块链技术领域相对独立,与其他部分的交互很少; 本文介绍现阶段(2018年5月)钱包密钥管理开发需要满足的功能和事实标准。

1. 必备知识

这部分主要介绍开发钱包前需要知道的几个知识点。

(1). 比特币私钥、公钥和地址的关系

比特币使用椭圆曲线密码学作为公私钥的核心算法(使用的椭圆曲线是Secp256k1)。 私钥本质上是一个很大的随机数,被保密存储并用于签署交易,从而证明 UTXO 的所有权。 公钥是椭圆曲线上一点的坐标。 它是由私钥和它所在的曲线计算得出的。 这种计算是不可逆的,即没有从公钥计算出私钥的计算方法。 通常这里的私钥是32Byte,公钥是33Byte(压缩公钥格式),比特币地址本质上就是公钥的哈希结果; 这里使用的hash是sha256+ripemd160,也就是常说的double hash,或者也叫hash 160,地址通常表示为hash结果的Base58Check编码。

(2). 钱包概览

与生活中的实际认知不同,比特币钱包并不存储数字货币。 钱包的基础是存储私钥,并使用私钥对交易进行签名,用于证明可以花费一定数量的数字货币。

一个完整的交易(转账)过程包括创建交易、签署交易、广播交易,其中创建交易和广播交易不需要访问私钥,创建交易和签署交易不需要访问私钥到网络; 因此,钱包也有硬件钱包、冷钱包、热钱包,硬件钱包将私钥存储在独立的硬件上,存储的私钥无法对外访问,只提供签署交易的接口,所以安全性比较高,硬件需要单独购买; 与硬件钱包相比,私钥存储在无法联网的机器上,离线签署交易; 热钱包签名全程在网络环境下进行,使用更方便;

另一个层面,钱包分为全节点钱包和轻钱包,因为交易最终需要广播比特币扩展公钥,而区块链是分布式和去中心化的,所以钱包广播需要节点参与,而全节点钱包和轻钱包都是wallet 被钱包本身作为一个节点,然后向其他节点广播交易。 它是一个完全去中心化的结构。 全节点和轻节点只是节点类型不同; 钱包连接中心化服务器,作为节点参与广播,钱包只包含创建和签署交易的功能,签名的交易通过其他协议(如HTTPS)传输到中心化服务器。 中央服务器广播交易; 中央服务器还可以提供类似于实时汇率的其他功能; Coinbase、Copay、Blockchain.info等钱包都是这样的CS架构;

还有一种交易所钱包,比如火币钱包。 钱包本身不存储私钥,所有操作都与中心化服务器交互。 至于中心化服务器会不会为每个用户创建一个私钥进行管理,这是一个问题。 黑匣子未知;

2.实施钱包密钥管理的几个标准

现阶段,对于钱包的发展,有几个事实上的标准需要遵守和执行,市场上现有的钱包都执行这些标准

BIP-0032:分层确定性钱包(HD Wallet)规范; BIP-0039:私钥与助记词相互转换规范; BIP-0043:多用途高清钱包规范; BIP-0044:多账户多币种高清钱包规范;

这些规范基本由现有钱包实现,其中BIP-0032、BIP-0038、BIP-0039相互独立,处于不同的钱包实现过程中; BIP-0043是在BIP-0032基础上制定的规范,BIP-0044在BIP-0043的基础上制定了更详细的规范; 与BIP-0044同类型的规格有BIP-0045、BIP-0047、BIP-0049等几种;

3. BIP-0032

比特币建议的相同地址被使用一次。 相对于普通私钥->公钥->地址的关系,钱包需要维护多个地址,所以钱包有两个方向去做,一个是独立存储多个地址对应的多个私钥,这是一个非-确定性钱包; 另一种思路是,一个种子(Seed)可以展开生成多个私钥,每个私钥都有自己对应的公钥、地址,这就是确定性钱包; BIP-0032 制定了具有层次的确定性钱包规范。

使用非确定性钱包有两个缺点。 每个地址对应一个私钥,需要备份的私钥有很多。 如果其中一个私钥丢失,那部分比特币也将丢失; 需要不时进行备份。

HD钱包种子的本质还是一个随机数,或者说是其他规范生成的一个数,最常见的是通过BIP-0039的助记词生成;

首先,种子通过HMAC-SHA512(Key="Bitcoin seed", Data=Seed)哈希函数生成一个64Byte的主密钥(Key为某个字符串“Bitcoin seed”),主密钥分为32Byte两部分,左边作为主私钥,右边作为派生子密钥,称为链码(chain code)。 左边的主私钥可以计算出公钥,从而计算出正常使用的地址; 主键和链码,结合子键索引(索引是一个4Byte的序号),通过HMAC-SHA512推导出子键,主要分为三种:

(1). 父私钥 --> 子私钥

这里依然使用HMAC-SHA512哈希函数,父类的ChainCode作为哈希函数的Key,公钥(33Byte)和父类私钥计算得到的索引作为哈希的Data function,同时hash函数也生成了一个64Byte的child key也被分成了32Byte的两部分。 右边的ChainCode用于从子链衍生出自己的子链; 子私钥是父私钥左边数字相加得到的; 子级私钥有椭圆曲线和是否为零的校验; 如果验证通过,则为合法的子级私钥,如果不合法,则跳过当前索引。

(2). 父公钥 --> 子公钥

这里HMAC-SHA512的计算与(1)相同,只是父公钥直接参与计算,而不是从私钥计算; 同样的哈希函数分为两部分,右边是ChainCode,左边是32Byte通过椭圆曲线计算出公钥,然后将父公钥与椭圆曲线的点坐标相加得到孩子的公钥;

因此,这里使用时,在不安全的环境下,只需要通过父公钥和链码就可以推导出所需的子公钥,全程没有私钥的参与; 这里有一点需要明白,得到的子公钥在使用的时候,需要私钥来解密。 通过(1)中的同一个指标,计算出的子级私钥和这里计算出的子级公钥是公私钥对; 因为这里的椭圆曲线是一个可交换群,满足Commutative law和associative law,椭圆曲线中公钥和私钥的计算是一个乘法(PubKey = PrevKey * P,P是特定椭圆上的常数curve),所以这里满足ParentPrevKey * P + LeftBytes * P = (ParentPrevKey + LeftBytes) * P,其中LeftBytes * P是左边的32Byte通过椭圆曲线计算出来的公钥;

(3). 父私钥 --> 子公钥

父私钥获取子公钥的方式有两种。 一种方式是先通过(1)推导出子私钥计算出子公钥; 另一种方法是先计算父公钥。 然后通过(2)推导出子级公钥;

增强型衍生品

上述父公钥和链码一起称为扩展公钥,可以在不安全的环境下推导出子公钥,但是一旦子私钥泄露,可以从链码中推导出来在扩展公钥中。 所有的子私钥,以及子私钥和父链码都有推断父私钥的风险,所以引入了增强推导的概念。

增强推导只能从父私钥推导子私钥得到子公钥,而不能做上面(2)中的公钥推导。 具体推导过程与(1)中的HMAC-SHA512略有不同,不同于(1)中由父私钥计算出的公钥(33Byte),增强推导使用0x00使得1Byte与私钥和索引作为Data,其他推导步骤相同。 强化派生不会将父链代码暴露在不安全的环境中,因此它比普通派生更安全。

子项的索引号和路径表示

索引的范围是2^32,其中前2^31表示正常推导,通常用索引号表示; 最后的2^31表示增强派生,增强派生序号也是从0开始,序号后面会加一个撇号表示增强派生,比如0x80000000就是第一个增强派生的序号,就是通常表示为0',钱包中存在i'=2^31+i这样的关系。

子键的路径用索引除以/表示; 前缀分为m和M,m表示派生子私钥,M表示派生子公钥。 例如m/5/4'/0表示子私钥m/5/4'的第0个普通派生私钥,m/5/4'是子私钥的第4个加强派生子密钥米/5。 私钥,m/5是主私钥的第五个正常导出的子私钥。

4. BIP-0039

助记词比随机数的表示更容易正确阅读和转录,使用户更容易复制钱包。 助记词主要用于钱包备份和转账的时候。

助记词生成的基本过程是:

生成128bits的随机数,称为熵(以128bits为例); 计算熵校验和:对熵进行SHA256哈希,取出前4位作为校验码; (校验码长度=数据总长度/32); 将原始熵和校验和拼接成132位长度; 132位长度按11位分成12份; 每11位对应长度为2048的词表中的一个词;

这12个词就是熵对应的助记词比特币扩展公钥,可以从这里的词表中获取词表;

其中,熵长不同,对应的助记词个数也不同; 熵长度取值范围如下:

熵长度 校验和长度 助记符长度

128

4个

12

160

5个

15

192

6个

18

224

7

21

256

8个

二十四

从助记词生成种子

此处使用称为 PBKDF2 的算法从助记符生成种子。 PBKDF2函数接收两个参数:生成的助记符字符序列; 第二个参数还有一个用于密码加密的salt,salt(盐)参数是一个字符字符串“mnemonic”和用户可选的密码组合而成。 如果没有可选密码,salt 参数为“mnemonic”。

PBKDF2使用HMAC-SHA512函数实现,循环2048次,最后返回一个长度为512位的种子; 这里生成的种子可以作为上述BIP-0032的种子。

BIP-0043

由于BIP-0032层级可以无限扩展,并且每一层级可以有很多子密钥,定义过于松散,不同的钱包可能会定义自己的生成路径规则,所以BIP-0043定义了层级钱包的使用规范等级。

BIP-0043规定m/purpose'/一级路径为目的,即定义路径遵循的规范,防止使用不同规范的路径发生冲突; 例如,0'是BIP-32的默认钱包,44'是BIP-0044规范定义的合规性A前缀; 本规范使用强化推导。

BIP-0044

BIP-0044在BIP-0043的基础上更详细地定义了一个路径规范:m/purpose'/coin_type'/account'/change/address_index,这里purpose仍然沿用BIP-0043的规范,在BIP-0044中是固定值为 44'; coin_type定义了可以支持的数字货币种类,已经注册了Bitcoin(0')和Bitcoin Testnet(1'),为实现多币种钱包提供了支持; account定义Multi-account支持,从0依次开始,purpose,coin_type,account都是增强型衍生品; change定义了外部地址(0)和找零地址(1),外部地址一般用于接收转账等,找零地址是字面意思,是用来接收找零进行转账的; address_index 是从0开始的地址序号。

BIP-0045定义了另一种形式的路径规范,有兴趣的可以了解一下;

隔离见证(Segwit)

对于当前的钱包,BIP-0141 的隔离见证已部分实现。 简单来说,比特币扩容与 1M 的区块大小限制相矛盾。 修改区块大小有两种方式(BCH方案)和隔离见证。 隔离见证是从区块中取出脚本签名(scriptSig)的结构。 如果单独存储,则计算区块大小时不计算这部分,这样一个区块可以容纳更多的交易; 这部分脚本签名仍在区块链中,与交易一起进行验证。

支持隔离见证的钱包现在有共付额。

结论

除了上述的公私钥管理外,钱包一般还需要创建交易并对创建的交易进行签名,并将交易发送到区块链上供矿工确认。 交易创建和签署是一个独立完整的内容,这里不再展开。

比特币钱包中的密钥管理相对简单,与整体结构相对独立。 钱包客户端是连接用户和区块链的桥梁,所以实现钱包密钥管理的统一规范还是很重要的。