安全教育加密技術

BIP-39 / BIP-44:HD 錢包金鑰衍生簡單說

✍️ ArcSign Security Team 📅 2026年4月22日
BIP-39 / BIP-44:HD 錢包金鑰衍生簡單說

為什麼現代錢包都是 HD 錢包?

回到 2012 年以前,加密貨幣使用者每建立一個新地址,錢包就會隨機產生一組全新的私鑰。這意味著:如果你這週產生 50 個接收地址,你就有 50 把互不相關的私鑰要管理。弄丟其中一把,那個地址裡的資產就永遠鎖死。備份也是惡夢 — 每次增加地址都要重新備份整個錢包檔案。

於是 2012 年,Bitcoin 開發者 Pieter Wuille 提出了一份名為 BIP-32(Bitcoin Improvement Proposal 32)的規範,引入了「階層式確定性錢包」(Hierarchical Deterministic Wallet,HD Wallet)的概念。它的核心想法非常優雅:從一顆「種子」出發,透過數學衍生出無限多把私鑰。你只要備份那顆種子,就備份了未來所有會衍生的地址。

隔年,BIP-39(助記詞)與 BIP-44(多鏈衍生路徑)接續推出,補齊了「人類可抄寫的輸入」與「跨錢包互通的輸出」兩個缺口。這三份規範共同組成了今天所有主流錢包(MetaMask、Ledger、Trezor、Trust Wallet、ArcSign)的共同骨幹。

        核心收穫

這篇文章會帶你從 12 字助記詞,一路走到你在 Etherscan 上看到的那個 0x 開頭地址 — 讓你清楚知道中間每一步是怎麼用數學串接起來的。看完之後,你會理解為什麼「助記詞」是唯一需要小心保管的東西,以及為什麼 ArcSign 可以用同一支 USB 同時管理 BTC、ETH、BNB、Polygon 等 7 條鏈。

BIP-39:把隨機熵變成 12 字助記詞

BIP-39 處理的問題很單純:**如何把一串 128-bit 或 256-bit 的隨機亂數,變成人類可以抄寫、不容易出錯的東西?**答案是:用一個 2048 字的標準字典,把每 11 bits 對應一個英文單字。

        1
        產生熵(Entropy)

用密碼學安全的隨機數生成器(CSPRNG)產生 128 bits(12 字)或 256 bits(24 字)的隨機數。這是整個錢包唯一真正「隨機」的部分 — 熵的品質決定了錢包的安全性。

        2
        加上檢查碼(Checksum)

對熵做一次 SHA-256,取前 N/32 個 bit 當作檢查碼接在原熵後面(N 是熵長)。128-bit 熵 + 4-bit 檢查碼 = 132 bits;256-bit 熵 + 8-bit 檢查碼 = 264 bits。檢查碼讓錢包可以在你輸入助記詞時立刻偵測出抄寫錯誤。

        3
        切成 11-bit 段並對應到字典

把總 bits 切成 11-bit 一段,每段對應到 BIP-39 官方字典的一個單字。132 ÷ 11 = 12 個單字;264 ÷ 11 = 24 個單字。這就是你看到的「abandon ability able about …」。

        4
        經 PBKDF2 轉成 512-bit 種子

把助記詞字串 + 使用者選擇的 passphrase(可選,空字串也行)輸入 PBKDF2-HMAC-SHA512,迭代 2,048 次,產出一個 512-bit 的種子(seed)。這個種子是後續 BIP-32 的輸入。

        為什麼是 2048 字的字典?

因為 2048 = 211,這讓每個單字精確對應 11 bits。字典本身也經過嚴選:每個單字前 4 個字母都獨一無二(方便容錯輸入)、沒有拼寫接近的干擾字、避免低俗字眼。不同語言(英文、日文、韓文、繁中、簡中)有各自的 2048 字字典,但建議優先使用英文 — 這是跨錢包最穩的選擇。

BIP-32:一顆種子、無限金鑰

BIP-32 的核心魔術是 HMAC-SHA512:給定一個父金鑰,加上一個「索引值」,可以算出一個子金鑰。而且這個運算是單向的 — 你知道父金鑰可以輕鬆算出所有子金鑰,但從某個子金鑰反推父金鑰在計算上不可行(等同於破解 SHA-512)。

從種子到主金鑰

