什麼是分層確定性錢包(HD Wallet)| 驍哥手記

來源:柏鏈學習社公眾號
作者:litianc


1、前言


最近在看 filecoin 應用,學習 filecoin 的交易和簽名工具,第一步就是匯入 hd wallet。原以為這個出現在上古聖經《精通比特幣》書中的概念早已人人盡知,實際調研後卻發現中文技術社羣的文章大多是 bip32 的直接翻譯,或是簡單的介面使用討論,更深入的問題如:“加固派生金鑰為什麼安全?”並沒有被討論。本文記錄一下我關注的問題和理解,為希望進一步瞭解 hd wallet 原理的朋友提供一些參考。


2、hd wallet 的由來


hd wallet 是分層確定性(hierarchical deterministic)錢包的簡寫。在 hd wallet 出現之前,比特幣錢包是透過隨機數生成互不相關的多個私鑰。這種型別的錢包被稱作非確定錢包(或隨機錢包)。


在中本聰的 utxo 模型中,客戶端預設是每個比特幣地址只能用一次交易,因此錢包使用過程中需要反覆備份、匯入再使用金鑰進行簽名交易,非常不便。


為了解決非確定性錢包的私鑰管理問題,社羣成員提出了一種使用“種子”使用雜湊函式單向生成一組的私鑰的方法。並在這種思想的基礎上,增加了金鑰派生(bip32)、助記詞(bip39)、派生路徑規範(bip43/44)等功能,形成了現在統一規範的 hd wallet。


3、bip32 和它小夥伴們


bip32 是分層確定性錢包的核心改進,它基於嚴謹的密碼學演算法提出了一套先進的錢包管理方法。在 bip32 剛提出來的年代,確定性錢包有兩種主要型別:electrum 錢包和 bip32 錢包;這兩種錢包的演算法和設計接近,但最終 bip32 錢包成為了後來的標準。


bip39 是比特幣 hd wallet 規範中最貼近使用者的。只要使用過數字錢包的使用者都會對它有印象,還記得手抄的私鑰片語嗎?它透過一組易於記憶的單詞(助記詞)來生成確定性錢包的種子金鑰。


bip43 和 bip44 統一了錢包軟體對分層路徑和數字編號的理解和使用,使得了使用者用相同的助記詞在同一區塊鏈中能夠確定性地生成相同的一組金鑰。


bip39、bip43、bip44 都是相容 bip32 的協議,後來還被比特幣以外的區塊鏈所借鑑,形成了區塊鏈行業的共識。本文重點關注金鑰派生 bip32 的細節問題,其他改進協議不一一展開介紹。


4、bip32 相關疑問

第一次閱讀《精通 比特幣》時,大多數人對密碼學的知識可能還是一知半解,對於超過理解範圍的知識可能會選擇跳過或抓住結論、忽略過程。所以會得出對 hd wallet 的第一層理解:


hd 錢包就是透過 hash 演算法逐層衍生私鑰,得到用一個種子(或助記詞)管理無數多金鑰的方法。


當再次翻看這章節時,關注到專用名詞“擴充套件金鑰“,得出 hd wallet 的第二層理解:


hd 錢包有一種設計,實現了父私鑰派生子私鑰,父公鑰派生子公鑰,子私鑰和子公鑰是“一對金鑰”。


不禁提出疑問:


“父私鑰”生成“子私鑰”、“父公鑰”生成“子公鑰”,這是用某種神奇的演算法實現?還是某種協議約定?或是整個系統裡只用到一個“真-私鑰”,而“子私鑰”和“擴充套件金鑰”只是定義出來的抽象的概念而已呢?


5、確定性錢包的特點


我們說確定性錢包有兩個直觀特點:


  1. 可以透過父金鑰獲取子金鑰(包括:父私鑰獲取子私鑰、父公鑰獲取子公鑰),但反之不成立;
  2. 可以公開主公鑰,而不必擔心資金損失。

宣傳此特點的主要場景是在分層的組織中,比如公司將子私鑰交給部門,將子公鑰交給會計師和審計師,而將根私鑰交給財務主管。這種演算法帶來的近乎神奇的功能,讓許多人(包括懂技術的人)將 hd wallet 的功能神化。但這樣對分層錢包的描述存在致命的缺陷。


這一缺陷也是我對 hd wallet 的第三層理解:儘管可以安全地分發子私鑰而對父私鑰沒有風險,也可以分發主公鑰而對主私鑰沒有風險,但是不能同時進行這兩種操作。其中的風險隱藏在分層確定性錢包的演算法中,在介紹這一缺陷之前,我們先研究一下 bip32 和金鑰派生函式。


6、bip32 規範


為了更準確介紹 bip32 的定義和內涵,我建議計算機專業背景的讀者直接閱讀 bip32 規範。


bip32 規範中用了許多密碼學公式來定義 hd wallet 如何派生金鑰,對於非計算機專業的同學不太友好。我們這裡拋開密碼學的嚴謹定義和推導,用白話描述 bip32 規範。


bip32 主要介紹了三個概念:金鑰派生函式、金鑰樹和主金鑰生成。


6.1 金鑰派生函式(child key derivation function)


