金鑰、錢包與帳戶抽象化

子金鑰衍生

子金鑰衍生是每個 HD 錢包核心處的那單一步驟:拿一把父金鑰加一個索引數字,產出一把特定的子金鑰。沿著衍生路徑的各層重複它,便能得到樹中的任一地址。HD 錢包「確定性」的承諾,正是這件事——同樣的父金鑰、同樣的索引、同樣的子金鑰,每一次、每個錢包皆然。

它有兩種風味,而這個分別是整個錢包工程中最攸關安全的細節之一。非強化(普通)衍生把父金鑰的公鑰混入運算。它的超能力在於只憑公開資料即可完成:單靠一把擴展公鑰就能鋪出每一個收款地址,於是記帳伺服器或銷售點終端能在完全不碰私鑰的情況下產生全新地址。強化衍生則改把父金鑰的私鑰混入,並以 2^31 及以上的索引來標示(寫法帶一撇,如 0')。

那何苦還要用強化金鑰?因為非強化衍生有一道利刃。讓公鑰能衍生子公鑰的那同一套線性運算,意味著若攻擊者同時取得一把父擴展公鑰與哪怕只是一把非強化子私鑰,他們就能以代數方式反推回父私鑰——再從那裡拿下整棵子樹。強化衍生刻意摧毀那層關係,使一次外洩僅侷限於那一把洩漏的金鑰。因此標準會強化結構性的各層(purpose、coin、account),只留葉端的地址層為非強化,既擷取唯讀的好處,又限縮了波及範圍。

一家店鋪跑著一台唯讀伺服器,持有 m/44'/60'/0' 的 xpub。它能衍生 m/44'/60'/0'/0/0、/0/1、/0/2……,為每位顧客顯示一個獨一無二的付款地址——但由於 account 層(0')是強化的,即使那台伺服器被完全攻陷,也無法往上爬回去動用任何資金。

經驗法則:任何你可能以唯讀 xpub 分享出去的東西,都應位於某個強化邊界之下。危險的不是 xpub 本身,而是 xpub 與同一非強化分支洩漏出的子私鑰兩相結合。

又稱
CKDhardened derivation強化衍生