比特币源码学习-钱包标准(二)-BIP39

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37847176/article/details/82177627

在钱包标准(一)中介绍了基于BIP32的HD(分层确定性)钱包,我们知道HD 钱包具有管理多个密钥和地址的强大机制。由一系列英文单词生成种子是个标 准化的方法,这样易于在钱包中转移、导出和导入,如果 HD 钱包与这种方法相 结合,将会更加有用。 这些英文单词被称为助记词,标准由 BIP-39 定义。
示例:
16 进制表示的种子: 0C1E24E5917779D297E14D45F14E1A1A
助记词表示的种子:army van defense carry jealous true garbage claim echo media make crunch
参考:
BIP39文档https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki
《精通比特币(第二版)》5.2钱包技术细节



BIP39

BIP 全名是 Bitcoin Improvement Proposals,是提出 Bitcoin 的新功能或改进措施的文件。可由任何人提出,经过审核后公布在 bitcoin/bips 上。BIP 和 Bitcoin 的关系,就像是 RFC 之于 Internet。

摘要

这个BIP描述了助记符代码或助记符句子的实现 – 一组容易记忆的单词 –用于生成确定性钱包。
它由两部分组成:生成助记符,并将其转换为二进制种子。 该种子可以稍后用于使用BIP-0032或类似方法生成确定性钱包。


动机

与钱包种子的原始二进制或十六进制表示相比,助记符代码或句子让使用者更加容易交互。 助记码可以写在纸上或通过电话传达。
本指南旨在通过人类可读转录传输为计算机生成的随机性。 这不是将用户创建的句子(也称为脑钱包)处理成钱包种子的方法。

提示:助记词经常与“脑钱包”混淆。 他们不一样。主要区别在于脑钱包由用户选择 的单词组成,而助记符是由钱包随机创建的,并呈现给用户。 这个重要的区别使 助记词更加安全,因为人类猜测随机数还是无能为力


创建助记词

助记词必须以32位的倍数编码熵,安全性会随熵的增加而提升但句子长度也增加了。把初始的熵长度称为ENT,允许的ENT大小位128-256位。
钱包从熵源开始,增加校验和,然后将熵映射到单词列表。分为6个步骤
1. 创建一个 128 到 256 位的随机序列(熵)。
2. 提出 SHA256 哈希前几位(ENT/ 32),就可以创造一个随机序列的校验和。
3. 将校验和添加到随机序列的末尾。
4. 将序列划分为包含 11 位的不同部分。
5. 将每个包含 11 位部分的值与一个已经预先定义 2048 个单词的字典做对应。
6. 生成的有顺序的单词组就是助记码。
下表描述了初始熵长度(ENT),校验和长度(CS)和单词中生成的助记句(MS)的长度之间的关系。
CS = ENT / 32
MS = (ENT + CS) / 11

ENT CS ENT+CS MS
128 4 132 12
160 5 165 15
192 6 198 18
224 7 231 21
256 8 264 24

可以从图片来看128位的熵生成12个助记词

这里写图片描述


单词表

一个理想的单词表应该具有一下特点:
a)敏捷的单词选择
单词列表的创建方式使得输入前四个字母足以明确地识别单词
b)避免相似的词
类似 “build” 和”built”, “woman” 和 “women”, or “quick” 和”quickly”的单词不仅难以记忆句子,也容易出错
c)有序的单词表
对单词列表进行排序,以便更有效地查找代码字(即实现可以使用二进制搜索而不是线性搜索) - 这也允许使用trie(前缀树),例如用于更好的压缩
单词表可以包含本机字符,但必须使用规范化表单兼容性分解(NFKD)以UTF-8编码。


从助记码到种子

用户可以决定用密码来保护他们的助记符。如果不存在密码短语,则使用空字符串“”。
为了从助记词创建二进制种子,我们使用PBKDF2函数,其中使用用作密码的助记符句子(UTF-8 NFKD)和用作盐的字符串“助记符”+密码可选(再次用UTF-8 NFKD)。迭代计数设置为2048,HMAC-SHA512用作伪随机函数。派生密钥的长度为512位(= 64字节)。可以分为三步来看
7. PBKDF2 密钥延伸函数的第一个参数是从步骤 6 生成的助记符。
8. PBKDF2 密钥延伸函数的第二个参数是盐。 由字符串常数“助记词”与可选的用户提供的密码字符串连接组成。
9. PBKDF2 使用 HMAC-SHA512 算法,使用 2048 次哈希来延伸助记符和盐参数, 产生一个 512 位的值作为其最终输出。 这个 512 位的值就是种子。

这里写图片描述

提示 :密钥延伸函数,使用 2048 次哈希是一种非常有效的保护,可以防止对助记 词或密码短语的暴力攻击。 它使得攻击尝试非常昂贵(从计算的角度),需要尝 试超过几千个密码和助记符组合,而这样可能产生的种子的数量是巨大的 (2^512)。

BIP-39 标准允许在推导种子时使用可选的密码短语。 如果没有使用密码短语,助 记词是用由常量字符串“助记词”构成的盐进行延伸,从任何给定的助记词产生一 个特定的 512 位种子。 如果使用密码短语,密钥延伸函数使用同样的助记词也 会产生不同的种子。事实上,给予一个单一的助记词,每一个可能的密码短语都 会导致不同的种子。 基本上没有“错误”的密码短语, 所有密码短语都是有效的, 它们都会导致不同的种子,形成一大批可能未初始化的钱包。这批钱包非常之大 (2^512),使用暴力破解或随机猜测基本不可能。

提示BIP-39中没有“错误的”密码短语。每个密码都会导致一些钱包,只是未使用 的钱包是空的。

可选密码短语带来两个重要功能:
(存储在大脑中的)密码短语成为第二个因素,使得助记词不能单独使用,避免 了助记词备份盗取后被利用。 起到掩人耳目的效果,把密码短语指向有小额资金 的钱包,分散攻击者注意力,使其不在关注拥有大额资金的“真实”钱包。
然而,需要注意的是,使用密码短语也会引起丢失的风险:
如果钱包所有者无行为能力或死亡,没有人知道密码,种子是无用的,所有存储
在钱包中的资金都将永远丢失。相反,如果所有者将密码短语与种子备份在相同
的地方,则违反了上述第二个因素的目的。虽然密码是非常有用的,但它们只能
与仔细计划的备份和恢复流程结合使用,考虑到所有者个人风险的可能性,应该
允许其家人恢复加密资产。


从种子创建HD钱包

HD 钱包从单个根种子(root seed)中创建,为 128 到 256 位的随机数。最常见的 是,这个种子是从助记符产生的,如上面所述。
HD 钱包的所有的确定性都衍生自这个根种子。任何兼容 HD 钱包的根种子也可重 新创造整个 HD 钱包。所以简单的转移 HD 钱包的根种子就让 HD 钱包中所包含的 成千上百万的密钥被复制,储存导出以及导入。

这里写图片描述

这里和BIP32相关,可以参考https://blog.csdn.net/m0_37847176/article/details/82011876#t3

Generate a seed byte sequence S of a chosen length (between 128 and 512 bits; 256 bits is advised) from a (P)RNG.

种子的长度可以是128-512位的,推荐是使用256位的,去看bip32的具体内容。

猜你喜欢

转载自blog.csdn.net/m0_37847176/article/details/82177627
今日推荐