BIP39标准就是为了解决助记词的需求,通过随机生成12~24个容易记住的单词,单词序列通过PBKDF2与HMAC-SHA512函数创建出随机种子作为BIP32的种子。
【BIP32-从助记词到种子】
BIP32标准的种子是一个随机16字节的16进制的字符串。如果能够使用英文单词作为助记词无疑会降低种子备份及恢复钱包难度。
为了从助记词中生成二进制种子,BIP39 采用 PBKDF2 函数推算种子,其参数如下:
【助记词句子作为密码,"mnemonic" + passphrase 作为盐,2048 作为重复计算的次数,HMAC-SHA512 作为随机算法,512 位(64 字节)是期望得到的密钥长度】
具体操作如下:
1.用户可以决定用密码保护他们的助词。如果密码不存在,则使用空字符串“”代替。
2.要通过助记词创建一个二进制种子,我们使用助记符作为密码(UTF-8 NFKD)和字符串“mnemonic”+ passphrase 作为盐(再次以UTF-8 NFKD)来调用PBKDF2函数。迭代计数设置为2048,HMAC-SHA512用作伪随机函数。派生密钥的长度为512位(= 64字节)。
DK = PBKDF2(PRF, Password, Salt, c, dkLen)
该种子可以随后用于使用BIP-0032或类似方法产生确定性钱包。****助记词转换为二进制种子完全独立于生成这个助记词。这导致相当简单的代码; 助记词结构没有约束,客户可以自由地实现自己的单词列表,甚至是整个助记词的生成器,允许字典列表中的输入错误检测或其他用途的灵活性。
虽然使用的助记词可能不是通过“生成助记词”部分中描述的算法生成的,但这是不建议的,软件必须使用单词表计算助记词的校验和,如果无效则发出警告。所描述的方法还提供似乎可信的可否认性,因为每个密码短语产生一个有效的种子(因此产生确定性钱包),但是只有正确的那一个才能使所需的钱包可用。
助记词由长度为 128 到 256 位的随机序列(熵)匹配词库而来,随后采用PBKDF2 function推导出更长的种子(seed)。生成的种子被用来生成构建 deterministic Wallet 和推导钱包密钥。
在密码学中,Key stretching技术被用来增强弱密钥的安全性,增加了暴力破解 (Brute-force attack) 对每个可能密钥尝试攻破的时间,增强了攻击难度。各种编程语言原生库都提供了 key stretching 的实现。PBKDF2(Password-Based Key Derivation Function 2) 是常用的 key stretching 算法中的一种。基本原理是通过一个为随机函数(例如 HMAC 函数),把明文和盐值作为输入参数,然后重复进行运算最终产生密钥。