詳解 | 錢包的技術細節之種子的創建過程
上回書說到,您要是準備開發一個比特幣錢包,那麼它應該被構建為一個HD錢包。那麼,錢包是怎樣實現的?錢包又有哪些行業標準呢?由於確定性錢包的密鑰,可以通過種子來生成,所以,HD錢包用戶只有了原始種子就可以利用錢包生成所有的密鑰了。關於錢包的具體細節,將分成兩篇文章來介紹。第一篇介紹錢包的種子是如何生成的,第二篇將介紹接下來的如何用種子來創建HD錢包。所以,這篇文章將著重來介紹種子的創建過程。本文將按照下面的結構來展開:
1.BIP 比特幣改進建議
比特幣建議提案是向比特幣社區提供信息的設計文檔,或用於描述比特幣的新功能,流程和環境。根據BIP-01也就是BIP的目的和指南的規定,有三種BIP,分別是標準類BIP,信息類BIP,以及過程類BIP。BIP記錄在GitHub上的版本化存儲庫中。下面來簡單介紹一下這三種BIP的種類:
(1)標準類BIP
描述影響比特幣實現的更改的建議,這類建議具有「比特幣行業標準」的功能。比如網路協議的更改,區塊有效性規則的更改等等。這類標準的主要作用是提出新功能,新標準,有新的改進,代表著比特幣社區的共識和建議。
(2)信息類BIP
描述比特幣設計問題,或者想比特幣社區提供一般準則或信息,但不提供新功能。這類BIP不代表比特幣社區的共識,讀者和實施者可以忽略此類信息。
(3)過程類BIP
描述一個比特幣過程,或者提出一個過程的更改。這類BIP與標準BIP類似,但適用於比特幣協議本身以外的其他領域。這類BIP可能會提出一個實現,但是這個實現不是在比特幣的代碼庫中實現。過程類BIP需要得到社區的共識,用戶不能過隨意忽略它。
所以說,在這三類BIP協議中,信息類BIP是可以忽略的,標準類BIP和過程類BIP對於比特幣網路的改進是十分重要的,不能夠忽略。接下來的關於比特幣錢包的標準就是來自於這些標準類BIP。
2.常見的錢包標準
比特幣錢包技術已經比較成熟了,理所當然的出現了一些常見的行業標準。這些行業標準使得比特幣錢包具備廣泛互操作,易於使用,安全和靈活的特性。常見的標準有:
(1)助記碼,基於BIP-39
(2)HD錢包,基於BIP-32
(3)多用途HD錢包結構,基於BIP-43
(4)多幣種和多賬戶錢包,基於BIP-44
這些標準已經被廣泛的軟體和硬體錢包採用了,使得所有的這些錢包可以實現互操作。用戶可以到處在一個錢包上生成的助記符,並將其導入另一個錢包,實現恢復所有交易,密鑰和地址。
支持這些標準的軟體錢包,包括(按字母順序排列)Breadwallet,Copay,Multibit HD和Mycelium等。支持這些標準的硬體錢包,包括(按字母順序排列)Keepkey,Ledger和Trezor等。如果您正在準備開發一個比特幣錢包,那麼,它應該被構建為一個HD錢包,一個種子被編碼為助記詞代碼進行備份,遵循BIP-32,BIP-39,BIP-43和BIP-44標準。
3.助記碼辭彙(BIP-39)| 種子的創建過程
助記碼辭彙使用英文單詞序列來編碼種子,用來對應確定性錢包中的隨機數。簡單來講,助記碼辭彙是單詞序列形式的種子,記住了助記碼,就能夠用來恢複錢包。
- 助記詞和種子的區別
確定性錢包是由種子衍生創造的。為了便於使用,種子被編碼為助記詞。種子是128到256位的隨機數,是面向程序底層的。而助記詞是一個12~24個單詞的隨機序列,是面向用戶的。兩者是統一事物的兩種不同的表現形式,其本質是一樣的。下表是助記詞及其所對應的種子:
- 助記詞和腦錢包的區別
助記詞和「腦錢包」經常被混淆。他們不一樣!主要區別在於腦錢包是由用戶所選擇的單詞順序來生成對應的種子,而助記詞是由錢包隨機創建的,並呈現給用戶。這個重要的區別,使得助記詞更加的安全,因為猜測隨機數字,對人類而言是無能為力的。
- BIP-39標準過程
利用BIP-39標準創建種子錢包過程中,主要分成兩部分。第一部分是創建助記詞,第二部分是從助記詞生成種子。
助記詞是由錢包使用BIP-39中定義的標準化過程自動生成的。錢包從熵源開始,增加校驗和,然後將熵映射到單詞列表,主要分為以下六個步驟:
- 創建一個128到256位的隨機序列(熵)。
- 提出SHA256哈希的前幾位(熵長/32),就可以創造出隨機序列的校驗和。
- 將校驗和添加到隨機序列的末尾。
- 將序列劃分為包含11位的不同部分。
- 將每個包含11部分的值與一個已經預先定義2048個單詞的詞典做對應。
- 生成的有序的單片語就是助記碼。
由上面的步驟可知,創建助記詞的過程中,依然用到了哈希函數,隨機數,校驗和等等。映射部分主要是在步驟5中。下圖展示了熵是如何生成助記詞的。
在上面的例子中,我們選取了長度為128位的熵,來生成了有12個單詞的助記碼。在實際的應用中,熵的長度越長,校驗碼的長度和助記詞的長度也會相應的增長。下圖展示了熵數據的大小和助記詞的長度之間的關係:
- 由助記詞生成種子
從上面的流程可知,助記詞實際上代表的是128至256位的熵。接下來的過程中,將會通過使用密鑰延伸函數PBKDF2 (Password-Based Key Derivation Function)來導出較長的(512位)的種子。將所得的種子用於構建確定性錢包並得到其密鑰。
密鑰延伸函數有兩個參數,助記詞和鹽。鹽的目的是增加構建能夠進行暴力攻擊的查找表的難度。在BIP-39標準匯總,鹽有另一個目的,那就是可以允許引入密碼短語,作為保護種子的附加安全因子。創建助記詞之後的7-9步過程如下:
- PBKDF2密鑰延伸函數的第一個參數是步驟6中生成的助記詞。
- PBKDF2密鑰延伸函數的第二個參數是鹽。有字元串常數「助記詞」和可選的用戶提供的密碼字元串連接組成。
- PBKDF2使用HMAC-SHA512演算法,使用2048次哈希來延伸助記符和鹽參數,產生一個512位的值作為其最終的輸出。這個512位的值就是種子!
下圖顯示了如何從助記詞生成種子:
- BIP-39中的可選密碼
從上圖可以看出,BIP-39標準允許在推導種子時使用可選的密碼短語。如果沒有使用密碼短語,助記詞是用有常量字元串「助記詞」構成的鹽進行延伸,給任何給定的助記詞產生一個特定的512位種子。如果使用了密碼短語,密鑰延伸函數使用同樣的助記詞會產生不同的種子。這樣助記碼加可選密碼的組合方式,使得產生的種子的數量大大增加。
從種子的生成過程中,我們可以看到,用到了很多的單向哈希函數。最後生成的種子是一個512位的隨機數字。正是因為位數有512位,這就提供了取之不盡的地址。
參考鏈接:
第五章 錢包 · 巴比特圖書推薦閱讀:
※錢包釣魚攻擊隨著比特幣增值而劇增
※[block #5] 交易所關閉後如何安全地冷存儲比特幣資產(詳細圖解)
※如果比特幣在線錢包平台關閉了服務,比特幣是不是就沒了?
※比特幣現在16000美刀,入手還來的及嗎?
TAG:区块链Blockchain | 比特币钱包 | 比特币Bitcoin |