任何能猜出你助記詞背後數字的人,就擁有你的錢包。
這 12 或 24 個單詞,其實只是那個數字的可讀格式。單詞本身並不保護任何東西。真正保護錢包的,是背後的數字是否足夠隨機、足夠不可預測,讓任何人永遠無法透過枚舉的方式找到它。
硬體錢包透過安全元件或 MCU 內部的真隨機數生成器(TRNG)來解決這個問題。如果你的裝置來自可信來源,且韌體經過妥善審查,這已經是很強的答案,對大多數用戶來說,也是安全性與易用性的最佳平衡。
但有些用戶不想完全把這件事交給裝置。他們擔心硬體 TRNG 可能失效,或實作有缺陷。或者他們只是想參與這個過程,並親自驗證。
這有一個名稱:外部熵(external entropy)。你自己從物理世界生成隨機性,裝置只負責將它轉換成單詞。
問題是怎麼做。事實證明,四種常見方法並不平等。
外部熵到底是什麼
熵就是不可預測性。
助記詞之所以安全,不是因為單詞看起來亂,而是因為背後的數字太難被枚舉。真正的隨機性越多,有人暴力破解到你單詞的機會就越小。
現實世界提供了大量隨機事件。在加密錢包中,有四種反覆出現:擲硬幣、擲骰子、相機拍攝,以及直接從 BIP39 列表抽取單詞。
你不需要密碼學學位就能比較它們。你只需要問三個問題:
- 需要多少次操作? 次數越多,越容易出錯,也越容易讓人半途而廢。
- 物理結果有多隨機? 是否容易產生真實偏差?
- 能否獨立驗證? 把同樣的結果輸入第二個工具,能得到相同的單詞嗎?
記住這三個問題。我們會用它們來檢視每種方法,從你口袋裡就有的開始。
硬幣:最簡單的原理
正面是 1,反面是 0。每擲一次就是 1 個 bit。
就這麼簡單。用公平的硬幣且每次獨立:
- 12 個單詞需要 128 次;
- 24 個單詞需要 256 次。
硬幣隨處可見,結果也很容易記錄。遵循公開演算法,同樣的擲幣序列會在你的硬體錢包和任何驗證工具上產生相同的助記詞:證明過程中沒有被混入或篡改任何東西。
但你大概會想:真實的硬幣不是數學上的完美圓盤。浮雕、製造公差、磨損,會不會讓機率傾斜?
有人真的檢查過。一項針對 350,757 次人類擲幣的研究發現,硬幣落在起始面朝上的機率約為 50.8%。起始正面朝上,正面就稍佔優勢;起始反面朝上,反面就稍佔優勢。但只要隨機化起始面,整體比例就接近 50:50。
所以偏差不是真正的問題。
過程才是。 連續擲 256 次並準確記錄數百個結果,是對注意力和耐力的真正考驗。最重要的是避免漏記或錯記,並盡量保持擲幣力道大致一致。
我們的實用做法: 固定高度的表面,讓硬幣像跳水一樣從邊緣落下、充分旋轉後平穩落地。跳過任何明顯變形或磨損的硬幣。控制變數,硬幣就站得住。
但 256 次還是太多了。有更快的方法。
骰子:更平衡的物理熵源
一顆骰子大約等於 2.585 次擲硬幣。
每次 6 種結果而不是 2 種,意味著每次大約 2.585 bits 的資訊。把骰子想成升級版的硬幣。如果你兩樣都有,骰子能省下超過一半的工作。
骰子當然也有輕微偏差。氣泡、密度不均、磨損的邊角:這些都會微調機率。但外部熵從來就不要求數學完美。普通骰子的製造偏差,與攻擊者預測連續一百多次結果之間的差距,是巨大的。
Keystone 原生支援骰子:12 個單詞至少 50 次,24 個單詞至少 100 次。而且它會在你輸入時監控結果。如果任何一面超過總數的 30%,裝置會標記異常,提醒你結果明顯不平衡,並提示檢查骰子是否公平。
我們的實用建議: 選擇邊緣乾淨、製作良好的骰子,在平坦穩定的表面充分滾動。連續出現幾個相同數值是正常的。永遠不要因為結果「看起來不夠隨機」就重擲。電動骰子搖晃器有助於保持每次滾動的時間和力道一致。
五十次還是聽起來有點多。如果一張照片就能全部搞定呢?
相機:生成最快,但更依賴實作
一次拍攝。不用數、不用記。完成。
有些離線簽名裝置會從相機輸入生成助記詞:照片像素、感測器噪聲,或跨幀變化。就工作量而言,沒有其他方法能比。
問題在於:數據不等於熵。
一張空白牆的照片包含數百萬像素,幾乎全部都能互相預測。圖像「看起來複雜」並不代表它含有多少密碼學隨機性。一切取決於實作實際使用了哪些數據:最終照片?原始還是處理後的像素?連續預覽幀?拍攝瞬間的感測器噪聲?
嚴謹的相機方案必須明確回答這個問題:它收集了什麼,以及如何提取不可預測的部分。
還有第二個問題。骰子會留下你可以寫下來並重新檢查的數字序列。相機拍攝依賴轉瞬即逝的輸入,一旦使用就消失。你無法觀察它們,也無法驗證它們。你是在信任相機硬體、驅動和處理代碼。這不一定不安全,但卻悄悄逆轉了你想要外部熵的初衷:用自己的雙手從世界中提取不可預測性。
這就引出一個明顯的想法。如果驗證是難點,為什麼不直接跳過轉換?
隨機抽詞:直觀的過程
為什麼不直接抽取單詞?
反正你都要備份 12 或 24 個單詞。直接從列表中隨機抽出來,就沒有轉換的必要。
Entropia 是這個領域最知名的工具:1,024 個實體磁磚,每面印有 BIP39 單詞的前 3 到 4 個字母,兩面合起來覆蓋完整的 2,048 個單詞列表。你可以自己 3D 列印檔案,或購買現成套裝。
你抽到什麼就備份什麼。沒有轉換步驟,也沒有需要交叉檢查的輸出。
幾乎是。
最後一個單詞包含校驗和位元。它必須計算得出,不能抽取。所以這個方法實際上是「抽取 N−1 次」。
- 24 個單詞: 固定前 23 個,2,048 個單詞中恰好有 8 個是有效結尾。用離線工具計算出這 8 個,然後用類似擲硬幣的方式選一個。
- 12 個單詞: 情況更糟,最終位置有 128 個有效候選,檢查和第二次抽取都會變得繁瑣。我們完全不建議用這個方法生成 12 個單詞的助記詞。
抽取本身夠隨機嗎?只有在你的規則夠隨機,且每次都嚴格遵守的情況下才行。罐子的頂部、底部還是中間?搖多少次才算真正打亂?磁磚的哪一面算數?每次抽出的磁磚要不要放回去再抽下一個?每一個選擇都會影響結果。
可驗證性是這個方法唯一出色的地方:你直接抽出了單詞,所以沒有需要對帳的輸出。離線計算最終校驗和候選,隨機選一個,助記詞就準備好了。
但實際上:直觀是直觀,可控性卻不行。隨機性完全取決於你的混合紀律,而前期準備(列印或購買、拆分套裝、檢查重複)會堆在前面。不是我們的首選。
那麼,你該選哪個?
沒有完美的方法。只有取捨。
對大多數用戶來說,Keystone 的預設生成已經夠安全。外部熵是可選的,如果沒有控制變數就去做,反而會回到它本來要解決的問題:隨機性不足。不要把種子生成變成一種儀式。選擇你真正理解、真正信任的那一個隨機來源。
想自己提供隨機性?選骰子。容易取得、容易操作、容易驗證。
最後一件事,而且比方法更重要
你完整的擲幣序列、擲骰序列,或前 23 個單詞,都應視為敏感資訊。遠離攝影機和旁觀者操作。中間記錄不要放在手機、雲端或任何連網裝置上。驗證完成後銷毀所有中間筆記,最終助記詞只保留在紙上或金屬種子板上。
沒有留言:
張貼留言