助記詞?密碼?區塊鏈錢包原理介紹

BIP-32、BIP-39資訊整理分享

邱奕修
Nov 1, 2022

第一次使用像 metamask 這樣的區塊鏈錢包時,在註冊時會要我們輸入密碼,並給我們名為「助記詞」的一串英文單字。什麼是助記詞呢?區塊鏈不是認私鑰的嗎為什麼需要有密碼?所以助記詞是可以轉換成我的私鑰囉?

以上可能會有的困惑都可以從這篇文章中獲得解答,那首先我們就先從目前主流的區塊鏈錢包架構(HD wallet)開始講起!

metamask註冊流程

HD Wallet:

HD wallet (Hierarchical Deterministic wallet) 的基本規則定義在 BIP-32 裡,HD wallet 以樹狀階層的架構(如下圖)來管理錢包中的公私鑰,且子私鑰是由父私鑰所推導生成的,這樣的架構具有幾項特點:

  • 只需要記住最根部(seed)即可復原整棵樹:

前面提到,子私鑰是由父私鑰所推導生成的,因此只要擁有最根部的資訊,即可推導出整個錢包的完整資訊。這使得錢包在備份或轉移能更加快速,然而這樣的機制也造成安全風險,駭客在擁有部分資訊(私鑰、chain code)的情況下可以推導出更多資訊,甚至向上推導(由子推父)。

  • 提供權限控管:

利用階層架構的特性來控管權限,更容易貼近應用場景。例如: 公司共用一個錢包,依部門產生子節點,部門依據計畫、功能(e.g. 付款、收款帳號)…來建立節點。

HD wallet 架構

接下來回到正題,我們建立錢包產生的那串英文單字到底是怎麼來的?又代表什麼?

Mnemonic Code Words (助記詞):

助記詞的規則定義在 BIP-39 中,其目標為透過有意義的12~24 個單詞來表示128~256 位元的hex,讓這些如亂碼一般的hex 更容易被記住,且比較不會有抄錯的風險。具體轉換規則如下圖:

  1. 生成一n位元hex (稱為entropy)
  2. 以SHA-256 hash 該entropy 並取前n/32 位元作為checksum
  3. 將checksum 串接於entropy 之後
  4. 將串接完的entropy 每11 位元切分成一組
  5. 每組以 BIP-39 wordlists 查表轉換為一單詞
  6. 連接單詞即為最後結果
Generating the mnemonic

(值得一提的是,BIP-39 wordlists 裡面定義了多國語言的wordlist,甚至還有繁體中文,但強烈不推薦使用非英文的wordlist)

Mnemonic to Seed:

然而,目前產生出的助記詞還不是錢包裡的任何資訊。前面介紹HD wallet時提到,錢包最重要的資訊是seed,有了seed就能產生出千千萬萬把私鑰。因此 BIP-39 定義了mnemonic(助記詞) to seed的轉換規則,其中,一直還沒用到密碼就用在這裡,將助記詞與加了”mnemonic”前綴的密碼(鹽)透過 key-stretching function PBKDF2 進行2048次hash,最終結果即為我們要的seed。

mnemonic to seed

mnemonic to seed的轉換規則有效提升了seed的安全性,首先,鹽(自訂密碼)提供了多一層的保護,降低資訊完全被竊取的可能,再來,PBKDF2的多次hash 能提高駭客進行暴力破解的成本。

結語:

本文主要介紹了 BIP-32與39的內容,藉由兩標準可以初步了解區塊鏈錢包的原理與架構,得知助記詞並不等於私鑰、密碼的實際用途、錢包不單單只是一把私鑰…。除了上述兩標準外,BIP-43BIP-44 也是錢包的重要標準,若有興趣可以自行上網參閱~

第一次讀到mnemonic to seed腦裡浮現的劇場XD

參考資料:

Antonopoulos, A. M., & Wood, G. (2018). Mastering ethereum: building smart contracts and dapps. O’reilly Media.

非常感謝讀完本篇文章,希望本文能對你有些幫助,記得按拍手給我一些鼓勵,Medium 文章中一個人最多能按 50 下 !

--

--

邱奕修
邱奕修

No responses yet