比特幣的安全性探討(下篇)魔鬼藏在細節之中
撰文|徐令予
本文的上篇指出:比特幣是由 UTXO 組成的係統,而不是“賬戶餘額”係統。每個 UTXO 像一張紙幣,它的地址就像紙幣上的序列號。錢包不存比特幣,錢包存的是私鑰。並且又解釋了地址、公鑰、私鑰之間的關係,最後還展現了比特幣從 A 轉到 B 的整個支付流程。這些內容是理解比特幣係統運作的必備知識。
然而,上篇刻意略過了幾個關鍵細節:為什麽地址不是公鑰本身?為什麽比特幣地址隻用一次?為什麽數字簽名時還需要一個隨機數?數字錢包如何管理無數個地址?但正是這些技術細節為比特幣的長治久安提供了安全保障。
下麵將圍繞這幾個核心問題作出較為深入的分析。
第一部分:公鑰為何不能直接作為地址?公鑰為何延遲公布?
在上篇中我們提到:地址不是公鑰,而是公鑰的哈希值。從用戶角度看,這讓地址變成了一串更短、更方便使用的字符串;但真正的原因並不是為了節省空間,而是為了安全。理解這一點可從兩個角度入手。
第一點:如果直接用公鑰當地址,公鑰會一直暴露。
比特幣的公鑰密碼基於橢圓曲線,其安全性依賴於:從公鑰推導私鑰幾乎不可能。在目前的算力資源環境下,這種算法是足夠安全的。然而,將來的量子計算機或者GPU集群可能會削弱橢圓曲線的算法安全。公鑰暴露次數越多、暴露越早,潛在風險就越大。
因此,比特幣采取了一種策略:收款時隻公布公鑰的哈希值(地址),公鑰未暴露。花費時才公布該地址的公鑰,而且僅公布一次。
這種做法稱為延遲公鑰暴露。它的意義在於:公鑰僅在必要時短暫暴露,暴露越少、時間越短,對未來攻擊的抵抗能力越好。而UTXO一旦花費就立即淘汰,相應的公鑰不再被使用。
第二點:為什麽地址隻用一次?
錢包每次找零都會生成新的地址,而不是複用舊的。這帶來三個好處:
因此,一次性地址並不是麻煩,而是為獲得安全與隱私雙贏的巧妙設計。
第二部分:私鑰簽名中的隨機數 K:為什麽 K 如果出問題,錢有可能被偷走?
這是有關比特幣的最難解釋,但卻是必須認真對待的安全隱患。一些交易所、私人錢包,都是因為隨機數 K 出問題而造成不可挽回的比特幣資產損失。
首先必須理解:數字簽名不是直接用私鑰對交易內容作運算。實際上,比特幣使用的 ECDSA 簽名需要一個額外參數:K (一次性隨機數)。
簽名過程大致是:私鑰、隨機數 K、交易哈希三者經過數學運算,得到數字簽名。
為什麽 K 一旦重複或可預測,私鑰就會暴露?這是 ECDSA 數學結構決定的。如果攻擊者發現兩次簽名使用了相同的 K,就可以直接計算出私鑰。曆史上真實案例包括一些比特幣庫的隨機數不安全、某些硬件錢包的硬件泄露、開發者使用固定 K 等等,引發過巨額損失。
k 的隨機性對比特幣係統特別重要。在傳統封閉係統(如銀行後台或操作係統內部)中,即使某次簽名的 k 出錯,也不一定會被攻擊者看到,因為數據並不會公開。
但比特幣係統卻完全不同。比特幣的每個簽名都會永久公開在區塊鏈上,任何人都能看到你的所有曆史簽名。攻擊者可以無限次分析這些公開數據,隻要出現一次 k 弱隨機或重複,就能立即利用數學關係推算你的私鑰。用戶自己生成簽名,沒有中心化專業機構支持,隨機數質量完全取決於用戶設備和軟件,這會構成安全隱患。
另一個常見誤解是:既然地址隻用一次,私鑰泄露又能怎樣?
其實私鑰在簽名後並不會立即失效。在交易確認之前,私鑰仍然代表著該 UTXO 的所有權。如果攻擊者在你簽名後短時間內推算出私鑰,他可以搶先構造另一筆交易,支付更高手續費,礦工就會優先打包他的交易,你的錢會被直接轉走。
因此,使用一次性地址並不能降低隨機數 K 的安全要求。K 的隨機性保護的是當下的安全,而一次性地址保護的是未來的安全,他們防範的是兩種不相同的安全隱患,
第三部分:HD 錢包的分層結構:為什麽你隻需要一組助記詞就能管理無數個比特幣的地址和相關的私鑰?
上篇提過:錢包內部會自動生成新的地址,但沒有解釋它是如何做到的。這依賴於 HD 錢包的設計。
在早期比特幣錢包係統中,一個地址對應一個獨立私鑰。如果用戶有成百上千個地址,就需要保存成百上千個私鑰,這既不方便也不安全。
HD 錢包的出現解決了這些問題,HD 錢包的英文全名是 Hierarchical Deterministic Wallet,直譯為“分層確定性錢包”。
因此,用戶隻需保存一組助記詞,就可以恢複所有過去所有的地址,不會遺漏任何一枚比特幣。這在安全性上有顯著優勢:
第四部分:比特幣係統為何安全?又為何仍然有人被盜走上百億美元?
通過上、下兩篇文章可以得出明確結論:
但為什麽仍然會發生交易所巨額失竊?原因十分簡單,真正摧毀用戶資產的是比特幣係統之外的非算法因素,它們包括:
最後的結論是:比特幣協議沒有問題,問題出在係統之外。數字貨幣的最大威脅來自設備和人,而不是數學算法。這也與我以前撰寫的《150 億美元比特幣被盜案的真相》一文中的觀點完全一致。
徐令予 於南加州(2025年11月28日)