MOAC区块链助记词
?
1.什么是助記詞
?
擁有數(shù)字貨幣資產(chǎn)的人都知道,私鑰的備份是非常重要的,有私鑰就擁有該私鑰對(duì)應(yīng)賬戶上的所有資產(chǎn)。一般來說私鑰都有 256 位,以 64 個(gè)字母數(shù)字構(gòu)成的 16 進(jìn)制字符串表示。直接抄錄這 64 個(gè)字母數(shù)字是很容易搞錯(cuò)的。
?
助記詞是明文私鑰的另一種表現(xiàn)形式, 最早是由BIP39提案提出, 其目的是為了幫助用戶記憶復(fù)雜的私鑰 (64位的哈希值)。助記詞一般由12、15、18、21、24個(gè)單詞構(gòu)成, 這些單詞都取自一個(gè)固定詞庫(kù), 其生成順序也是按照一定算法而來, 所以用戶沒必要擔(dān)心隨便輸入 12 個(gè)單詞就會(huì)生成一個(gè)地址。
?
雖然助記詞和 Keystore 都可以作為私鑰的另一種表現(xiàn)形式, 但與 Keystore 不同的是, 助記詞是未經(jīng)加密的私鑰, 沒有任何安全性可言, 任何人得到了你的助記詞, 可以不費(fèi)吹灰之力的奪走你的資產(chǎn)。
?
2.BIP
?
要弄清楚助記詞與私鑰的關(guān)系,得清楚BIP協(xié)議,是Bitcoin Improvement Proposals的縮寫,意思是Bitcoin 的改進(jìn)建議,用于提出 Bitcoin 的新功能或改進(jìn)措施。BIP協(xié)議衍生了很多的版本,主要有BIP32、BIP39、BIP44。
?
BIP32
?
BIP32是 HD錢包的核心提案,通過種子來生成主私鑰,然后派生海量的子私鑰和地址,種子是一串很長(zhǎng)的隨機(jī)數(shù)。
?
BIP39
?
由于種子是一串很長(zhǎng)的隨機(jī)數(shù),不利于記錄,所以我們用算法將種子轉(zhuǎn)化為一串12 ~ 24個(gè)的單詞,方便保存記錄,這就是BIP39,它擴(kuò)展了 HD錢包種子的生成算法。
?
BIP44
?
BIP44 是在 BIP32 和 BIP43 的基礎(chǔ)上增加多幣種,提出的層次結(jié)構(gòu)非常全面,它允許處理多個(gè)幣種,多個(gè)帳戶,每個(gè)帳戶有數(shù)百萬個(gè)地址。
?
在BIP32路徑中定義以下5個(gè)級(jí)別:
m/purpse'/coin_type'/account'/change/address_index
?
purpose:在BIP43之后建議將常數(shù)設(shè)置為44'。表示根據(jù)BIP44規(guī)范使用該節(jié)點(diǎn)的子樹。
?
Coin_type:幣種,代表一個(gè)主節(jié)點(diǎn)(種子)可用于無限數(shù)量的獨(dú)立加密幣,如比特幣,Litecoin或Namecoin。此級(jí)別為每個(gè)加密幣創(chuàng)建一個(gè)單獨(dú)的子樹,避免重用已經(jīng)在其它鏈上存在的地址。開發(fā)人員可以為他們的項(xiàng)目注冊(cè)未使用的號(hào)碼。
?
Account:賬戶,此級(jí)別為了設(shè)置獨(dú)立的用戶身份可以將所有幣種放在一個(gè)的帳戶中,從0開始按順序遞增。
?
Change:常量0用于外部鏈,常量1用于內(nèi)部鏈,外部鏈用于錢包在外部用于接收和付款。內(nèi)部鏈用于在錢包外部不可見的地址,如返回交易變更。
?
Address_index:地址索引,按順序遞增的方式從索引0開始編號(hào)。
?
BIP44的規(guī)則使得 HD錢包非常強(qiáng)大,用戶只需要保存一個(gè)種子,就能控制所有幣種,所有賬戶的錢包,因此由BIP39 生成的助記詞非常重要,所以一定安全妥善保管,那么會(huì)不會(huì)被破解呢?如果一個(gè) HD 錢包助記詞是 12 個(gè)單詞,一共有 2048 個(gè)單詞可能性,那么隨機(jī)的生成的助記詞所有可能性大概是5e+39,因此幾乎不可能被破解。
?
HD錢包
?
通過BIP協(xié)議生成賬號(hào)的錢包叫做HD錢包。這個(gè)HD錢包,并不是Hardware Wallet硬件錢包,這里的 HD 是Hierarchical Deterministic的縮寫,意思是分層確定性錢包 。
?
以太坊對(duì)BIP的支持
BIP是用于提出 Bitcoin 的新功能或改進(jìn)措施,那么對(duì)于以太坊來說如何支持呢?
以太坊在EIPs/issues/85中討論的結(jié)果,也采用了 BIP32 的做法,提議 HD 路徑為 :m/44'/60'/0'/0/n,n 是第 n 次生成地址。
?
3.助記詞到私鑰的步驟
?
3.1 從熵到助記詞
隨機(jī)生成一個(gè)128到258位的數(shù)字,叫做熵; 熵通過SHA256哈希得一個(gè)值,取前面的幾位(熵長(zhǎng)/32),記為y; 熵和y組成一個(gè)新的序列,將新序列以11位為一部分,已經(jīng)預(yù)先定義2048個(gè)單詞的字典做對(duì)應(yīng); 生成的有順序的單詞組就是助記詞。
?
3.2 從助記詞生成種子
助記詞表示長(zhǎng)度為128至256位的熵。?通過使用密鑰延伸函數(shù)PBKDF2,熵被用于導(dǎo)出較長(zhǎng)的(512位)種子。
?
PBKDF2的基本原理是通過一個(gè)偽隨機(jī)函數(shù)(例如HMAC函數(shù)),把明文和一個(gè)鹽值作為輸入?yún)?shù),然后重復(fù)進(jìn)行運(yùn)算,并最終產(chǎn)生密鑰。如果重復(fù)的次數(shù)足夠大,破解的成本就會(huì)變得很高。而鹽值的添加也會(huì)增加“彩虹表”攻擊的難度。
?
比特幣錢包中,PBKDF2函數(shù)的第一個(gè)參數(shù)是助記詞,第二個(gè)參數(shù)鹽,由字符串常數(shù)“助記詞”與可選的用戶提供的密碼字符串連接組成。使用HMAC-SHA512算法,使用2048次哈希來延伸助記符和鹽參數(shù),產(chǎn)生一個(gè)512位的值作為其最終輸出。?這個(gè)512位的值就是種子。
?
3.3 從種子到母密鑰
512位分成平均分成兩部分,左邊的256位為母私鑰,右邊的256位為鏈碼。母私鑰、鏈碼和索引號(hào),CKD(child key derivation)函數(shù)去從母密鑰衍生出子密鑰。
?
3.4 從母密鑰到子密鑰
母密鑰、鏈碼、索引合并在一起并且用HMAC-SHA512函數(shù)散列之后可以產(chǎn)生512位的散列。所得的散列可被拆分為兩部分。散列右半部分的256位產(chǎn)出可以給子鏈當(dāng)鏈碼。左半部分256位散列以及索引碼被加載在母私鑰上來衍生子私鑰。在圖中,我們看到這個(gè)說明——索引集被設(shè)為0去生產(chǎn)母密鑰的第0個(gè)子密鑰(第一個(gè)通過索 引)。
?
3.5 擴(kuò)展密鑰
母密鑰和鏈碼結(jié)合叫做擴(kuò)展密鑰,擁有擴(kuò)展私鑰可以推導(dǎo)出子私鑰,擴(kuò)展公鑰可以推導(dǎo)出子公鑰。擁有擴(kuò)展公鑰就可以推導(dǎo)出子公鑰,在服務(wù)器不需要母私鑰也可以,這樣就更安全更方便。但是還有一個(gè)問題,那就是擴(kuò)展公鑰包含有鏈碼,如果子私鑰被知道或者被泄漏的話,鏈碼就可以被用來衍生所有的其他子私鑰。簡(jiǎn)單地泄露的私鑰以及一個(gè)母鏈碼,可以暴露所有的子密鑰。更糟糕的是,子私鑰與母鏈碼可以用來推斷母私鑰。
基本流程見下圖:
?
?
4.生成助記詞
生成不同個(gè)數(shù)的助記詞代碼:
?
運(yùn)行結(jié)果:
?
5.助記詞編解碼
5.1 編碼
運(yùn)行結(jié)果:
?
5.2 解碼
?
運(yùn)行結(jié)果:
?
5.3 驗(yàn)證助記詞
運(yùn)行結(jié)果:
?
6.生成隨機(jī)數(shù)種子
?
運(yùn)行結(jié)果:
?
這里是個(gè)異步過程,因此代碼修改為:
運(yùn)行結(jié)果:
?
7.生成私鑰
?
運(yùn)行結(jié)果:
?
總結(jié)
以上是生活随笔為你收集整理的MOAC区块链助记词的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue绑定后台数据ajax,vueJS
- 下一篇: 【原创+转载】腾讯股票接口——实时行情解