金鑰派生函式是一個經過特殊設計的函式,核心部分是使用訊息認證碼 hmac-sha512 (本質上是先對資料進行 hash,再進行對稱加密)。hmac-sha512 有個特點,就是當知道輸入 data 和 key 時,能夠得到輸出 i;僅知道輸出 i 和輸入 key,不能推匯出 data。


i = hmac-sha512(key, data)


父層的 i 決定分別取前 32 位和後 32 位作為拓展私鑰和加密金鑰,key 即使用加密金鑰,data 由拓展私鑰(或拓展公鑰)和數字編號 i 經過簡單的拼接得到。


然後透過嚴謹的演算法證明,得出我們先前提到的結論:父私鑰派生出子私鑰,父公鑰派生出子公鑰,子私鑰和子公鑰是一對金鑰。(參考下圖原文)




此外,區別與一般金鑰派生函式,人為設計了另一種函式“加硬”金鑰派生。這裡用數字編號 i 的首位(共 32 位)作為標識。當首位為 0,即數字編號 i < 2^31,採用一般金鑰派生函式。首位為 1,即 i >= 2^31 時,採用“加硬”金鑰派生函式。對於“加硬”金鑰派生函式,無論是獲得子私鑰還是子公鑰,都需要使用父私鑰進行派生計算,所以它失去了一般金鑰派生函式中公鑰直接派生公鑰的特性,變得不靈活了,同時也更安全了,“加硬”了。後面會介紹加硬金鑰的使用場景。




6.2、金鑰樹


由於金鑰派生關係是可以多層迭代的,因此可以使用一個金鑰多層級派生,構建出樹形金鑰層級結構。如果是普通金鑰派生關係,公鑰派生子公鑰的特性也可以逐層傳遞。當某一層的金鑰派生關係是“加硬”的,則這種傳導關係就中止了。用公式可以表示為:


n(m/a/b/c) = n(m/a/b)/c = n(m/a)/b/c = n(m)/a/b/c = m/a/b/c. 

n(m/ah/b/c) = n(m/ah/b)/c = n(m/ah)/b/c.
_h 表示加硬金鑰派生 _


6.3、主金鑰生成


前面說了金鑰的派生功能和多層級派生關係,bip32 中還初步討論了種子金鑰和主金鑰生成的方式。如上圖種子可以是任意長度的值,經過一次 hmac-sha512 計算得到主金鑰。


bip32 建議使用一個 png 檔案來處理種子資料的隨機性問題。bip32 的小夥伴們,bip39、bip43、bip44 在主金鑰生成方面做了更進一步的規範。


7、bip32 安全討論


bip32 的安全問題是著手寫這篇文章的動機之一。bip32 中一個已知的漏洞是前文提到的同時分發父公鑰和子私鑰情況下,父私鑰將處於危險之中。在 2013 年,vitalik 在 bitcoinmagazine 的部落格中已經指出這一風險,並使用程式碼進行論證。他分別對 electrum 錢包和 bip32 錢包進行測試,結果顯示,透過已知父公鑰和子私鑰,不僅可以獲得同級對其他子私鑰,還可以破解得出父私鑰。


> wp = bip32_privtopub(w)
> w0 = bip32_ckd(w,0)
> crack_bip32_privkey(wp,w0)
'xprv9s21zrqh243k2khrqvumqhz798mvw89j1ajmweknfzzv3bpagbc4th59k8zclt8rrnjvbuza72a92grm3morg2fnfaoz7b8sdtyxgubaloi'


因此,在金鑰的分級管理中,當有可能同時透露父公鑰和子私鑰的情況下,不應該使用一般金鑰派生方式,可以使用“加硬”金鑰派生方式。


防範這個漏洞,公司或組織在使用 bip32 的層級錢包時需要格外注意。對於一般使用者,不必對 hd wallet 的安全過於擔心。因為相關的約定規範了錢包的派生流程,考慮的加硬的環節,同時,個人使用場景一般不涉及子金鑰分發的問題,所以 hd wallet 錢包進行金鑰管理仍是安全的第一選擇。


8、總結


hd wallet 是當下主流數字錢包的首選。作為使用者,在不同的錢包 app 中能夠輕鬆的管理好自己的金鑰;作為開發者,它提供了一套現成的、多語言的開發工具,降低了錢包軟體的開發成本。作為想深入研究錢包原理,同時希望利用分層錢包特性設計一些創新場景的產品經理,需要注意設計時的安全考量,避免大規模使用後的金鑰洩露問題。


9、參考文獻


  1. 精通比特幣
  2. bip32. https://en.bitcoin.it/wiki/bip_0032
  3. private key recovery combination attacks… https://eprint.iacr.org/2014/848.pdf
  4. hd 錢包詳解:part 2——bip32 註解 . https://www.chainnews.com/articles/145568296316.htm
  5. .vitalik. deterministic wallets, their advantages and their understated flaws. https://bitcoinmagazine.com/articles/deterministic-wallets-advantages-flaw-1385450276
  6. 千里之堤毀於蟻穴(慎用 hd wallets). https://www.8btc.com/article/36233


免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读