助记词的实现
别人的库多半都是只实现了部分功能,所以fork了人家的源码,在此基础上增加了实用功能,保证通过助记词恢复和对助记词的校验,避免了因随意输入助记词便可恢复成私钥的过程。原作者的实现并非十分高效,但接口很直观,该有的功能很全面,做法有很多,开源能使它更好。仅当学习。
https://github.com/alphaqiu/mnemonic
BIP39是助记词标准的实现,助记词是一个随机数的字序列,用来作为种子产生一个确定性的钱包。单词序列足以重新创建种子,然后再创建钱包和所有派生的密钥。一个实现带有助记词的确定性钱包应用程序在首次创建钱包时将向用户显示12到24个单词的序列。该单词序列是钱包备份,可用于恢复和重新创建相同或任何兼容的钱包应用程序中的所有密钥。记忆单词使用户更容易备份钱包,因为与随机数字序列相比,它们易于阅读和正确地转录。所有的助记词在这里可以查看:助记词词库。
使用BIP39中定义的标准化过程,钱包自动生成助记词。钱包从一个熵源开始,添加一个校验和,然后将熵映射到一个单词列表,具体步骤如下:
- 创建128到256位的随机序列(熵)。
- 通过获取SHA256哈希的第一(熵长度/ 32)位来创建随机序列的校验和。
- 将校验和添加到随机序列的末尾。
- 将序列分成11位的部分。
- 将每个11位值映射到来自2048个单词的预定义字典中的单词。
- 助记词是单词序列。 生成助记词的步骤如下图。
下表描述了初始熵长度(ENT),校验和长度(CS)和单词中生成的助记词(MS)的长度之间的关系。
从助记词到种子
用户可以决定用密码来保护他们的助记符。如果不存在密码短语,则使用空字符串“”。
助记词代表长度为128到256位的熵。然后使用熵通过使用密钥扩展函数PBKDF2来导出更长(512位)的种子。然后,所产生的种子用于构建确定性钱包并获得其密钥。
密钥扩展功能有两个参数:助记词和盐(salt)。密钥扩展功能中的盐的目的是使得难以构建能够进行暴力攻击的查找表。在BIP-39标准中,salt具有另一个目的 - 它允许引入密码短语作为保护种子的额外安全因子。
- PBKDF2密钥扩展功能的第一个参数是从步骤6产生的助记词。
- PBKDF2密钥扩展功能的第二个参数是salt。salt由字符串常量“mnemonic”和可选的用户提供的密码短语字符串组成。
- PBKDF2使用2048轮HMAC-SHA512哈希算法来扩展助记词和salt参数,产生512位值作为其最终输出。那个512位的值就是种子。 使用助记词来生成种子的步骤如下图。