BIP-39 產生的 512-bit 種子,前 256 bits 當作主私鑰,後 256 bits 當作鏈碼(Chain Code)。主私鑰 + 鏈碼 = 一個「擴展私鑰」(Extended Private Key,xprv),這是整個 HD 錢包樹的根節點。

            12 字助記詞
            abandon × 11 + about

            ↓ PBKDF2-HMAC-SHA512(2048 次迭代)

            512-bit 種子
            5eb00bbddcf069084889a8ab9…

            ↓ HMAC-SHA512 with key "Bitcoin seed"

            主私鑰 + 鏈碼
            xprv9s21ZrQH143K…

子金鑰衍生(Child Key Derivation)

有了主金鑰,就可以衍生出第一層子金鑰。對父擴展私鑰 (k_par, c_par) 與索引值 i,BIP-32 定義:

            計算
            I = HMAC-SHA512(c_par, data)

            子私鑰
            k_i = (前 256 bits of I) + k_par (mod n)

            子鏈碼
            c_i = 後 256 bits of I

關鍵在於:同樣的父金鑰 + 同樣的索引值,永遠得到同樣的子金鑰 — 這就是「Deterministic(確定性)」的由來。你的助記詞產生的 HD 樹,今天在 ArcSign 上衍生、明天換一支 USB 用 Ledger 衍生、後天用 MetaMask 衍生,出來的地址一模一樣。

BIP-44:給金鑰樹一個標準化的門牌號

BIP-32 定義了「怎麼衍生」,但沒規定「要怎麼分類」。如果每個錢包自由決定哪個分支給 BTC、哪個分支給 ETH,那不同錢包之間的助記詞就無法互通 — 你從 MetaMask 匯出的助記詞,到 Trust Wallet 可能會顯示完全不同的地址。

BIP-44 解決這個問題。它規定了一個五層階層的標準路徑:

            標準路徑
            m / purpose' / coin_type' / account' / change / address_index

            範例(ETH)
            m / 44' / 60' / 0' / 0 / 0

五層路徑的意義

層級名稱範例值用途
mMaster(主金鑰)HD 樹的根節點,來自 BIP-39 種子
44’Purpose44’(硬化)固定 44’,表示「我遵循 BIP-44 規範」
coin_type’Coin Type0’(BTC)、60’(ETH)、714’(BNB)不同鏈有不同的官方編號(SLIP-44 表)
account’Account0’、1’、2’…同一條鏈下的不同「帳戶」(類似銀行分帳戶)
changeChange0 = 外部、1 = 內部(找零)比特幣用於區分收款與找零地址;ETH 通常固定 0
address_indexAddress Index0、1、2…該帳戶下遞增的地址編號

常見鏈的 coin_type 對照

SLIP-44(Satoshi Labs Improvement Proposal 44)維護了各條鏈的 coin_type 註冊表。以下是你會遇到的主要鏈:

coin_type標準路徑
Bitcoin (BTC)0’m/44'/0'/0'/0/0
Ethereum (ETH)60’m/44'/60'/0'/0/0
BNB Smart Chain714’(也常用 60’)m/44'/60'/0'/0/0
Polygon60’(EVM 相容)m/44'/60'/0'/0/0
Solana501’m/44'/501'/0'/0'
Litecoin (LTC)2’m/44'/2'/0'/0/0
        為什麼 EVM 鏈大多共用 60'?

因為 Ethereum、Polygon、BNB Chain、Arbitrum、Base、Optimism 等 EVM 相容鏈的地址格式、簽名演算法、私鑰長度完全相同。共用 coin_type 60’ 意味著:同樣的助記詞,在 Polygon、BNB Chain、Arbitrum 上都會產生同一個 0x 地址。這也是為什麼你的 MetaMask 在切換網路時,地址永遠是同一個 — 你管理的是同一把私鑰。ArcSign 在內部仍然支援依鏈分類的帳戶樹,讓你可以選擇「所有 EVM 鏈共用一把地址」或「為重要鏈單獨拆開帳戶」。

硬化衍生(Hardened):單引號背後的安全意義

