- A+
助记码词汇(BIP-39)
助记码词汇是英文单词序列代表(编码)用作种子对应所确定性钱包的随机数。单词的序列足以重新创建种子,并且从种子那里重新创造钱包以及所有私钥。在首次创建钱包时,带有助记码的,运行确定性钱包的钱包的应用程序将会向使用者展示一个12至24个词的顺序。单词的顺序就是钱包的备份。它也可以被用来恢复以及重新创造应用程序相同或者兼容的钱包的密钥。助记码词汇可以让使用者复制钱包更容易一些,因为相比较随机数字顺序来说,它们更容易地被阅读和正确抄写。
.
助记词经常与“脑钱包”混淆。 他们不一样。主要区别在于脑钱包由用户选择的单词组成,而助记符是由钱包随机创建的,并呈现给用户。 这个重要的区别使助记词更加安全,因为人类猜测随机数还是无能为力。
.
助记码被定义在比特币的改进建议39中。需要注意的是,BIP-39是助记码标准的一个实施方案。还有一个不同的标准,使用一组不同的单词,是由Electrum钱包使用,并且早于BIP-39。 BIP-39由Trezor硬件钱包背后的公司提出,与Electrum的实施不兼容。 然而,BIP-39现在已经在数十个可互操作的实践案例中获得了广泛的行业支持,应被视为事实上的行业标准。
.
BIP-39定义了助记符码和种子的创建,我们在这里描述了九个步骤。 为了清楚起见,该过程分为两部分:
1-6步是创建助记词,7-9步是从助记词到种子。
步骤一:创建助记词
助记词是由钱包使用BIP-39中定义的标准化过程自动生成的。 钱包从熵源开始,增加校验和,然后将熵映射到单词列表:
1、创建一个128到256位的随机序列(熵)。
2、提出SHA256哈希前几位(熵长/ 32),就可以创造一个随机序列的校验和。
3、将校验和添加到随机序列的末尾。
4、将序列划分为包含11位的不同部分。
5、将每个包含11位部分的值与一个已经预先定义2048个单词的字典做对应。
6、生成的有顺序的单词组就是助记码。
熵数据的大小和助记词的长度之间的关系
.
步骤二:从助记词到种子
助记词表示长度为128至256位的熵。 通过使用密钥延伸函数PBKDF2,熵被用于导出较长的(512位)种子。将所得的种子用于构建确定性钱包并得到其密钥。
.
密钥延伸函数有两个参数:助记词和盐。其中盐的目的是增加构建能够进行暴力攻击的查找表的困难度。 在BIP-39标准中,盐具有另一目的,它允许引入密码短语(passphrase),作为保护种子的附加安全因素
.
创建助记词之后的7-9步是:
7、PBKDF2密钥延伸函数的第一个参数是从步骤6生成的助记符。
8、PBKDF2密钥延伸函数的第二个参数是盐。 由字符串常数“助记词”与可选的用户提供的密码字符串连接组成。
9、PBKDF2使用HMAC-SHA512算法,使用2048次哈希来延伸助记符和盐参数,产生一个512位的值作为其最终输出。 这个512位的值就是种子。
提示 密钥延伸函数,使用2048次哈希是一种非常有效的保护,可以防止对助记词或密码短语的暴力攻击。 它使得攻击尝试非常昂贵(从计算的角度),需要尝试超过几千个密码和助记符组合,而这样可能产生的种子的数量是巨大的(2^512)
.
BIP-39中的可选密码短语
BIP-39标准允许在推导种子时使用可选的密码短语。 如果没有使用密码短语,助记词是用由常量字符串“助记词”构成的盐进行延伸,从任何给定的助记词产生一个特定的512位种子。 如果使用密码短语,密钥延伸函数使用同样的助记词也会产生不同的种子。
.
可选密码短语带来两个重要功能:
(存储在大脑中的)密码短语成为第二个因素,使得助记词不能单独使用,避免了助记词备份盗取后被利用。 起到掩人耳目的效果,把密码短语指向有小额资金的钱包,分散攻击者注意力,使其不在关注拥有大额资金的“真实”钱包。
然而,需要注意的是,使用密码短语也会引起丢失的风险:
如果钱包所有者无行为能力或死亡,没有人知道密码,种子是无用的,所有存储在钱包中的资金都将永远丢失。
.
使用助记符代码(BIP-39生成器可以离线使用)
BIP-39被做成函数库,支持多种编程语言:
SatoshiLabs团队在Python中提出了BIP-39标准的参考实现
作为流行的bitcoinJS框架的一部分,在JavaScript中实现了BIP-39
作为流行的Libbitcoin框架的一部分,在C ++中实现了BIP-39
.
还有一个BIP-39生成器在独立的网页中实现,对于测试和实验非常有用。
从种子中创造HD钱包()
此处暂略,进阶课程中分享。