分层确定性钱包前传-可生成确定密钥的助记词

转载请注明出处:www.huamo.online
字节杭州 求贤若渴:

  1. https://job.toutiao.com/s/JXTdQaH
  2. https://job.toutiao.com/s/JXTMWW3
  3. https://job.toutiao.com/s/JXT1tpC
  4. https://job.toutiao.com/s/JXTdu6h

助记词

概述

这是来自于BIP-39的提案,主要是定义了助记词的实现标准,在HD钱包中,可以派生一切的来源是最初的种子,而种子是很难备份并携带的,所以这个提案就提出了一种方法来方便的备份种子 – 助记词,由助记词可以生成种子。

助记词是一组容易记住的单词,它可以用来生成确定性钱包(的种子)。

这个提案包含2个部分:生成助记词,将其转化为一个二进制种子。这个种子后面可以用于生成符合BIP32规范的确定性钱包。

背景

相对于原生二进制或者十六进制表达的钱包种子,一个助记词对于人们更加友好。它可以方便的记录在纸上或者在电话中说出来。

特别值得说明一点的是:这篇文章是在介绍将计算机生成的随机数,转化成人类可读的记法,本质上,它还是由计算机生成的。而不是反过来,将人类自己想出来的语句,转化成一个钱包种子(这个就是广为人知的脑钱包)。

生成助记词

助记词必须以32位倍数的随机序列(熵)进行编码,熵越大安全性越好,但是助记词长度也会随之增加。将初始随机序列长度记为ENT。允许的ENT长度为128 - 256位。

首先,一个长度为ENT位的初始序列(熵)生成。对其进行SHA256哈希,然后对哈希结果取前ENT / 32位数据生成一个校验和。将这个校验和结果追加到初始序列的尾部。(看了实现的代码,其实就是把前几位数据直接作为校验和,追加到尾部)

接着,这些串联起来的位序列按11位为一组进行切分,所以每一组都编码了一个0 ~ 2047的整数,这个整数作为词汇表的索引。

最终, 我们将这些整数转换为词语,并将它们连在一起构成一个助记词语句。

下面的表格描述了初始序列长度ENT,校验和长度CS,以及生成的助记词长度MS之间的关系。

1
2
3
4
5
6
7
8
9
10
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 |

词汇表

一个理想的词汇表有如下特点:

  1. 精挑细选:只需要键入前4个字母,就可以在整个词汇表中明确锁定一个单词。

  2. 避免相似词汇: 像build,builtwoman, women, 以及quick, quickly这样的单词对尽量避免,不仅使助记词难记,而且容易出错。

  3. 词汇表有序:对词汇表进行排序,以便有效查找,例如实现时可以使用二叉搜索而不是线性搜索。还可以允许使用前缀树便于压缩。

词汇表还可以包含当地字符,但是它们必须使用NFKD方式编码为UTF-8。

从助记词还原种子

用户可以用密码保护助记词,如果密码不存在,则认为密码是""

为了从助记词中生成二进制种子,我们使用了PBKDF2方法,传入助记词(用NFKD方式编码成了UTF-8),再传入"mnemonic" + 密码(也使用NFKD方式编码成UTF-8)作为盐。迭代次数设为2048,以及HMAC-SHA512作为伪随机函数。最后生成的密钥序列为512位长度(即64字节)。

1
2
3
func NewSeed(mnemonic string, password string) []byte {
return pbkdf2.Key([]byte(mnemonic), []byte("mnemonic"+password), 2048, 64, sha512.New)
}

这个密钥序列即为种子,后续可以用于符合BIP32规范的确定性钱包,或其它相似的钱包实现。

这个助记词到种子的转化过程完全独立于助记词的生成。所以代码很简单,在句子结构方面也没有任何限制,用户也可以使用自己的词汇表,甚至实现另外一个全新的助记词生成算法(比如就是脑钱包那种自己随意写一段句子作为助记词)。

虽然可以不用上面“生成助记词”部分描述的算法生成助记词,但是不建议这么做,而且程序必须要使用词汇表计算出助记词语句的校验和,如果发现无效则需要发出警告。

一些实现

Go:https://github.com/tyler-smith/go-bip39

参考链接

转载请注明出处:www.huamo.online