圖1展示的是一個非確定性錢包,其含有的隨機金鑰是個鬆散的集合。
提示除了簡單的測試之外,不要使用非確定性錢包。 它們對於備份和使用來說太麻煩了。 相反,推薦使用基於行業標準的HD錢包,可以用種子助記詞進行備份。
1.2 確定性(種子)錢包
確定性,或者“種子”錢包包含透過使用單項離散函式而可從公共的種子生成的私鑰。種子是隨機生成的數字。這個數字也含有比如索引號碼或者可生成私鑰的“鏈碼”(參見“ 分層確定性錢包(BIP0032/BIP0044)”一節)。在確定性錢包中,種子足夠恢復所有的已經產生的私鑰,所以只用在初始建立時的一個簡單備份就足以搞定。並且種子也足夠讓錢包匯入或者匯出。這就很容易允許使用者的私鑰在錢包之間輕鬆轉移。
圖2展示了確定性錢包的邏輯圖。
1.3 分層確定性錢包(HD Wallets (BIP-32/BIP-44))
確定性錢包被開發成更容易從單個“種子”中生成許多金鑰。確定性錢包的最高階形式是透過BIP0032標準定義的HD錢包。HD錢包包含以樹狀結構衍生的金鑰,使得父金鑰可以衍生一系列子金鑰,每個子金鑰又可以衍生出一系列孫金鑰,以此類推,無限衍生。圖3展示了樹狀結構。
相比較隨機(不確定性)金鑰,HD錢包有兩個主要的優勢。第一,樹狀結構可以被用來表達額外的組織含義。比如當一個特定分支的子金鑰被用來接收交易收入並且有另一個分支的子金鑰用來負責支付花費。不同分支的金鑰都可以被用在企業環境中,這就可以支配不同的分支部門、子公司、具體功能以及會計類別。
HD錢包的第二個好處就是它可以允許讓使用者去建立一個公共金鑰的序列而不需要訪問相對應的私鑰。這可允許HD錢包在不安全的伺服器中使用或者在每筆交易中發行不同的公共鑰匙。公共鑰匙不需要被預先載入或者提前衍生,而在伺服器中不需要可用來支付的私鑰。
1.4種子和助記詞(BIP-39)
HD錢包具有管理多個金鑰和地址的強大機制。由一系列英文單詞生成種子是個標準化的方法,這樣易於在錢包中轉移、匯出和匯入,如果HD錢包與這種方法相結合,將會更加有用。 這些英文單詞被稱為助記詞,標準由BIP-39定義。 今天,大多數比特幣錢包(以及其他加密貨幣的錢包)使用此標準,並可以使用可互操作的助記詞匯入和匯出種子進行備份和恢復。
讓我們從實際的角度來看以下哪種種子更容易抄錄、閱讀、匯出以及匯入。
16進製表示的種子: 0C1E24E5917779D297E14D45F14E1A1A
助記詞表示的種子:
army van defense carry jealous true garbage claim echo media make crunch
1.5錢包最佳實踐
由於比特幣錢包技術已經成熟,出現了一些常見的行業標準,使得比特幣錢包具備廣泛互操作,易於使用,安全和靈活的特性。這些常用的標準是:
助記碼,基於BIP-39
HD錢包,基於BIP-32
多用途HD錢包結構,基於BIP-43
多幣種和多帳戶錢包,基於BIP-44
這些標準可能會隨著發展而改變或過時,但是現在它們形成了一套互鎖技術,這些技術已成為比特幣的事實上的錢包標準。
這些標準已被廣泛的軟體和硬體比特幣錢包採用,使所有這些錢包互操作。使用者可以匯出在其中一個錢包上生成的助記符,並將其匯入另一個錢包,實現恢復所有交易,金鑰和地址。
列舉支援這些標準的軟體錢包,包括(按字母順序排列)Breadwallet,Copay,Multibit HD和Mycelium。列舉支援這些標準的硬體錢包,包括(按字母順序排列)Keepkey,Ledger和Trezor。
以下部分將詳細介紹這些技術。
提示如果您正準備開發一個比特幣錢包,那麼它應該被構建為一個HD錢包,一個種子被編碼為助記詞程式碼進行備份,遵循BIP-32,BIP-39,BIP-43和BIP-44標準,下面章節有所涉獵。
1.6使用比特幣錢包
在[使用者故事]中,我們介紹了Gabriel,里約熱內盧是一個有進取心的少年,他正在經營一家簡單的網路商店,銷售比特幣品牌的T恤,咖啡杯和貼紙。
Gabriel使用Trezor比特幣硬體錢包(Trezor裝置:硬體HD錢包)來安全地管理他的比特幣。 Trezor是一個簡單的USB裝置,具有兩個按鈕,用於儲存金鑰(以HD錢包的形式)和簽署交易。 Trezor錢包遵循本章討論的所有行業標準,因此Gabriel不依賴於任何專有技術或單一供應商解決方案。
當Gabriel首次使用Trezor時,裝置從內建的硬體隨機數生成器生成助記詞和種子。 在這個初始化階段,錢包在螢幕上按順序逐個顯示單詞。
透過寫下這個助記符,Gabriel建立了一個備份(參見表1),可以在Trezor裝置丟失或損壞的情況下用於恢復。 在新的Trezor錢包,或者任一種相容的軟體和硬體錢包中,助記詞都可以用於恢復。 請注意,單詞序列很重要,因此,記憶紙備份需要對每個單詞都有空格。Gabriel必須仔細記錄每個單詞的編號,以保持正確的順序。 表1Gabriel的助記器備份
提示為了簡單起見,Gabriel的助記詞記錄中顯示了一個12個詞。 事實上,大多數硬體錢包生成更安全的24個詞的助記符。 助記詞以完全相同的方式使用,不管長度如何。
作為網店的第一次實踐,Gabriel使用他的Trezor裝置生成一個比特幣地址。 所有客戶的訂單都使用此單一地址。 我們將看到,這種方法有一些缺點,不過可以使用HD錢包進行改進。
2. 錢包技術細節
現在我們來深入瞭解被眾多比特幣錢包所使用的重要的行業標準。
2.1助記碼詞彙(BIP-39)
助記碼詞彙是英文單詞序列代表(編碼)用作種子對應所確定性錢包的隨機數。單詞的序列足以重新建立種子,並且從 種子那裡重新創造錢包以及所有私鑰。在首次建立錢包時,帶有助記碼的,執行確定性錢包的錢包的應用程式將會向使用者展示一個12至24個詞的順序。單詞的順序就是錢包的備份。它也可以被用來恢復以及重新創造應用程式相同或者相容的錢包的金鑰。助記碼詞彙可以讓使用者複製錢包更容易一些,因為相比較隨機數字順序來說,它們更容易地被閱讀和正確抄寫。
提示助記詞經常與“腦錢包”混淆。 他們不一樣。主要區別在於腦錢包由使用者選擇的單片語成,而助記符是由錢包隨機建立的,並呈現給使用者。 這個重要的區別使助記詞更加安全,因為人類猜測隨機數還是無能為力。
助記碼被定義在比特幣的改進建議39中。需要注意的是,BIP-39是助記碼標準的一個實施方案。還有一個不同的標準,使用一組不同的單詞,是由Electrum錢包使用,並且早於BIP-39。 BIP-39由Trezor硬體錢包背後的公司提出,與Electrum的實施不相容。 然而,BIP-39現在已經在數十個可互操作的實踐案例中獲得了廣泛的行業支援,應被視為事實上的行業標準。
BIP-39定義了助記符碼和種子的建立,我們在這裡描述了九個步驟。 為了清楚起見,該過程分為兩部分:
1-6步是建立助記詞,7-9步是從助記詞到種子。
2.2建立助記詞
助記詞是由錢包使用BIP-39中定義的標準化過程自動生成的。 錢包從熵源開始,增加校驗和,然後將熵對映到單詞列表:
1、建立一個128到256位的隨機序列(熵)。
2、提出SHA256雜湊前幾位(熵長/ 32),就可以創造一個隨機序列的校驗和。
3、將校驗和新增到隨機序列的末尾。
4、將序列劃分為包含11位的不同部分。
5、將每個包含11位部分的值與一個已經預先定義2048個單詞的字典做對應。
6、生成的有順序的單片語就是助記碼。
圖6展示了熵如何生成助記詞。
表2表示了熵資料的大小和助記詞的長度之間的關係。
2.3從助記詞生成種子
助記詞表示長度為128至256位的熵。 透過使用金鑰延伸函式PBKDF2,熵被用於匯出較長的(512位)種子。將所得的種子用於構建確定性錢包並得到其金鑰。
金鑰延伸函式有兩個引數:助記詞和鹽。其中鹽的目的是增加構建能夠進行暴力攻擊的查詢表的困難度。 在BIP-39標準中,鹽具有另一目的,它允許引入密碼短語(passphrase),作為保護種子的附加安全因素,我們將在BIP-39可選密碼短語章節詳細地描述。
建立助記詞之後的7-9步是:
7、PBKDF2金鑰延伸函式的第一個引數是從步驟6生成的助記符。
8、PBKDF2金鑰延伸函式的第二個引數是鹽。 由字串常數“助記詞”與可選的使用者提供的密碼字串連線組成。
9、PBKDF2使用HMAC-SHA512演算法,使用2048次雜湊來延伸助記符和鹽引數,產生一個512位的值作為其最終輸出。 這個512位的值就是種子。
圖5-7顯示了從助記詞如何生成種子
提示 金鑰延伸函式,使用2048次雜湊是一種非常有效的保護,可以防止對助記詞或密碼短語的暴力攻擊。 它使得攻擊嘗試非常昂貴(從計算的角度),需要嘗試超過幾千個密碼和助記符組合,而這樣可能產生的種子的數量是巨大的(2^512)。
表3、4和表5展示了一些助記碼的例子和它所生成的種子。
2.4 BIP-39中的可選密碼短語
BIP-39標準允許在推導種子時使用可選的密碼短語。 如果沒有使用密碼短語,助記詞是用由常量字串“助記詞”構成的鹽進行延伸,從任何給定的助記詞產生一個特定的512位種子。 如果使用密碼短語,金鑰延伸函式使用同樣的助記詞也會產生不同的種子。事實上,給予一個單一的助記詞,每一個可能的密碼短語都會導致不同的種子。 基本上沒有“錯誤”的密碼短語, 所有密碼短語都是有效的,它們都會導致不同的種子,形成一大批可能未初始化的錢包。這批錢包非常之大(2^512),使用暴力破解或隨機猜測基本不可能。
提示BIP-39中沒有“錯誤的”密碼短語。 每個密碼都會導致一些錢包,只是未使用的錢包是空的。
可選密碼短語帶來兩個重要功能:
(儲存在大腦中的)密碼短語成為第二個因素,使得助記詞不能單獨使用,避免了助記詞備份盜取後被利用。 起到掩人耳目的效果,把密碼短語指向有小額資金的錢包,分散攻擊者注意力,使其不在關注擁有大額資金的“真實”錢包。
然而,需要注意的是,使用密碼短語也會引起丟失的風險:
如果錢包所有者無行為能力或死亡,沒有人知道密碼,種子是無用的,所有儲存在錢包中的資金都將永遠丟失。相反,如果所有者將密碼短語與種子備份在相同的地方,則違反了上述第二個因素的目的。雖然密碼是非常有用的,但它們只能與仔細計劃的備份和恢復流程結合使用,考慮到所有者個人風險的可能性,應該允許其家人恢復加密資產。
2.5使用助記符程式碼
BIP-39被做成函式庫,支援多種程式語言:python-mnemonic
SatoshiLabs團隊在Python中提出了BIP-39標準的參考實現
bitcoinjs/bip39
作為流行的bitcoinJS框架的一部分,在JavaScript中實現了BIP-39
libbitcoin/mnemonic
作為流行的Libbitcoin框架的一部分,在C ++中實現了BIP-39
還有一個BIP-39生成器在獨立的網頁中實現,對於測試和實驗非常有用。圖5-8展示一個獨立的網頁,可以生成助記詞、種子和擴充套件私鑰。
BIP-39生成器可以離線使用,也可以使用這個.地址轉向到【還得科學上網。譯者注】