O3 钱包上周正式上线支持了 ETH 钱包,大家在创建钱包时涉及到了一些专业名词:助记词,私钥、Keystore。相信大家都听到这样的说法:助记词是加密后的私钥,但没有详细了解过它的产生过程和为什么说它是加密后的私钥。
今天我们就从技术角度了解一下助记词是如何产生的,以及它是如何变成私钥的。
在一般数字货币中使用的都是 256 位的随机整数作为私钥的,但记忆很困难,所以为了方便大家记忆和使用,BIP39 规范提出了一种通过助记词来推算种子的算法,帮助我们的降低使用门槛。
· 助记词的几种形式
目前已经规范化的助记词词典有简体中文、繁体中文、英文、日文、法语、意大利语、韩语、西班牙语等,但大部分主流钱包还是只使用英文。
虽然我们常见的助记词个数是 12 或 24 个,但是还是可以生成 15、18、21 个数的助记词,甚至是低于 12 个。他们之间的区别是:一般24个词的安全性高,但是12个词易用性高,且可以兼容其他主流钱包;而低于 12 个词的碰撞几率太大、风险太高所以不建议使用。
· 助记词的生成过程
1、首先生成一个 128-256 Bit 的随机数,这个随机数的位数须是 32 的倍数;
2、然后将随机数进行 SHA256 ,取前 X 位当做校验位。具体几位需要看产生随机数的位数( X = 随机数位数 / 32 );
3、将效验位添加到随机数后面;
4、将添加效验位的随机数按位分成每 11 位为一组,分成若干个组;
5、那么每 11 位都可以得到值范围是 0~2047 的数,根据这些数去查助记词词典,就可以得到助记词了。
助记词词典是一个 2048 个词的列表,具体可查看英文词典示例。
如果钱包需要支持相应语言的助记词,可以前往下载各种语言助记词。
随机数位数 | 校验位位数 | 随机数加校验位位数 | 助记词个数 |
---|---|---|---|
128 | 4 | 132 | 12 |
160 | 5 | 165 | 15 |
192 | 6 | 198 | 18 |
224 | 7 | 231 | 21 |
256 | 8 | 264 | 24 |
· 助记词生成私钥的过程
1、对助记词和盐使用 NFKD 进行规范化编码( 盐是 “mnemonic” + 密码 );
2、使用 PBKDF2 算法获得 512 位的种子,PBKDF2 使用 HMAC-SHA512 作为哈希算法,并进行 2048 次计算;
3、前 256 位就是私钥,后 256 位的作用大家暂时不用知道,我们使用 BIP32 的时候才会用到。
· 如何验证助记词的正确性
1、去词典查词,检查用户输入的词在不在词典里;
2、把所有词的索引拿出来按顺序转换成由位组成二进制数据然后进行拼接组合;
3、把二进制数据再拆分成随机数和校验位,然后把随机数进行 SHA256 ,最后对比校验位结果是否正确。
· 助记词的一些特性
1、由于使用了 HMAC-SHA512 的 PBKDF2 算法,所以无法由 512 位的种子反向推出助记词;
2、助记词和 128 位的随机数是可以相互转换的;
3、助记词生成私钥的时候是可以加入自己的密码来降低碰撞率以及安全性。
本文来源:BitTribeLab
作者:闪电网络北京研发小组 王荣强
联系我们: O3 Labs 官网: http://o3.network O3 钱包下载链接: http://o3.network/#download 官方电报群: https://t.me/O3Community 官方推特: https://twitter.com/O3_Labs O3 Labs 爱好者中文社区微信群:添加小助手微信进群(VX:wyfdc0919)点击“阅读原文”进入 O3 Labs 官网。