LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 新闻观点 > 墨客科普 | MOAC区块链助记词

墨客科普 | MOAC区块链助记词

2019-12-20 淼淼淼淼 来源:区块链网络

1.什么是助记词

拥有数字货币资产的人都知道,私钥的备份是非常重要的,有私钥就拥有该私钥对应账户上的所有资产。一般来说私钥都有 256 位,以 64 个字母数字构成的16 进制字符串表示。直接抄录这 64 个字母数字是很容易搞错的。

助记词是明文私钥的另一种表现形式, 最早是由BIP39提案提出, 其目的是为了帮助用户记忆复杂的私钥(64位的哈希值)。助记词一般由12、15、18、21、24个单词构成, 这些单词都取自一个固定词库, 其生成顺序也是按照一定算法而来,所以用户没必要担心随便输入 12 个单词就会生成一个地址。

虽然助记词和 Keystore 都可以作为私钥的另一种表现形式, 但与 Keystore 不同的是, 助记词是未经加密的私钥, 没有任何安全性可言,任何人得到了你的助记词, 可以不费吹灰之力的夺走你的资产。

2.BIP

要弄清楚助记词与私钥的关系,得清楚BIP协议,是Bitcoin Improvement Proposals的缩写,意思是Bitcoin的改进建议,用于提出 Bitcoin 的新功能或改进措施。BIP协议衍生了很多的版本,主要有BIP32、BIP39、BIP44。

BIP32

BIP32是 HD钱包的核心提案,通过种子来生成主私钥,然后派生海量的子私钥和地址,种子是一串很长的随机数。

BIP39

由于种子是一串很长的随机数,不利于记录,所以我们用算法将种子转化为一串12 ~ 24个的单词,方便保存记录,这就是BIP39,它扩展了HD钱包种子的生成算法。

BIP44

BIP44 是在 BIP32 和 BIP43的基础上增加多币种,提出的层次结构非常全面,它允许处理多个币种,多个帐户,每个帐户有数百万个地址。

在BIP32路径中定义以下5个级别:

m/purpse'/coin_type'/account'/change/address_index

purpose:在BIP43之后建议将常数设置为44'。表示根据BIP44规范使用该节点的子树。

Coin_type:币种,代表一个主节点(种子)可用于无限数量的独立加密币,如比特币,Litecoin或Namecoin。此级别为每个加密币创建一个单独的子树,避免重用已经在其它链上存在的地址。开发人员可以为他们的项目注册未使用的号码。

Account:账户,此级别为了设置独立的用户身份可以将所有币种放在一个的帐户中,从0开始按顺序递增。

Change:常量0用于外部链,常量1用于内部链,外部链用于钱包在外部用于接收和付款。内部链用于在钱包外部不可见的地址,如返回交易变更。

Address_index:地址索引,按顺序递增的方式从索引0开始编号。

BIP44的规则使得 HD钱包非常强大,用户只需要保存一个种子,就能控制所有币种,所有账户的钱包,因此由BIP39生成的助记词非常重要,所以一定安全妥善保管,那么会不会被破解呢?如果一个 HD 钱包助记词是 12 个单词,一共有 2048个单词可能性,那么随机的生成的助记词所有可能性大概是5e+39,因此几乎不可能被破解。

HD钱包

通过BIP协议生成账号的钱包叫做HD钱包。这个HD钱包,并不是Hardware Wallet硬件钱包,这里的 HD 是HierarchicalDeterministic的缩写,意思是分层确定性钱包 。

以太坊对BIP的支持

BIP是用于提出 Bitcoin 的新功能或改进措施,那么对于以太坊来说如何支持呢?

以太坊在EIPs/issues/85中讨论的结果,也采用了 BIP32 的做法,提议 HD 路径为 :m/44'/60'/0'/0/n,n 是第 n次生成地址。

3.助记词到私钥的步骤

3.1 从熵到助记词

随机生成一个128到258位的数字,叫做熵; 熵通过SHA256哈希得一个值,取前面的几位(熵长/32),记为y;熵和y组成一个新的序列,将新序列以11位为一部分,已经预先定义2048个单词的字典做对应; 生成的有顺序的单词组就是助记词。

3.2 从助记词生成种子

助记词表示长度为128至256位的熵。 通过使用密钥延伸函数PBKDF2,熵被用于导出较长的(512位)种子。

PBKDF2的基本原理是通过一个伪随机函数(例如HMAC函数),把明文和一个盐值作为输入参数,然后重复进行运算,并最终产生密钥。如果重复的次数足够大,破解的成本就会变得很高。而盐值的添加也会增加“彩虹表”攻击的难度。

比特币钱包中,PBKDF2函数的第一个参数是助记词,第二个参数盐,由字符串常数“助记词”与可选的用户提供的密码字符串连接组成。使用HMAC-SHA512算法,使用2048次哈希来延伸助记符和盐参数,产生一个512位的值作为其最终输出。这个512位的值就是种子。

3.3 从种子到母密钥

512位分成平均分成两部分,左边的256位为母私钥,右边的256位为链码。母私钥、链码和索引号,CKD(child keyderivation)函数去从母密钥衍生出子密钥。

3.4 从母密钥到子密钥

母密钥、链码、索引合并在一起并且用HMAC-SHA512函数散列之后可以产生512位的散列。所得的散列可被拆分为两部分。散列右半部分的256位产出可以给子链当链码。左半部分256位散列以及索引码被加载在母私钥上来衍生子私钥。在图中,我们看到这个说明——索引集被设为0去生产母密钥的第0个子密钥(第一个通过索引)。

3.5 扩展密钥

母密钥和链码结合叫做扩展密钥,拥有扩展私钥可以推导出子私钥,扩展公钥可以推导出子公钥。拥有扩展公钥就可以推导出子公钥,在服务器不需要母私钥也可以,这样就更安全更方便。但是还有一个问题,那就是扩展公钥包含有链码,如果子私钥被知道或者被泄漏的话,链码就可以被用来衍生所有的其他子私钥。简单地泄露的私钥以及一个母链码,可以暴露所有的子密钥。更糟糕的是,子私钥与母链码可以用来推断母私钥。

基本流程见下图:

4.生成助记词

生成不同个数的助记词代码:

运行结果:

5.助记词编解码

5.1 编码

运行结果:

5.2 解码

运行结果:

5.3 验证助记词

运行结果:

6.生成随机数种子

运行结果:

这里是个异步过程,因此代码修改为:

运行结果:

7.生成私钥

运行结果:

—-

编译者/作者:淼淼淼淼

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...