Tech Blog
2021.06.26
Author ChihYun Chuang

2-Party BIP32:更安全的 HD-Wallet

Featured Image

Come from: Bip32

對於大多數有在使用區塊鏈交易的人,他們都會知道有一個神聖不可遺失的東西稱作:助記詞。其中的技術是利用 BIP32 所描述的一個固定性推導方式而產生私鑰。

這個概念的引入是為了配合比特幣原先的初衷:任何交易賬戶只使用一次。若是要滿足這個需求,大家需要管理非常多的私鑰,故導致管理私鑰的難題。此外,隨著各種鏈的興起,這項技術也被拿來應用在生成各種不同鏈的私鑰。

BIP32 的三種推導方式

簡單來說,BIP32 主要規範了三種類型的推導方式:

  1. From Seed to Master Private Key (之後稱主私鑰)。
  2. From Parent Private Key to Hardened Child Private Key。
  3. From Parent Public Key to Non-hardened Child Private Key。
BIP32 Diagram

以上三種推導方式的核心是使用各種不同的 input:Seed 或父私鑰或父公鑰當作 HMAC512 的輸入,生成各自對應的:主私鑰,hardened-子私鑰或 Nonhardened-子私鑰。利用第一把主私鑰,迭代的使用 hardened-子私鑰或 Nonhardened-子私鑰 的方法,便可以生成幾乎無止盡的私鑰。

Reference 參考資料

關於 HD Wallet,已經有非常多好的文章去闡釋便不一一列舉,有興趣的讀者可自行去研讀:

BIP32 不得不知的安全風險

任何東西只要誤用都可能產生問題。縱使是業界採用的標準有也是需要謹慎了解。

假設 Chain Code,公鑰,Index 都是公開資訊則:

  1. 若是 Nonhardened-子私鑰被知道,則父私鑰可被推出。
  2. 若是 hardened-子私鑰被知道,則父私鑰不會被推出。

因此對於 1 而言,若是一連串的子私鑰都是 Nonhardened-子私鑰的推導方法,很可能因為後代子孫的私鑰暴露則最初始的那一把私鑰便會被駭客順藤摸瓜得知。

因此可以簡單的小結: hardened-子私鑰使用上是相對比較安全的。

此時會自然產生一個問題,那 Nonhardened-子私鑰還有什麼存在的價值?筆者認為在實務應用場景中,使用 Nonhardened-子私鑰所算出的地址當作收款帳戶會有額外的可靠性。考慮有一個商家在區塊鏈上公開他的主私鑰所對應地址。為了收款方便,很可能對不同的客戶會給不同的收款地址。對於客戶而言,若是收款地址是從 Nonhardened-子私鑰所產生的地址,則他可以透過商家所公開的主私鑰地址,去驗證收款地址是不是正確的。而這個特性是 hardened-子私鑰所沒有的。因此若是使用 Nonhardened-子私鑰所對應的地址當作收款地址,用戶除了相信它之外。事實上,客戶也能自行運算驗證。

更多關於 BIP32 的安全分析,有興趣的讀者可以參考以下論文:

2-Party 安全計算

這個技術是當雙方各自擁有自己的秘密,雙方一起執行計算某個約定的函數,當計算完成以後,彼此不會知道對方的秘密,但是卻可以產生所預期的計算結果。

一個簡單的例子:門檻式簽名便是雙方都擁有秘密,雙方一起經過幾個回合的交互溝通以後,會產生出數位簽章的簽名。在整個過程中,可以保證:

  1. 完整的私鑰永不出現。
  2. 彼此不會知道對方的秘密是什麼。
  3. 當其中之一的秘密被偷走,事實上,小偷也沒辦法得知真正的私鑰是什麼。

2-Party BIP32 實作場景

應用這個想法在 BIP32,我們可以想像以下的場景:

Seed 到 Master Key share:

  1. 雙方各自先挑選自己的秘密 (i.e. 將會是部分的 Seed)。
  2. 利用各自的秘密一起執行產生 “Master key” 的計算。
  3. 計算完的結果,雙方各自得到 Master key 的 share (i.e. share:指的是主私鑰的碎片亦或是稱股份。需要兩個湊齊才能得到 Master key)。

並且達到:

  1. 真正的 Seed 從沒出現且沒有人知道。
  2. Master Key 也從沒出現且沒有人知道。
  3. 雙方都不會在執行完計算後知道一開始對方手中的秘密以及完成以後對方的 share。
Seed to Master Key share Diagram

Seed 到 Master Key share 簡單示意圖

Parent key share 到 Child key share:

雙方利用各自的秘密 Parent key share,一起執行產生 “child key share”。

並且達到:

  • 真正的父私鑰從沒出現且沒有人知道。
  • 主私鑰也從沒出現且沒有人知道。
  • 雙方都不會在執行完計算後知道一開始對方手中的秘密以及最後的產物 Child key share。
Parent key share to Child key share Diagram

Parent key share 到 Child key share 簡單示意圖

總結與聯繫我們

AMIS 完成並公開實作 2-Party BIP32,並整合在原本已經有的架構 HTSS。雖然只是一個初步且尚未 audit 的版本,但已經支援 BIP32 所有的推導方式。所生出的 “秘密“ 可使用在 HTSS 中所提供的 TSS-Sign 的 API 去執行 ECDSA 的簽名。

整個流程,可以達到:

  • 沒有完整的秘密出現在世界上。
  • 避免單點故障導致私鑰遺失。
  • 提供 BIP32 更豐富的權限控管。

若是有任何問題或是意見,歡迎聯絡我們或是在 GitHub 的 issue 區留言。感謝大家耐心地閱讀。

Thanks to Yu-Te Lin.

ChihYun Chuang

ChihYun Chuang

Cryptography Researcher @ AMIS

ChihYun is a cryptography researcher specializing in Multi-Party Computation (MPC) and Threshold Signature Schemes (TSS). He is dedicated to building robust and secure infrastructure for decentralized finance.

FAQ

它確保私鑰在生成與使用的整個過程中,從未在任何單一裝置上以完整形式出現,徹底杜絕單點外洩風險。

主要用於「公鑰審計」,讓第三方可以在不需要私鑰的情況下,驗證特定地址是否屬於該錢包,這在商業收款場景非常有用。