助記詞?密碼?區塊鏈錢包原理介紹
第一次使用像 metamask 這樣的區塊鏈錢包時,在註冊時會要我們輸入密碼,並給我們名為「助記詞」的一串英文單字。什麼是助記詞呢?區塊鏈不是認私鑰的嗎為什麼需要有密碼?所以助記詞是可以轉換成我的私鑰囉?
以上可能會有的困惑都可以從這篇文章中獲得解答,那首先我們就先從目前主流的區塊鏈錢包架構(HD wallet)開始講起!
HD Wallet:
HD wallet (Hierarchical Deterministic wallet) 的基本規則定義在 BIP-32 裡,HD wallet 以樹狀階層的架構(如下圖)來管理錢包中的公私鑰,且子私鑰是由父私鑰所推導生成的,這樣的架構具有幾項特點:
- 只需要記住最根部(seed)即可復原整棵樹:
前面提到,子私鑰是由父私鑰所推導生成的,因此只要擁有最根部的資訊,即可推導出整個錢包的完整資訊。這使得錢包在備份或轉移能更加快速,然而這樣的機制也造成安全風險,駭客在擁有部分資訊(私鑰、chain code)的情況下可以推導出更多資訊,甚至向上推導(由子推父)。
- 提供權限控管:
利用階層架構的特性來控管權限,更容易貼近應用場景。例如: 公司共用一個錢包,依部門產生子節點,部門依據計畫、功能(e.g. 付款、收款帳號)…來建立節點。
接下來回到正題,我們建立錢包產生的那串英文單字到底是怎麼來的?又代表什麼?
Mnemonic Code Words (助記詞):
助記詞的規則定義在 BIP-39 中,其目標為透過有意義的12~24 個單詞來表示128~256 位元的hex,讓這些如亂碼一般的hex 更容易被記住,且比較不會有抄錯的風險。具體轉換規則如下圖:
- 生成一n位元hex (稱為entropy)
- 以SHA-256 hash 該entropy 並取前n/32 位元作為checksum
- 將checksum 串接於entropy 之後
- 將串接完的entropy 每11 位元切分成一組
- 每組以 BIP-39 wordlists 查表轉換為一單詞
- 連接單詞即為最後結果
(值得一提的是,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的轉換規則有效提升了seed的安全性,首先,鹽(自訂密碼)提供了多一層的保護,降低資訊完全被竊取的可能,再來,PBKDF2的多次hash 能提高駭客進行暴力破解的成本。
結語:
本文主要介紹了 BIP-32與39的內容,藉由兩標準可以初步了解區塊鏈錢包的原理與架構,得知助記詞並不等於私鑰、密碼的實際用途、錢包不單單只是一把私鑰…。除了上述兩標準外,BIP-43 與 BIP-44 也是錢包的重要標準,若有興趣可以自行上網參閱~
參考資料:
Antonopoulos, A. M., & Wood, G. (2018). Mastering ethereum: building smart contracts and dapps. O’reilly Media.
非常感謝讀完本篇文章,希望本文能對你有些幫助,記得按拍手給我一些鼓勵,Medium 文章中一個人最多能按 50 下 !