你一定注意到 BIP-44 路徑裡前三層(44'60'0')都帶單引號。這個單引號代表硬化衍生(Hardened Derivation),是 BIP-32 為了防禦一種特定攻擊而設計的變體。

非硬化 vs 硬化的差別

類型索引範圍可從「父公鑰」衍生子公鑰?適用場合
非硬化 (Normal)0 ~ 231-1✓ 可以Change、Address Index 層(需要對外分享公鑰)
硬化 (Hardened)231 ~ 232-1(寫作 0’、1’…)✗ 不可Purpose、Coin Type、Account 層(安全邊界)

為什麼上層一定要硬化?

非硬化衍生有一個方便但危險的特性:如果攻擊者同時取得你的父擴展公鑰(xpub)任何一把子私鑰,他就可以反推出整顆子樹的所有子私鑰 — 甚至推回父私鑰。這被稱為 xpub leakage attack

硬化衍生徹底阻斷這個攻擊路徑:計算 HMAC 時不使用父公鑰,而是使用父私鑰。這樣一來,即使攻擊者擁有 xpub 和某個子私鑰,在硬化邊界上他們仍然推導不出父金鑰。BIP-44 將前三層(purpose、coin_type、account)全部設為硬化,為錢包的不同「用途 / 鏈 / 帳戶」建立彼此隔離的安全邊界。

        記憶訣竅

「帶引號 = 強安全邊界」。凡是你不希望被 xpub leakage 攻擊打穿的層級,都用硬化衍生。比特幣社群的共識是:purpose'/coin_type'/account' 三層一定要硬化,最後兩層(change / address_index)非硬化是為了讓看帳(Watch-only)錢包可以透過 xpub 衍生所有收款地址,而不需要持有私鑰。

ArcSign 如何實作這套規範

ArcSign 完整遵循 BIP-39 / BIP-32 / BIP-44 規範,但在三個地方做了額外強化,讓標準 HD 錢包變成「USB 冷儲存等級」的 HD 錢包:

        1
        助記詞 + .arcsign 備份雙軌並行

你建立錢包時,ArcSign 會顯示 12 字 BIP-39 助記詞讓你抄寫,同時允許你匯出 .arcsign 加密備份檔(AES-256-GCM + Argon2id,匯出即加密)。助記詞可以在任何相容錢包恢復;.arcsign 則是一鍵恢復包含所有自訂帳戶、地址簿、代幣清單、連線歷史等設定 — 抄寫助記詞解決「跨錢包互通」,.arcsign 解決「還原使用體驗」。

        2
        種子從不以完整形式留存

從 BIP-39 產生 512-bit 種子的那一刻起,ArcSign 立即用 XOR 三分片加密把種子拆成三片存回 USB。簽名時,三片在 mlock 保護的記憶體中短暫重組成完整種子、衍生出當前路徑的私鑰、完成簽名後整塊記憶體歸零。整個過程的私鑰曝露窗口控制在 1–5 毫秒。

        3
        同一顆種子,7 條鏈的私鑰

ArcSign 內建 7 條鏈的 BIP-44 路徑表(Bitcoin 主網 / 6 條主流 EVM 相容鏈)。當你在 Dashboard 切換鏈時,ArcSign 只是在背後切換衍生路徑 — 例如從 m/44'/0'/0'/0/0(BTC)切到 m/44'/60'/0'/0/0(ETH)。私鑰不需要重新生成、不需要重新備份,所有鏈的資產共用同一組 12 字助記詞。

Watch-only 地址產生:xpub 的實戰價值

BIP-32 的「擴展公鑰(xpub)」在 ArcSign 還有一個進階用途 — 你可以把某個帳戶的 xpub 匯出到手機或另一台電腦,讓它在完全沒有私鑰的情況下,只用於顯示餘額與產生新的收款地址。這就是 Watch-only 錢包的原理。因為最後兩層(change / address_index)是非硬化衍生,xpub 就足以計算所有子公鑰與地址。

用戶最常踩到的 5 個坑

        1
        以為「助記詞 + passphrase」可以事後補救

BIP-39 的 passphrase(又稱「第 25 個字」)是在種子衍生時加進 PBKDF2 的輸入。不同 passphrase 會產生完全不同的種子,也就是完全不同的錢包。如果你忘了當初設定的 passphrase,助記詞再正確都救不回來 — 因為它指向的是另一個(空)錢包。設定 passphrase 請務必另外備份它,且不要使用「猜得到的」字串。

        2
        抄寫助記詞時順序寫反或跳字

BIP-39 的字序至關重要 — 第 5 個字和第 6 個字交換就是完全不同的錢包。而且 BIP-39 的檢查碼只能驗證「整個 12 字是否構成合法助記詞」,無法告訴你「第幾字寫錯」。建議抄寫時每 3 字分組、編號(1-3、4-6、7-9、10-12),並在另一時段用另一隻筆重抄一次核對。

        3
        把 xpub 當作公開資訊隨便貼

xpub 雖然不包含私鑰,但它會暴露你的所有歷史與未來地址。有心人拿到你的 xpub,就可以追蹤你整個 HD 樹的資金流向、標記你的行為模式,甚至用於針對性釣魚。只有在「你確定要讓對方看到全部交易歷史」時才分享 xpub — 一般收款請分享單一地址即可。

        4
        以為不同鏈的地址是「獨立的錢包」

其實都是同一顆種子的不同分支。如果你的助記詞洩漏,BTC、ETH、BNB、Polygon、Arbitrum 上的所有資產會同時陷落 — 攻擊者只需要把助記詞輸入任何相容錢包,自動掃描所有 coin_type 的餘額。這也是為什麼「同一組助記詞不要同時當冷錢包和日常熱錢包」。

        5
        用線上工具「檢驗助記詞」

任何叫你把助記詞輸入到網頁、Discord Bot、Telegram Bot 的工具都是詐騙 — 合法錢包永遠不需要你把助記詞交給第三方。BIP-39 的驗證演算法完全是本地運算:如果真的要檢驗,請在離線環境下用開源工具(如 Ian Coleman 的 BIP-39 工具,斷網執行)。ArcSign 在建立錢包時會在本地即時驗證檢查碼,不需要任何線上查詢。

        延伸閱讀

想看種子如何被拆成三片存到 USB,請看 XOR 三分片加密圖解。想了解助記詞本身有哪 5 種備份方式,請看 助記詞保管終極指南。想知道整支 USB 被偷走時會發生什麼事,請看 USB 備份策略

常見問題 FAQ

Q:一組 12 字助記詞為什麼可以管理 7 條鏈的錢包?

因為 BIP-39 把 12 字助記詞轉換成一個 512-bit 的種子(seed),再透過 BIP-32 的單向 HMAC-SHA512 衍生出主金鑰。之後 BIP-44 的路徑(m/44'/coin_type'/account'/change/index)透過 coin_type 欄位為每條鏈分配獨立的子樹 — 比特幣是 0'、以太坊是 60'、BNB Chain 是 714'。同一組助記詞,可以用數學確定地衍生出數十條鏈、無限多個子地址,而且每個子地址彼此在密碼學上完全獨立。

Q:BIP-32、BIP-39、BIP-44 有什麼差別?

BIP-32 定義「從一顆種子衍生出無限子金鑰」的數學規範(Hierarchical Deterministic Wallet);BIP-39 定義「把隨機熵轉成人類可讀的 12/24 字助記詞」以及助記詞轉種子的流程;BIP-44 在 BIP-32 的基礎上規定標準化的路徑格式(m/44'/coin_type'/account'/change/index),讓不同錢包可以互通。簡單記法:BIP-39 是「輸入端」,BIP-32 是「引擎」,BIP-44 是「輸出的結構標籤」。

Q:如果我遺失 USB 但還留著 12 字助記詞,資產還能救回來嗎?

可以。因為 HD 錢包的設計就是「助記詞是唯一的真相來源」。你可以把 12 字助記詞輸入任何支援 BIP-39 / BIP-44 的相容錢包(ArcSign、Ledger、Trezor、MetaMask、Trust Wallet 等),該錢包會用同樣的數學流程還原出完全相同的主金鑰、所有子地址與餘額。ArcSign 還額外提供 .arcsign 加密備份檔,一鍵匯入就能恢復所有設定,比逐字輸入助記詞更方便。

Q:HD 錢包的私鑰真的是數學衍生出來的嗎?那它安全嗎?

是的,而且非常安全。衍生流程每一步都使用 HMAC-SHA512 這個單向函數:你從父金鑰可以輕鬆算出子金鑰,但從子金鑰反推父金鑰在計算上是不可行的(等同於破解 SHA-512)。BIP-32 還有 Hardened Derivation(硬化衍生,路徑中帶單引號的部分,例如 44')— 這種衍生方式連「公鑰 + 鏈碼」都無法推導出子金鑰,必須有私鑰才行。這是你常在路徑裡看到單引號的原因。整套規範經過超過十年、數千萬個錢包的實戰檢驗,是目前加密貨幣世界最成熟、最被信任的密鑰管理架構。