你的助記詞到底有多難猜?ColdCard 讓黑客輕易猜中

重點總結
• 一次有缺陷的 ColdCard 韌體更新暗中從硬體隨機數生成器回退到軟體偽隨機生成器
• 這使得 Mk2/Mk3 上可能的恢復密語組合從 2^256 縮減至約 2^40(約 1.1 萬億),而 Mk4/Mk5/Q 則約為 2^72
• 攻擊者從未破解設備 — 他們只是猜測了那些不再難以猜測的恢復密語
• 正確生成的 24 個單詞 BIP-39 密語,其碰撞難度比下一秒發生伽馬射線暴造成生物大滅絕還要困難約 5×10^60 倍
• 真正的隨機數生成器基於物理噪聲,因此即使知道設備型號、序列號、開機時間和完整源代碼,攻擊者也依然一無所獲
本文旨在以淺白易懂的語言進行解說。為了便於理解,部分技術細節經過簡化或轉化為比喻,可能與底層實際運作方式有所出入。如果您需要就保障真實資產作出決定,請以官方公告為準並諮詢專業人士。
2026年7月30日,比特幣鏈上發生了一件不尋常的事:在短短15分鐘內,500個地址將大約 594.48 BTC(約合 3,800萬美元)轉入同一個地址。此後不久,其中大約 562 BTC 被轉移到另一個地址。這明顯不是正常的轉帳活動,後來證實是駭客在轉移竊得的資金。鏈上紀錄
500個來源地址 → 一個歸集地址 (~594.48 BTC / ~$38M) → 第二個地址 (~562 BTC)
隨著受害者陸續現身,一個共同點浮現了:他們全都使用了 Coldcard 硬體錢包。同一天,Coldcard 的製造商 Coinkite 發布了安全警告,其官方調查與獨立技術分析皆證實:ColdCard 錢包確實出了問題。問題出在亂數的生成方式上,這意味著攻擊者根本不需要破解 Coldcard,只需猜測使用者的復原密語(recovery phrase)就能清空資金。
那麼,這到底發生了什麼事?
整個事件在一個特定的步驟出了錯:產生復原密語。
這裡有個比喻。通常情況下,當硬體錢包產生復原密語時,就像是伸手進一個幾近無限的鑰匙庫中,隨機抽出一把交給你,而這把鑰匙能打開一個專屬於你的保險箱。但 ColdCard 的軟體有一個漏洞,導致它抽取鑰匙的範圍從整個鑰匙庫縮小到單單一個小抽屜。你只需要把那個抽屜裡的鑰匙一把一把拿來試:每打開一個保險箱,就把裡面的東西清空。
當然,這個比喻不太準確,但原理是相通的。更準確地說:ColdCard 韌體團隊發布的一個有問題的更新,導致錢包在產生復原密語時,無法呼叫較安全的硬體亂數產生器,而是改用了「偽亂數」軟體亂數產生器。它產生的「密碼」(也就是復原密語)根本不夠安全,這正是導致這起事件的原因。
看到這裡,你可能會感到好奇:為什麼我的復原密語會跟亂數扯上關係?駭客又是怎麼找到保險箱密碼的?亂數產生器到底是什麼?別急,讓我為你一一拆解。
復原密語的背後到底是什麼?
為什麼復原密語能證明資產是你的?
在深入探討復原密語的來源之前,我們需要先釐清一件事:你的資產、你的錢包與你的復原密語之間的關係。
事實上,復原密語不太像是保險箱的鑰匙。在區塊鏈的底層設計中,你的資產一直都公開放在鏈上,就像銀行裡的現金一樣。現金本身沒有印上擁有者的名字,所有人都看得到,理論上任何人都有權利對它做點什麼。但很顯然,並不是隨便什麼人都能無限期提領。那是因為在你能轉移任何東西之前,區塊鏈會要求你提供一則「證明」,證明你持有這些資產且它們屬於你,而這個「證明」就是你的復原密語。
換句話說,誰在鏈上輸入了復原密語,它所指向的資產就是誰的,即使操作的人不是你亦然,因為區塊鏈看到的只有「有人提交了有效的擁有權證明」。
某人發起轉移 → 鏈要求提供證明 → 從復原密語衍生出的簽章 → 驗證通過,資產即可移動
區塊鏈信任的是證明,而不是人。
所以,復原密語在本質上更接近房地產契據,或是帶有「特殊數字」的官方印章。印章本身很容易偽造;真正讓它防篡改的是它所攜帶的特殊「數字」,且依據設計,基本上不可能讓其他人猜到這個數字。
所以整個問題就歸結到那一串「數字」上。它是從哪裡來的?它又是如何保護你的資產安全的?
復原密語是怎麼從數字變成單字的?
我們都知道電腦是靠二進位運作的。文字、圖片、密碼,一旦進了電腦,最後都會變成一串 0 和 1。復原密語也不例外。
例如,在電腦內部它看起來可能會像這樣:
010101000010
但你可能會問:復原密語是一堆英文字母單字,而不是數字。它到底是怎麼從那一串 0 和 1 變出來的?
其實這並不複雜。我們首先準備一本「字典」,規定哪一段數字對應到哪一個單字。為了方便理解,我們先隨便湊一本只有 16 個單字的迷你字典:
接下來,我們把那串代碼切成三部分:
0101 | 0100 | 0010
然後我們拿這三個部分去字典裡查對應的單字:
0101 → squirrel
0100 → coffee
0010 → moon
就這樣,原本幾乎無法閱讀的二進位字串,變成了三個容易寫下來的單字:
squirrel coffee moon
這就是助記詞的核心原理:它並不是憑空出現的一組單字,而是一個被切割成許多小區塊的超長數字,每個區塊透過固定的單字表被翻譯成一個單字。
當然,真實的助記詞比這個例子稍微複雜一些:單字表更大、數字更長,並且還加入了校驗碼資訊。但核心邏輯並沒有改變。助記詞只是表達該串數字的另一種方式,讓人類更容易抄寫、保存與恢復。
要猜出 24 個單字到底有多難?
言歸正傳,我們終於可以談談真正的助記詞了。如今生成助記詞的標準相當多,你可以簡單把它們理解成許多不同的「字典」。以最廣泛使用的 BIP-39 為例,來談談助記詞的安全性究竟從何而來。
BIP-39 字典包含了整整 2,048 個單字,遠多於我們剛才舉例用的字典,但運作原理基本上是一樣的。它也是從一串非常長的二進位程式碼中切割出來的。具體來說,它來自一串 264 位元的字串,其中每 11 位元代表一個單字,每個單字有 2^11(也就是 2,048)種可能性,剛好對應到字典裡的 2,048 個單字。
但電腦是以二進位運作的,它所產生的亂數只能是 2 的倍數,因此無法直接生成 264 位元的亂數。我們可以做的是,先讓它生成一個 256 位元的亂數,然後把前 8 位數字移到最後面。現在我們就有了 264 位元,足以組成一組 24 個單字的助記詞。
還記得我們剛才說過的話嗎?助記詞的安全性(也就是我們的「官方印章」)來自一串特別的數字,而這個數字就是助記詞背後的亂數。我們也說過,印章之所以安全,正是因為沒有人能猜出上面是什麼數字。你顯然不可能透過猜錯數字來盜取別人的資產。那麼,要猜出這個數字有多難?這取決於亂數的長度:一個 256 位元的亂數足足有 2^256 種可能性,這意味著有 2^256 種可能的助記詞,或是 2^256 種可能的錢包地址。
這個數字究竟有多大?可觀測宇宙中的基本粒子總數通常估計約為 10^80,而 2^256 ≈ 10^77。換句話說,我們幾乎可以把一個錢包地址發給宇宙中的每一個可觀測粒子。而全人類總人口大約只有 2^33,所以每個人仍然可以分到大約 2^223 個地址,這是一個 後面帶有 67 個零的數字 1:
10,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000
所以,黑客試圖猜出你的恢復密語,就像試圖從所有地址中挑選出唯一一個有餘額的地址一樣。這難度極高。
但在這個時候,可能會有人問:電腦會不會不小心生成兩個完全相同的錢包地址?這樣一來,後生成地址的人不就可以輕而易舉地拿走第一個的人的資產了嗎?好問題,技術上這種可能性確實存在。然而,在現實世界中,這是不可能發生的。對於兩個獨立且正確生成的 24 個單詞的 BIP-39 恢復密語而言,它們完全相同的機率為 1 / 2^256 ≈ 8.6 × 10^-78。
相比之下,可靠的研究論文估計,地球在下一秒被足以引發大規模物種滅絕的伽馬射線暴擊中的機率大約是 4.4 × 10^-17。這意味著,恢復密語碰撞發生的機率比大規模滅絕事件低了大約 5 × 10^60 倍。
這讓你大概能體會到,要猜出一個恢復密語究竟有多麼困難。
那麼 ColdCard 到底錯在哪裡?
從 2^256 暴跌至 2^40
一旦你理解了助記詞背後的真正原理,就很容易明白 ColdCard 錯在哪裡。
ColdCard 團隊的一次錯誤更新導致在生成助記詞時,本應有 2^256 種可能組合的助記詞,最終縮減到僅剩 2^40 種,這是一個令人咋熱的數量級差距。你可能會問,一個 40 位元的隨機數是怎麼生出 24 個單字的?但先別糾結於此。你只需要知道,這個漏洞使得 ColdCard 生成的錢包地址被猜中的機率大幅增加。
我們需要精確指出受影響的範圍:不同型號受到的影響程度有所不同。這裡討論的大約 40 位元主要適用於 Mk2 和 Mk3,而 Mk4、Mk5 和 Q 的估計值則在大約 72 位元左右。
把兩者並排一比,答案就呼之欲出了:ColdCard 總共只能生成 1,099,511,627,776 種可能的助記詞。對駭客來說,只需一台高效能機器逐一暴力破解,就有切實的機會捲走資金。這雖然仍不是輕而易舉,但已經不再是人類現階段無法應對的規模了。
即便如此,當時情況還不算徹底崩潰。1,099,511,627,776 依然是一個相當大的數字,再加上網路延遲,駭客可能需要嘗試好幾年才能撞中一個有餘額的地址。
不幸的是,ColdCard 的失誤還意味著連生成這些可能數值的路徑都是可追溯的,這把破解難度降到了極低的水準。
為什麼軟體生成的隨機數會被猜中?
這是因為 ColdCard 用於生成助記詞的隨機數來自「軟體隨機數生成器」,嚴格來說,這類生成器全都是「偽隨機」的,其演算法是可以被追溯的。為什麼這麼說?
首先,想想隨機性到底是什麼。假設我們在擲硬幣。我們通常認為正面和反面各有 50% 的機率,而且是隨機出現的。那是因為當硬幣在空中旋轉時,它的軌跡受到各種因素影響:我們施加了多大的力、地球重力、房間裡冷氣的風向和風力、科氏力,甚至地殼運動帶來的微小震動——這些因素有些我們想得到,有些則想不透。這一切交織在一起,讓我們無法計算硬幣在空中的運行軌跡,從而無法預測結果,於是我們接受了擲硬幣是「隨機的」這一說法。
但「軟件隨機數生成器」是運行在固定的演算法之上的。一般來說,它取得少數初始條件,透過固定的演算法運行,並產生固定的隨機數。換句話說:只要我們知道那幾個初始條件,我們就會知道它將產生什麼隨機數,從而知道恢復密語會是什麼。
不巧的是,人們通常使用的初始條件是生成時的時間戳、設備開機的時間戳、設備序號等等。這意味著駭客只需要對這些數字進行合理的猜測,然後設計一個演算法來破解 ColdCard 生成的恢復密語。換句話說,駭客根本不需要盲目猜測,因為生成密語的方式本身就遵循著某種規律。
硬體隨機數生成器實際上是如何確保安全的?
這一切的根源在於,ColdCard 沒有使用「真正隨機數生成器」,也就是安全元件晶片內部的硬體隨機數生成器。正如我們上面所說,普通的軟件 PRNG 是一個確定性公式:
device ID + time + algorithm → random number
如果攻擊者能夠枚舉設備 ID 和時間,他們就可以重新計算出每一個結果。
另一方面,真正的隨機數生成器則取決於物理現象,例如:
- 電路中的熱雜訊;
- 振盪器抖動;
- 電晶體亞穩態;
- 雪崩雜訊;
- 某些設備中的量子雜訊;
- 宇宙射線引起的隨機記憶體錯誤。
等等,以此來生成恢復密語,就像擲硬幣一樣,許多干擾因素根本超出了人類的預測能力。這個過程變成了:
unpredictable physical noise → sample and digitize → condition and hash → seed a cryptographically secure PRNG → generate the recovery phrase
即使攻擊者知道設備型號、序號、開機時間和整個源代碼,他們仍然無法逆向推導出那一刻電路雜訊的確切波形。這才是真正可靠的隨機性。
Entropy(熵),隨機性的衡量標準
甚麼是 Entropy?
「Entropy」聽起來很複雜,但你可以把它簡單地理解為:在答案揭曉之前,可能出現的結果有多少種?
一枚正常的硬幣有兩種可能的結果:正面和反面。拋擲一次會產生 1 bit 的 entropy,因為 2^1 = 2。拋擲兩次就會有四種可能性:正-正、正-反、反-正和反-反,這就是 2 bits 的 entropy,因為 2^2 = 4。以此類推,拋擲 256 次就會得到 2^256 種不同的結果,這相當於 256 bits 的隨機性。
但 entropy 的關鍵不僅在於結果看起來很凌亂。更重要的是,沒有人可以在事先知道結果。如果一枚硬幣被動過手腳,導致每次拋擲都是正面朝上,那麼即使拋擲 256 次,產生的 entropy 仍然是零,因為結果從頭到尾都是可預測的。
如果連真實亂數產生器都不信任呢?
如果你連硬幣硬體錢包內置的真實亂數產生器(TRNG)也不信任,還有一個更原始的選擇:自己動手拋硬幣來製造隨機性。
將正面記錄為 0,反面記錄為 1,拋擲 256 次並記下每一個結果。這樣就會得到一個 256-bit 的二進位數字。然後,在完全離線的環境中,根據 BIP-39 標準計算該數字的校驗和(checksum),並將其轉換為 24 個英文單詞。這就是一個完整的修復詞(recovery phrase)。
flip a coin 256 times(拋硬幣 256 次)→ record heads and tails(記錄正面與反面)→ a 256-bit binary number(一個 256-bit 的二進位數字)→ compute the BIP-39 checksum(計算 BIP-39 校驗和)→ 24 recovery words(24 個修復詞)→ import into a hardware wallet(匯入硬體錢包)
這裡有一個注意事項:拋硬幣只能取代「產生亂數」的步驟。它們無法取代硬體錢包。儲存錢包、衍生地址和簽署交易等操作,仍然必須在硬體錢包的隔離環境中進行。連網裝置只能用於觀看和廣播交易,絕對不能接觸到你的修復詞。
請勿將真實的拋硬幣結果輸入到網頁中,也不要只憑感覺隨意湊出一串 0 和 1 來充當亂數。唯有當每一個結果都真正來自無法預測的拋擲時,那一串數字才具備真正的隨機性。
常見問題
沒有。設備本身並未被入侵。韌體漏洞意味著恢復密語是從一個小得多的可能值池中生成的,因此攻擊者可以通過暴力破解來猜測它們,而不是攻擊硬體。
影響因型號而異。這裡討論大約 40 位元的隨機性主要適用於 Mk2 和 Mk3;Mk4、Mk5 和 Q 的估計大約為 72 位元。具體範圍請以 Coinkite 的官方公告為準。
軟體生成器是一個輸入了時間戳或序列號等少數初始條件的固定算法,因此任何能猜出這些輸入的人都可以重新計算其輸出。硬體生成器則對不可預測的物理噪聲進行採樣,例如電路熱噪聲或振盪器抖動,這些噪聲無法從公開信息中重新計算出來。
一個 24 個單詞的 BIP-39 密語由 256 位元的隨機數支持,提供 2^256 種可能性 — 大約 10^77,接近可觀測宇宙中的基本粒子總數。
可以。將正面記為 0,反面記為 1,擲 256 次,然後在離線狀態下計算 BIP-39 校驗和並將結果轉換為 24 個單詞。擲硬幣只是替代了隨機性步驟 — 存儲錢包和簽署交易仍應在硬體錢包內進行,且結果絕不能輸入到聯網的網頁中。






