📖 本集章節目錄 (Table of Contents)
[00:00] STEPHAN: Michael,歡迎來到節目。
[00:04] MICHAEL: 嗨。很高興來到這裡。謝謝你邀請我。
[00:09] STEPHAN: Michael,覺得你是那些真正被低估或關注度不夠的大神之一。許多資深的比特幣玩家(Hardcore Bitcoiners)都認識你,但還有很多人不了解你。你要不要向大家自我介紹一下?
[00:26] MICHAEL: 沒問題。我平時比較低調,這對我來說挺好的,所以我暫時沒打算改變。簡單介紹一下背景,我曾創辦過三家獲得風險投資的公司。最著名的是我的第一家公司 thumbtack.com,上週它剛登上新聞,因為它的估值達到了 17 億美元,這真的很棒。我的下一家公司是 Y Combinator 孵化的,雖然沒有第一家那麼成功,但依然在營運。到了 2013 年,我迷上了比特幣,並開了一家比特幣公司,不過很快就倒閉了。現在回想起來,在我掌握了所有比特幣知識後,覺得當時挺尷尬的。當你對新事物感到興奮時,就會想做點什麼。那時我們以為「冷儲存即服務(Cold storage as a service)」是個絕妙的主意。但現在我要告訴大家,為什麼你們應該自己保管比特幣。我從 2013 年開始開發比特幣應用程式,曾是 pycoin 的次要貢獻者。2015 年,我寫了 BlockCypher 的區塊瀏覽器,我不確定現在還有沒有在維護,但我知道現在還是有人用它來查東西。我應該去查看一下流量數據,因為我應該還有 Google Analytics 的權限。上次看的時候,每月的頁面瀏覽量達到八位數(數千萬),這太狂了。不過我已經很多年沒有參與這個專案了。2016 年,我寫了他們的命令列錢包(command line wallet) ,這些年我也寫過不少比特幣錢包。BlockCypher 的命令列錢包純粹是寫好看的,不建議用來放真正的資產,不過它支援測試網(testnet),所以我推薦可以用來當測試網錢包。它最大的特點是程式碼行數是所有比特幣錢包中最少的。在當時它還實現了一些很酷的高級功能,在 2016 年就能做手續費偏好設定(fee preference)真的很前衛。
[02:42] STEPHAN: 那絕對是超前時代了。
[02:46] MICHAEL: 你能從中真正看到比特幣是如何運作的。現在資源豐富多了,你可以去上 Jimmy Song 的 Programming Blockchain 課程,或者 Justin Moon 的 Buidl Bootcamp。有非常多的資源教你怎麼做。但在以前,你只能去讀比特幣 Core 的程式碼(那非常難懂且冗長),或者在網路上漫無目的地摸索。所以能有資源教你如何生成比特幣地址、如何給交易簽名,這些真的很酷。
[03:23] STEPHAN: 太棒了。我知道你最近也在 Jimmy 的 Programming Bitcoin 課程擔任助教,提供技術審查和反饋。
[03:34] MICHAEL: 對,我在 Jimmy 還沒成為加密貨幣大師(如果可以用這個詞的話)之前就認識他了。2013 年我們都是 Richard Kiss 的 pycoin(Python 比特幣庫)的次要貢獻者。2014 年 2 月我們在德州比特幣大會上見面,這挺奇妙的。後來我們還一起在 Paxos 工作過。他寫的程式碼真的很優秀,作為軟體工程師,跟他合作非常愉快,他非常有天賦。有時候覺得他現在不怎麼寫程式了還挺可惜的。也不能說完全不寫,他還在教學,也會寫一些其他的東西,但他真的很有天分。看到我和他現在都沒有全職寫程式,其實有點小感傷。總之這就是我認識 Jimmy 的經過,我讀過他的第一篇部落格文章,之後的每一篇幾乎都看過。看到他現在擁有 10 萬(甚至更多)的 Twitter 追蹤者、經營 YouTube 頻道、世界各地巡迴教學比特幣,覺得太棒了。我幫他當過幾堂課的助教,但這從來不是我的事業,我是免費幫忙的。我的原則就是商務艙機票加肋眼牛排大餐,這樣我就很樂意去其他城市見見比特幣社群的人,這很有趣。我同時也是他出版的 O'Reilly 書籍的技術審稿人。
保護比特幣安全的難點 (Difficulty of securing Bitcoin)
[05:10] STEPHAN: 太棒了。那我們來進入今天的正題:硬體錢包,以及為什麼很多硬體錢包其實並不安全。當然我們後面會聊到一些緩解措施,但首先讓我們聊聊其中涉及的一些困難點。為什麼保護比特幣安全會這麼難?
[05:31] MICHAEL: 在我們開始這一集全力痛批硬體錢包之前——雖然我立場堅定地支持這個觀點,但對於大多數人來說,硬體錢包依然是最好的選擇。如果你擁有比特幣,我強烈建議你自己掌握私鑰;除非你是專家,否則你應該使用硬體錢包。如果你是專家,你應該用開源軟體和自己採購的設備來組裝你自己的硬體錢包,但那已經超出我們今天的討論範圍了。對大多數人來說,就易用性、安全性和合理價格而言,硬體錢包仍是首選。我們談論的是 100 美元左右的設備,但它們依然非常難搞。我不想把大家嚇得去使用更不安全的方案,但你必須睜大眼睛清楚知道:比特幣世界裡沒有救濟機制。沒有撤銷按鈕。如果你搞砸了,你的錢就沒了。這真的很殘忍。許多入行很久、經驗豐富的比特幣老手,都有過自己的血淚史,比如「幾年前我弄丟了……」數字可能是 0.1 個比特幣,但有很多人跑來跟我說他們丟了 100 個比特幣,我只能心疼地說:「糟糕,這太慘了。」 請善用測試網(testnet),所有操作先在測試網上做一遍。多試幾次,重置你的設備,嘗試恢復。測試網是非常棒的資源,因為它的運作機制一模一樣,只是上面的代幣一文不值,所以你可以盡情練習。請先使用硬體錢包在測試網上操作。
話說回來,你剛才的問題是:為什麼即使使用硬體錢包,儲存比特幣依然這麼難?歸根結底,你得思考搞砸這件事的機率有多大?機率其實非常低。如果只是使用普通硬體錢包,不需要任何特別技能,只要保持警惕和謹慎來發送交易,我猜失誤丟錢的機率大概在 0.01% 到 0.1% 之間。這數字非常低。如果我告訴你,你點擊 Facebook 的讚按鈕,只有 0.01% 或 0.1% 的失敗率,你根本不會去想:「我用的是什麼瀏覽器?我有驗證軟體嗎?我點按的方式對嗎?我要按住多久?」你只會直接按下去,因為那無傷大雅。而且如果讚沒點成功,你也不會在意。
但是,如果你正在轉移一筆對你極其重要的資金,也許你要離開家鄉,這是你一生的積蓄,卻發現有 0.01% 的機率會失去所有財產,這絕對是無法接受的。這把我們帶到了一個奇怪的境地:如果你跟我說,只要多付 0.01% 的交易手續費,就能保證絕對不會出事(這只是假設,現實中沒有絕對的保證)。如果真有這種保證,我大概會說:「沒問題,這筆手續費我付定了。」 如果能拿到這個保證,就算直接損失 0.01% 我也願意。但不幸的是,如果你正好碰上了那 0.01% 的不幸事件,那就是 100% 的打擊。這就是為什麼這件事如此令人恐懼。
如果你曾經做過大額電匯,比如買房,你可能會打電話給產權公司確認:「嘿,這是電匯資訊,我收到這個人的郵件,以為他是產權專員,但我還是打總機確認一下這是不是家真實公司。」 就算電匯根據不同情況可能還有挽回的餘地,你都會有那種時刻。而在比特幣的世界裡,你同樣有這種恐懼,而且它是專為儲存巨額價值而設計的,所以這種恐懼會放大。每個人在打開冷儲存進行交易簽名時,都會經歷那種極度恐懼的時刻。如果沒有,那他們可能太魯莽了。很多人當初沒有領取 Bcash 或其他分叉幣的空投,就是因為覺得「為了那 10% 的收益,我才不敢動我的冷儲存」。無論當時分叉幣價值多少,對某些人來說,承擔風險根本不值得。這真的很難。
回到你的問題,關於你必須做對的事情:這段程式碼是否如我所想地在運作?以及,我執行的到底是不是我想執行的程式碼?這兩件事都極難驗證。歷史上有太多著名的駭客攻擊和 Bug 案例,多到指不勝指。許多演講都列舉過這些例子。重點是,你必須保持謹慎和偏執,因為這真的很難。
2013 年 SecureRandom 的 Bug (SecureRandom bug in 2013)
[11:14] MICHAEL: 我最喜歡的一個例子是,2013 年 Android 在 Java 的 SecureRandom 實現中出現了一個 Bug 。顧名思義,SecureRandom 是一個用於安全獲取隨機位元資料的函數。在比特幣簽名中,你需要一個隨機組件,這是 ECDSA 簽名證明的一部分。如果那個數值是隨機的,你就永遠不需要再去理會它。你可以把它想像成一個 Nonce(只使用一次的隨機數),它只是用來證明你擁有該私鑰。但如果那個 SecureRandom 資料實際上「不隨機」,那麼其他人就能瞬間推導出你的私鑰。從任何角度來看,這都不是什麼高難度的攻擊。網路上有很多開源程式碼,只要看到你的簽名就能做到。只要他們看到交易簽名被廣播,就能立刻知道你的私鑰,這太可怕了。2013 年,許多使用 Android 錢包的人因此損失了資金。這種事情是任何人都不可能提前預防的。開發者使用了名為 SecureRandom 的官方隨機數庫,他們做了正確的事。然後突如其來地,你的錢就沒了。這就是典型的例子。雖然他們在 2013 年後修復了這個漏洞,但這反映了問題所在。
2015 年 BitGo 恢復腳本的 Bug (BitGo recovery script bug in 2015)
[12:48] MICHAEL: 還有 BitGo,這是一家聲譽非常好的公司,我並不是要針對他們說壞話。他們提供了一個恢復腳本 ,以便在他們倒閉時讓用戶能夠提取資金,這本來是非常好的舉措。腳本是開源的,他們雇用了非常聰明的軟體工程師,公司成立很久,程式碼也公開了很久。結果有人執行了那個腳本,直接丟失了 85 個比特幣 。那是 2015 年 4 月的事。值得表揚的是,BitGo 承擔了責任,自己掏腰包補償了那個人的損失。但想想看,前一秒你還在執行程式碼想著:「好,我要把錢發出去」,下一秒你卻驚呼:「我的 85 個比特幣去哪了?」,這真的太痛了。你永遠不該經歷這種時刻。飛機起降時,我們不會說:「墜機機率只有 0.1%,你大概會沒事的。」 我們有各種冗餘機制和檢查清單。這完全是兩碼事。雖然比特幣領域還沒達到那種嚴謹度(目前還是快速迭代、允許出錯的階段),但它運作得越來越好,每年都在進步。
2018 年 Electrum 的漏洞 (Electrum bug in 2018)
[14:14] STEPHAN: 有些例子是無心之過,但有些則完全是出於惡意,有駭客試圖通過各種方式入侵,誘騙你執行可能含有惡意軟體的程式碼。
[14:29] MICHAEL: 沒錯。比如 2018 年 12 月在 Electrum 上發生的事件。Electrum 是一款優秀的軟體,我很推薦它,我不是說它不好。但有人發現了一個機制,如果你運行一個 Electrum 伺服器(補充一下,我們不知道是誰在運行這些伺服器,可能很大一部分是 Chainalysis 運行的,大家最好假設連接 Electrum 伺服器時就是在連接政府的地址資料庫)。如果你使用 Electrum,強烈建議運行自己的 Electrum 伺服器,雖然這很麻煩。總之,當你連接到伺服器時,伺服器可以向你發送任何訊息。當時有惡意伺服器發送了極具欺騙性的訊息:「嗨,你的 Electrum 版本過舊,請點擊此處更新。」 而你下載的所謂更新版本,其實是偷錢的惡意 Electrum 軟體。這個漏洞 直到今天仍在以一種奇怪的方式影響著 Electrum。現在,新版的 Electrum 伺服器無法再發送那種惡意訊息了。而且為了強制用戶升級,Electrum 伺服器會拒絕連接舊版的 Electrum 客戶端,所以你必須升級你的 Electrum 客戶端,否則你只能連上那些惡意伺服器。
安全地安裝比特幣軟體 (Securely installing Bitcoin software)
參考資料: Luke Dashjr 關於如何安全安裝 Bitcoin Core 的文章: https://medium.com/@lukedashjr/how-to-securely-install-bitcoin-9bfeca7d3b2a
[16:06] STEPHAN: 我的聽眾水平各异,有初學者,也有中高級玩家。但在那個例子中,理論上大家在下載新軟體時,應該要進行 GPG 簽名驗證,對吧?大家應該驗證發行的軟體是否由已知開發者(例如 Thomas Voegtlin)的私鑰簽名。理論上,人們應該檢查更新簽名是否匹配,但實際上沒多少人會這麼做。
[16:38] MICHAEL: 沒錯。這就是私鑰管理變得極其困難的地方。對於每一件事,你可能會想:「算了,應該沒事吧,我是在 Electrum 官網下載的。」 但你真的能確定嗎?那是真正的 Electrum 官網,還是山寨網站?當時有 SSL 證書嗎?如果沒有,是不是有中間人攻擊(Man-in-the-middle)向你提供了一個惡意複製版的 Electrum 客戶端?這些都不是遙不可及的科幻攻擊。駭客有極強的經濟動機去做這件事。如果你是一個有天賦的駭客,又不是幫公司做防禦的白帽駭客,你想做黑帽駭客去偷錢,那加密貨幣絕對是最佳目標。
以前如果入侵了別人的電腦,你頂多只能給他們的朋友發垃圾郵件說:「嘿,快來買這個勞力士。」 幾乎沒人會上當,因為太明顯是垃圾郵件了。就算他們發送了幾十億封郵件,絕大多數都會被垃圾郵件過濾器攔截;剩下的一小部分人中,只有極少數會用 iTunes 禮品卡去買假勞力士。那種將惡意軟體變現的方式太艱難了。但現在,聰明的駭客會直接盯上人們的比特幣軟體。攻擊手段太多了。我可以給某人提供一個惡意比特幣錢包,讓他們完全受我控制。或者做一些更隱蔽的手腳,比如竄改顯示介面,讓用戶以為那是自己的接收地址,但實際上是攻擊者的地址。這是非常常見的攻擊。或者干擾他們的隨機數來源。雖然用戶還是在運行軟體,但沒有獲得正確的隨機性。
每一步你都必須極其小心。你絕對應該驗證所運行軟體的簽名,但這恰恰說明了這有多難。你只能提高系統安全的「機率」,永遠無法達到 100%。但當你進行比特幣交易時,往往是因為你依賴它來儲存資產,你極度渴望 100% 的安全性。
我們接下來要聊的就是「多重簽名(Multisig)」。多重簽的好處在於,如果你使用兩個不同的硬體錢包或兩種不同的設定,並且需要兩個簽名(具體門檻可以自訂,例如 3-of-5、4-of-5、2-of-3)。只要你使用超過一個簽名,攻擊者就必須同時破解這多個配置中的漏洞。你可以把一個成功率 99.9% 或 99.99% 的方案(比如 Trezor),結合另一個方案(比如 Coldcard)。多重簽名會產生疊加效應,現在駭客必須同時攻破這兩套系統。這不僅僅是難度翻倍,而是呈指數級增加。這就是我們待會要討論的——多重簽名的強大力量。
在硬體錢包上核對比特幣地址 (Checking Bitcoin addresses on the hardware wallet)
[20:27] STEPHAN: 讓我們梳理一下駭客試圖入侵的幾種常見方式。另一個例子可能是,惡意軟體讓你複製了錯誤的地址,並貼上了駭客自己的接收地址。這應該也是個典型案例。
[20:45] MICHAEL: 這個非常常見。對此,有一點非常重要:你必須永遠在最安全的地方——也就是你的硬體錢包上——核對地址。最簡單的攻擊就是誘騙你在電腦上複製貼上錯誤地址,然後直接在硬體錢包上按發送。但實際上,硬體錢包螢幕上記錄的才是你必須確認的。你應該打電話給對方,或者通過安全的管道溝通:「嘿,我要轉帳給你了。我在硬體錢包螢幕上看到的地址是這個,這是你的地址嗎?」
高明的攻擊者很聰明。他們會生成開頭幾位和結尾幾位完全相同的地址,因為人類很懶惰,習慣依賴直覺捷徑。沒人想去核對整串比特幣地址。大家往往覺得:「嗯,前 5 個字元一樣,後 5 個字元也一樣,那就是它了。」
[21:56] STEPHAN: 生成這種客製化地址(Vanity address)在計算上有多難?比如 Andreas 名下有個「1andreas」開頭的地址。生成包含特定字元的地址難度更高。如果駭客試圖利用這種心理捷徑,讓前幾位和後幾位字元匹配,你能告訴我們這對駭客來說難度增加了多少嗎?
[22:29] MICHAEL: 比特幣地址生成的底層邏輯是,背後有一個隱藏的指數(私鑰),這是一個介於 1 到 2^256 之間的龐大數字。這個數字大到難以想像,比宇宙中的原子總數還要多。如果有人能猜中這個數字,就能偷走你的比特幣,但因為數字太大了,就算算到宇宙毀滅也猜不到其中一小部分。這擁有極高的熵(Entropy)。你從私鑰開始,進行一連串操作,包括用 SHA-256 哈希兩次,用 RIPEMD-160 哈希一次。如果是早期的非原生 SegWit 地址,還會進行 Base58 編碼,加上校驗碼(Checksum),最後輸出一個看起來完全隨機的地址。
如果有人想生成像 Andreas 那樣的客製化地址,他們只需要進行海量的試錯組合。這在概念上非常類似工作量證明(Proof of Work),即嘗試大量組合,看看哪個區塊哈希開頭有一堆零。區塊哈希開頭總是有很多零,因為那是以十六進制表示的大數,前面的零就是達到比特幣難度門檻的算力證明。
客製化地址也是類似的概念,只是你不是在湊難度數值,而是在湊「能否拿到包含這幾個指定前綴或後綴的地址」。難度是字元數量的函數。每增加一個字元,難度就會呈指數級上升。這就是為什麼我們能看到「1andreas」,但看不到「1andreasantonopoulos」。我不敢說絕對不可能,因為這需要精確計算,但憑直覺來說,要湊出那麼長的指定字元幾乎是不可能的。通常我們看到的客製化地址最多大概到 9 個字元左右,再多增加一個字元成本都極其昂貴。雖然你可以把核對門檻設高一點,但最安全的還是把「整個地址」完整讀一遍。人眼容易出錯,可能會漏掉某些字元。如果攻擊者很聰明,給你的地址前 4 個字元有 3 個正確,後 4 個字元也有 3 個正確,你大概率就會上當。這真的很難防。
[25:30] STEPHAN: 這太硬核了。謝謝你的解答,因為這確實是很多人常用的簡化核對方式。
[25:39] MICHAEL: 你永遠應該假設攻擊者比你更聰明,擁有比你更多的硬體設備,因為你不是他們唯一的目標。他們是在撒網攻擊所有人。他們可能用 GPU 在批量生成客製化地址,當你看著地址想:「哇,這 8 個字元都對上了,不可能這麼巧吧」,但這可能恰恰是他們最擅長的事——利用龐大的財務誘因去湊齊這 8 個字元。
供應鏈風險 (Supply chain risk)
[26:13] STEPHAN: 這太可怕了。那供應鏈風險呢?這也是大家經常討論的一個大因素。
[26:21] MICHAEL: 供應鏈風險絕對令人毛骨悚然,因為它完全超出你的控制範圍。你可以採取一些措施來將風險降到最低。比如你說:「我只在硬體錢包公司親自出席的活動上直接向他們購買。」從該公司的員工手中接過設備,勝算肯定比在 eBay 上買二手貨要高得多(絕對不要買二手的)。這是降低風險的一種方式,但你無法得知上游供應鏈的風險。他們不是在自家地下室手工製造的,而是外包給第三方,使用現成的商業元件。上游留下了太多製造漏洞的空間。
最可怕的情境是:假設存在一個漏洞(我不是說現在一定有,但我們應該假設所有東西都已被破解),作為攻擊者,你在經濟上有強烈的動機去「等待」。讓大量的資金注入到你知道私鑰的硬體錢包 A、B 或 C 中。等到總金額積累得足夠大,比如超過 1 億美元時,就是實施「退休式攻擊」的時候了。你同時洗劫所有資金然後人間蒸發。沒有人能查出是誰幹的。晶片製造商會推卸給軟體,軟體開發商會推卸給韌體。大家互相甩鍋,真相永遠成謎。整個信任體系都會崩潰。
外面的世界很危險。我做盡了各種錫箔帽級別(極度偏執)的防護,但我依然假設自己所做的一切並非 100% 安全。我認為真正改變整個安全方程式本質的,是多重簽名。
硬體錢包支援多重簽名的好處 (Benefits of multisignature support on hardware wallets)
[28:24] STEPHAN: 一個優秀的硬體錢包應該是什麼樣子?覺得最好的切入點就是「多重簽名支援」。多重簽名究竟是如何提供幫助的?
[28:33] MICHAEL: 多重簽名剛出現時,很多應用場景集中在保護企業內部的私鑰資產和營運流程上。這意味著你可以把一把鑰匙放在家裡,一把放在辦公室,一把埋在你最喜歡地方的藏寶圖裡。如果你需要三把鑰匙中的兩把才能動用資金,那麼即使有人闖入你的家、你的辦公室,或者找到了你埋藏的寶藏,他們也拿不到你的比特幣。這是一個使用場景。
另一個場景是公司營運:假設你們公司有三個人,採用 2-of-3 模式,需要三個人中的兩個人授權才能動用資金。或者你可以透過像 BitGo 這樣的託管服務進行跨機構合作,設定 2-of-3,其中一把鑰匙由 BitGo 掌握……或者舉個更好的例子:Unchained Capital(如果我沒記錯的話,他們好像是你們讚助商)。
[29:43] STEPHAN: 對,沒錯。
[29:47] MICHAEL: 他們總部就在奧斯汀。假設 Unchained 掌握一把鑰匙,你掌握一把,另一個託管商掌握一把。在 2-of-3 的架構下,必須有兩個實體同時被駭才會出事。這確實是事實,多重簽名能為此提供保障。
但我對多重簽名真正感到興奮的是:你可以擁有**獨立的硬體和軟體技術棧**。這些簽名可以來自放在你桌上的兩個硬體錢包。但如果一個是 Trezor,另一個是 Coldcard,攻擊者現在必須同時破解這兩家公司的供應鏈。攻擊者必須同時攻破這兩家公司的軟體實現。既然這些設備存在的意義就是「不信任主機電腦」,它們就應該自己驗證一切。這對你的安全性大有裨益。
使用硬體錢包時,這是一個非常重要的思考點:我們之所以使用硬體錢包,是因為我們**預設主機電腦已經感染了惡意軟體**。這才是我們買硬體錢包的原因。如果我們認為桌上型電腦絕對安全,我們根本不需要硬體錢包。硬體錢包提供了那一層額外的防禦。抱歉,我好像有點偏離你的問題了。
[31:10] STEPHAN: 沒關係,講得很好。你剛才提到的另一個重點是「你必須把所有事情都做對」。如果只用單一硬體錢包,你必須保證每個環節都萬無一失才能獲得安全性。你能詳細聊聊多重簽名在這方面是如何提供幫助的嗎?舉例來說,假設你同時使用 Trezor 和 Coldcard,而在公司不知情的情況下,其中一個團隊的軟體或底層程式碼出現了漏洞,在 2-of-3 的機制下,用戶為什麼依然是安全的?
[31:52] MICHAEL: 這通常被稱為 $m$-of-$n$ 門檻機制。在總共 $n$ 個可能的簽名中,你需要 $m$ 個簽名。這是可以由用戶自由配置的。你可以選擇 2-of-3,這是市面上最常見的組合。你會說:「好,我有這三個硬體設備(比如一個 Trezor、一個 Coldcard 和一個 Cryptosteel 備份),我需要三者中的兩個來簽名。」嚴格來說,不是設備本身簽名,而是這些設備所持有的公鑰進行簽名。你擁有這三個設備,需要其中 2-of-3 進行簽名。
即使其中一個設備被**徹底破解**——不是那種只在極端情況下出錯的輕微漏洞,而是直接把你的私鑰發回駭客的伺服器,讓他們可以為所欲為;甚至遠端更新了設備,讓駭客能直接控制它。這是擺在你桌上的一塊完全被控制的硬體,最壞最壞的情況。但因為你的門檻是需要 2-of-3 簽名,單靠這一個設備對駭客來說根本毫無用處。他們必須同時攻破第二個設備。
發生第一種極端情況的機率已經很低了;要同時發生第二種,更是難上加難。你不太可能成為那種專門的個人目標。駭客並非精心策劃了一套不可思議的方案專門來破譯你的比特幣積蓄。他們是在對大眾進行無差別攻擊,因為最好的攻擊是那種可以在異國遠端實施、完全不需要物理接觸的攻擊。
如果有人闖入你家,因為他們拿到了一把鑰匙,還需要第二把,這對他們來說風險太高了。雖然仍有可能(所以你不該告訴別人你的比特幣放在哪,可能還需要裝警報器或準備槍支)。但這與有人說「嘿,我可以在這裡植入惡意軟體直接偷走幾千萬美元」完全是不同層級的攻擊。對於缺乏實體入侵能力或不想冒險實體作案的駭客來說,網路攻擊太有誘惑力了。這是完全不同的風險型態。
[34:31] STEPHAN: 另一個要素是,不同的硬體錢包之間是否存在某些共同的軟體底層?據你的經驗,它們大部分是獨立隔離的,還是有共同風險?
[34:43] MICHAEL: 這點其實挺嚇人的,因為代碼複製貼上的現象非常嚴重。密碼學真的很難。如果在你使用的程式語言中有一個現成的庫,你很可能會大量借用它。不幸的是,幾乎所有的硬體錢包都是用 Python 和 MicroPython 寫成的。這並不理想,但我認為這是次要問題。
同樣地,你可以追求極致安全的系統,用三種不同的語言編寫。我生成的每一個接收地址,都會用兩種不同的程式語言進行驗證。我只是不想對自己是否擁有該地址的私鑰產生任何懷疑。但這種做法可能很不主流。我希望有一天能有足夠多的硬體錢包,你可以直接選擇「嘿,我要一個用兩種不同語言開發的組合」,並且依然有五種優質產品可選。但很遺憾,我們現在還沒生活在那樣的世界裡。
[35:48] STEPHAN: 關於軟體和硬體之間的互動,據我了解,很可能軟體層面沒問題,但硬體層面出了差錯。硬體並沒有執行你以為它在做的事。你以為自己在軟體層很安全,但實際上在硬體層就被攻破了。也有這種情境對吧?
[36:20] MICHAEL: 對,這是非常棘手的問題之一。如果軟體編寫具備防禦性,那麼每個模組都不會盲目信任其他模組。例如,早期我們習慣直接信任 `/dev/random`(電腦上的隨機數源)來獲取隨機性。這本該是 SecureRandom 在做的事。後來我們學到,可以在簽名中使用決定性的 $k$ 值(Deterministic $k$-values),它們看起來是隨機的,但並不依賴隨機數生成器。例如在簽名時,你可以編寫軟體來規避硬體隨機數生成器劣質的風險。
在簽名時是這樣。但在生成私鑰時,你必須有隨機性來源。現在有些硬體錢包具備很酷的功能,允許你自己輸入隨機性,因為隨機性具有疊加性。你可以對位元進行 XOR(異或)操作,將自訂隨機性疊加到隨機數生成器上,這百利而無一害。
在我那個很短的 bcwallet(BlockCypher 命令列錢包,再強調一次不建議實際資金使用,僅供學習)中,我會要求用戶在鍵盤上亂敲。因為我假設電腦的隨機數生成器已被破解,所以讓用戶敲擊鍵盤提供額外的熵。我把用戶提供的隨機性與硬體隨機性結合起來,這樣即使硬體糟糕,軟體也能進行彌補。
理論上可以採用很多聰明的技巧。另一個常見的做法(據我所知 Coldcard 支援)是擲骰子。你甚至可以確定性地做這件事,雖然你需要擲很多次骰子,這很累也很麻煩。但如果你要接收大量比特幣,花幾塊錢買幾個骰子坐在那裡擲,這是另一個聰明的作法。
硬體與軟體互動的方式多不勝數。甚至硬體內部的硬體之間也是如此,硬體錢包裡可能有一個微控制器(MCU)和一個安全晶片(Secure Element)。如果你的 MCU 可以直接指揮安全晶片做事,那麼安全晶片其實沒有提供任何額外安全性,因為不安全的微控制器可以控制它。這就像一個無底洞,越挖越深。
再次強調,解決方案就是**來自兩個不同設備的兩個簽名**。為了說明這種疊加好處:假設我持有巨額比特幣,但我不想處理多重簽名的複雜性(不想多保管一份備份、不想記住它、不想交代家人如果我出事該去哪裡找),我只是想確保軟體正常運作,那我會選擇 2-of-2 模式。
對於第二個簽名,我可以使用一個並不怎麼安全的金鑰。我可以把它放在桌上,貼個大標籤寫著「2-of-2 密鑰在此」。它可以是一個沒有密碼(Passphrase)的助記詞。甚至可以是短長度的助記詞(不過最好還是用完整的 24 字)。我可以複製很多份,家裡放一份、公司放一份、家人那放一份、保險箱放一份,因為這只是 2-of-2 中的其中一把鑰匙。除了我的第一把核心簽名外,我用這把鑰匙來做第二個簽名。
儘管大家會說:「嘿,這太不安全了,明文放在桌上,完全沒好好保管」,但**在 2-of-2 中增加第二個不安全的簽名,比單簽名 1-of-1 更加安全**。如果你把你誓死守護的 1-of-1 設定,加上第二個看起來不安全的簽名,你反而提升了整體安全性,這是一個非常違背直覺的事情。想著「我要做一個很不安全的行為,結果卻增加了安全性」。我不是鼓勵大家不重視安全,但如果你對多重簽名猶豫不決,哪怕增加一個看似不嚴謹的多重簽名,你的狀況都會變好,因為攻擊者現在必須同時攻破兩個獨立的系統。
物理隔離 / 空氣隔離 (Air gaps)
[41:24] STEPHAN: 另一個話題是空氣隔離(Air gapping)。實現這一點有不同的方法。我知道 Coldcard 提供了 MicroSD 卡的選項,基本上可以用它在連線電腦和硬體設備之間傳輸未簽名或已簽名的交易。你能聊聊空氣隔離的概念嗎?為什麼它很重要?它有什麼幫助?
[41:52] MICHAEL: 當設備連接到網際網路時,我們稱之為「熱機器(Hot machine)」。當斷開網路連線時,我們稱之為「冷機器(Cold machine)」。你的筆記型電腦可能介於兩者之間,因為它大部分時間連網,但很容易拔掉網線。
熱機器非常危險,因為它的軟體可能會自動接收更新。假設攻擊者攻破了該服務的某個分發系統。想像一下,硬體錢包或軟體錢包公司的離職員工攻破了他們的 GitHub 帳號或發布管道,發布了受污染的軟體(這是完全做得到的)。然後他們可以推卸說:「天啊,是第三方幹的,跟我沒關係。」 如果他們做到這一點,而你的電腦正好連著網,自動下載並安裝了更新,你基本上什麼都沒做就被攻破了。
空氣隔離是第一道也是最重要的一道防線。你必須使用良好的空氣隔離,因為如果你的電腦是永久隔離的(從不連網、放在家裡、只安裝過一次軟體)。在那唯一一次安裝時,你用最好的方式(例如 PGP 簽名驗證,或者先在乾淨機器上下載)進行了驗證,那麼未來他們的軟體供應鏈發生什麼事都不重要了,因為你的機器壓根沒連網。空氣隔離非常強大。
核反應爐採用空氣隔離是有原因的。他們不希望有人點擊郵件附件安裝了病毒從而干擾核反應爐。大家都喜歡這種系統,但即使是空氣隔離也有漏洞。最著名的攻擊是 2010 年美軍發動的 Stuxnet(震網病毒),用來癱瘓伊朗的核反應爐。這簡直就像詹姆斯龐德電影裡的情節。他們把惡意軟體裝進數百萬個 USB 隨身碟裡,連接到普通電腦時什麼都不做,所以沒人注意到;但當它連接到特定系統(已知運行該核設施硬體和軟體的電腦)時,就會釋放惡意軟體。這據信讓伊朗的核計畫大幅倒退。成功了,他們用 USB 隨身碟跨越了空氣隔離。
如果這種技術已經存在,政府能做到,那麼個人攻擊者也能製造出能跨越空氣隔離的 USB 隨身碟。Coldcard 的 SD 卡空氣隔離是目前市面上能買到最好的現成空氣隔離產品。我玩過一些即將上市的新硬體錢包原型,他們使用 QR Code 進行空氣隔離,我迫不及待想等這些公司推出了,因為太棒了(譯注:2026年有提供QR Code 進行空氣隔離的硬體錢包已經非常多)。目前如果你想要適當的 QR Code 空氣隔離,幾乎只能用 Electrum 或者自己組裝。那不是很理想,你得把筆電倒過來去掃另一台筆電上的 QR Code。介面不夠友善,但 QR Code 極難被遠端用溢位漏洞攻擊;相比之下,SD 卡雖然機率極低,但理論上仍有可能。
最糟的就是直接把硬體錢包插進熱機器裡。再次強調,我們預設熱機器已被惡意軟體感染。這正是我們使用硬體錢包的原因。我們不是為了它好看的螢幕、按鍵或慢吞吞的處理器而用它,我們用它是因為它是隔離的,結果我們卻把它直接插進被感染的機器裡。目前的常見做法並不理想。QR Code 很棒,SD 卡也不錯。
如果這是你唯一的簽名來源,我會非常不安。但如果你有多重簽名,其中一個採用這種方式,我可以理解其價值。進行空氣隔離時要記住一點:你可以把主機電腦當作「完全被惡意軟體感染」來處理。這沒關係,因為空氣隔離設計初衷就是安全隔離。如果你透過 QR Code 將資料從受感染的機器傳輸到隔離的硬體錢包,其實沒有太大危險。它無法對你的離線機器做什麼。
當然你不該留著一台有惡意軟體的電腦,但我們可能多少都有。因此,如果你能把安全防護集中在空氣隔離的私鑰管理方案上(無論是硬體錢包還是自建方案),把所有防禦精力放在那裡,其餘部分就可以相對隨意一點。這是很好的「易用性與安全性」的權衡。你要集中精力保護最安全的核心,不需要太糾結熱機器或是否點錯了郵件連結(當然最好別點,但萬一點了,你的私鑰依然離線)。
PSBT 部分簽名比特幣交易 (PSBT BIP 174)
參考資料: BIP 174 規範: https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki
[48:17] STEPHAN: 聊到這個話題,我們必須提到 PSBT(Partially Signed Bitcoin Transactions,部分簽名比特幣交易)。Michael,能告訴我們為什麼這很關鍵,PSBT 對我們有什麼幫助嗎?
[48:31] MICHAEL: PSBT 也被稱為 BIP 174,它只是一種傳輸未簽名比特幣交易的標準化方式。表面上看它沒什麼令人興奮的,它只是一個編碼格式,標準化了「這是一個 2-of-3 交易」、「這是尋找此地址的推導路徑(Derivation path)」等資訊的傳遞方式。
硬體錢包通常不儲存真實數據,它們是無狀態(Stateless)的。你可能有一個種子(Seed),所有的私鑰都從中推導出來,但要找到對應的私鑰其實很難,因為一個種子可以生成幾十億個密鑰。如果我想找到與某個 UTXO 交易的密鑰,我不想把每一種組合都試一遍,我想知道該在樹狀結構的哪個路徑下尋找。
PSBT 或 BIP 174 的諸多好處之一,就是提供了一套標準指令:「嘿,使用你的擴充公鑰(xpub),這是找到你私鑰的推導路徑。」現在你有了一個可以推導私鑰的種子,順著路徑就能極快地推導出私鑰(大概只需要 50 到 100 毫秒)。
你的主機電腦(再次強調,可能已被惡意軟體感染)將這些指令發送給硬體錢包進行驗證:「是的,我在那裡有一個地址;是的,交易結構是這樣;是的,這個格式合規;這是手續費;這個找零地址屬於我;我可以計算輸入、輸出和找零的總和,算出我花了多少錢。」它可以非常直觀地展現給用戶。
我們常把比特幣交易簡化為「我發送 1 個比特幣給你」,但實際上可能包含 10 個輸入和 2 個輸出。作為人類,你很難在大腦裡快速計算「輸出總和減去輸入總和是多少?哪些是我控制的,哪些不是?」 如果有一個標準格式將這些資訊轉達給硬體錢包,讓硬體錢包能夠無信任地理解和驗證,硬體錢包就能直接顯示:「嘿,這是要簽名的交易,發送 1 個比特幣到地址 A。」你只需要確認地址 A 確實是對方的,這很容易,然後按下確認即可。
無論門檻是 2-of-2、2-of-3 還是 2-of-5,它都能顯示:「嘿,這是 2-of-5,你是其中之一。」不過這裡有一個小缺陷(希望未來能改進):存在一種新型攻擊。假設是 2-of-2 模式,我打開硬體錢包,顯示「需要兩個密鑰,你是其中之一」。我怎麼知道另一個密鑰是誰的?風險在於,另一個密鑰其實是攻擊者的。
我把資金發送到一個 2-of-2 地址,我擁有一把鑰匙,但攻擊者也有一把。雖然目前還沒聽說現實中有這種案例。當攻擊者在區塊鏈上看到這筆交易時,他們會說:「哈哈,你的錢被我綁架了。如果你想拿回資金,我很慷慨,跟你五五分」或者其他博弈論下的勒索方案。這會是很可怕的事。
有些錢包在這方面做得比較好,Trezor 會顯示「嘿,這是 2-of-2,你擁有其中一個」。Ledger 則直接顯示「祝你好運,請信任你那被感染的電腦」。這簡直瘋了,我真心希望他們修復這個問題,他們目前的立場非常愚蠢。多重簽名確實帶來了這一個新的潛在負面因素,但未來 UI 會改進,你可以驗證那是否真的是你的密鑰。(譯注:文章中提到 Ledger 當時「祝你好運,請信任你那被感染的電腦」的愚蠢立場,早已在幾年前透過韌體升級與比特幣 App v2 升級被修復。只要使用者有落實在 Ledger 螢幕上核對並註冊多簽錢包的步驟,這類勒索/綁架攻擊在硬體層面上就無法成立。)
[53:20] STEPHAN: 正如你所說,你應該使用硬體設備上顯示的地址,而不是電腦上顯示的。目前的困難之一是,早期的硬體錢包螢幕非常小,不一定有足夠的空間顯示所有細節。希望隨著新錢包和新產品……我知道 Crypto Advance 的 Stepan Snigirev(我之前的來賓之一)談過這個想法,即擁有更大的螢幕,可以顯示所有細節:「這些輸入、這些輸出、2-of-2 結構」。所有細節一目了然,讓用戶在簽名設備上記錄下到底簽署了什麼。
[54:12] MICHAEL: 對,我對一些新產品感到興奮。我看過他們的一些原型,Stepan 非常聰明。你跟他錄的那集很精彩。他做過一些關於硬體錢包漏洞的優秀演講,我非常推薦,之前也推特轉發過,我們可以放在節目連結裡。
你需要一個足夠大的螢幕來進行驗證。現實是,你不需要巨大的螢幕來做交易驗證,只要能清晰顯示「發送 1 個比特幣到地址 X,手續費為 Y」就夠了。如果你提供了足夠的資訊(PSBT 就是一個向硬體錢包提供資訊的好格式),硬體錢包就能驗證其餘的一切。
可驗證的資訊量其實很微妙。例如,如果你簽署的是 SegWit 交易,你會對輸入值進行簽名。你可以驗證輸入和所有輸出都在交易中,從而驗證手續費。但如果你簽署的是非 SegWit(Pre-SegWit)交易,驗證輸入值的唯一方法就是在區塊鏈上查詢它們。有些錢包會提供證明說:「這是你正在簽名的內容。」有些錢包則會覺得這太難了,因為資料量太大。
想像一下,你簽署的輸入恰好是一個挖礦區塊獎勵(Coinbase transaction)的輸出。那個交易給礦池發放收益,包含了 1,000 個接收者。我們必須向你展示這 1,000 個接收者的交易,才能向你證明你正在簽署的前一個輸出是什麼。這變得極不切實際。結論就是:「如果你要用硬體錢包,你應該使用 SegWit 錢包,因為那更好。」
因為 SegWit 在 BIP 143 中改變了序列化格式,使得你簽署的輸入同時包含了簽名內容和其數值的冗餘副本。硬體錢包可以檢查並確認:「嘿,我簽署的這個輸入裡有多少比特幣?」否則網路會拒絕它。SegWit 裡有很多聰明的設計是大多數人不知道的,因為之前的行銷太扭曲了(以為只是 Roger Ver 宣傳的那樣)。他們不知道 SegWit 修復了交易可變性(Transaction malleability),允許硬體錢包更精確地簽署輸入,而且它還相當於一次區塊擴容。
扯遠了,重點是,你希望硬體錢包盡可能驗證所有能驗證的東西。螢幕能提供一部分幫助,但很多細節隱藏在實現過程裡。如果錢包不驗證找零地址是你的還是攻擊者的,螢幕再大也沒用,你根本不知道發生了什麼。如果不驗證輸入和輸出,你就不知道手續費是多少。魔鬼都在細節裡,老實說,沒有哪一款錢包做到完美。**兩個錢包就是你的答案**,因為這樣攻擊者就必須同時欺騙它們兩個。即使其中一個沒做到完美,另一個希望不會有完全相同的漏洞。
助記詞與密碼短語 (Mnemonics and passphrases)
[57:49] STEPHAN: 我們來聊聊助記詞和密碼短語(Passphrases)。用戶在初始化錢包時,會寫下 24 個單字的種子。也許他們會設定一個密碼短語,設備可能還有 PIN 碼。用戶可能面臨的困難是,如果需要恢復錢包,顯然不想把種子輸入到連網且可能帶有惡意軟體的電腦上。對此你有什麼建議?怎樣才是良好的做法?
[58:30] MICHAEL: 你的助記詞就是你的比特幣。擁有比特幣意味著擁有控制至少一個 UTXO 的私鑰,而助記詞讓我們能擁有一個分層確定性錢包(HD Wallet),從而管理海量的私鑰。在 HD 錢包出現前,我們使用「金鑰池(Key pools)」,那簡直是災難。金鑰池就像是:「我先生成 100 個地址和 100 個私鑰,做好備份,然後用它們交易。隨著交易增加,我再生成更多地址。」問題是,如果我在第一天創建了 100 個地址並做了加密備份,存放在保險箱、交給律師和家人,然後我進行了第 101 次交易。現在我的備份就過期了,我必須重新做一次備份。
解決方案就是 HD 錢包,這太棒了,現在每個錢包都應該是 HD 錢包。但問題是,我該如何記住我的主私鑰(xpriv)?它太長了,有 512 位元,你不可能記住。但 24 個單字的助記詞可以確定性地映射到你的主私鑰,這是可以背下來的。我們現在幾乎所有錢包使用的核心就是助記詞。通常是 24 個單字(雖然也可以更短,但除非你非常專業,否則別考慮更短的選項,堅持標準長度)。
有了這 24 個單字後,你可以選擇性地加上第 25 個單字——密碼短語(Passphrase)。這個密碼短語最酷的地方在於它賦予了你「合理的推諉性(Plausible deniability)」。如果有人用槍指著你的頭說:「快輸入密碼」,你可以輸入 `12345`,裡面有 1 個比特幣,劫匪拿走錢就跑了。但如果你輸入 `678910`,裡面其實有 10 個比特幣,你可以設定另一個密碼,甚至多個密碼。這是個很巧妙的功能,實現方式也很聰明。
不過覺得這有點太「詹姆斯龐德」化了。現實中最經典的攻擊是「5 美元扳手攻擊」——有人拿扳手抽你直到你吐出密碼為止。如果你想靠這種偽裝方案硬扛攻擊,祝你好運。我忘了是哪位名拳手說過:「每個人都有一個計畫,直到臉上挨了一拳。」
[01:01:21] STEPHAN: 麥克·泰森(Mike Tyson)。
[01:01:25] MICHAEL: 對,泰森說的。密碼短語是個好東西。它的核心價值在於保護你免受劣質硬體或軟體的害處。想像一下,如果你的安全晶片(在某些情況下由 PIN 碼保護)儲存了你的密碼短語,這是一種機制。另一種機制是像 Trezor 那樣沒有安全晶片,其設計初衷就是「不儲存密碼短語」。如果攻擊者拿到你的 Trezor 實體,他們依然需要手動輸入你的密碼短語。這非常巧妙。
這相當於雙重驗證:你需要你擁有的東西(Trezor)和你所知道的東西(Passphrase)。為了提升安全性,我非常推薦使用密碼短語。但那個「偽裝資金」的功能,噱頭大於實用。你應該牢記一個密碼短語,而不是記 10 個不同的……
[01:02:46] STEPHAN: 誘餌金額。
[01:02:50] MICHAEL: 對,否則你大概率只會自己忘掉。
[01:02:54] STEPHAN: 這又是安全性和易用性的權衡。你設定的獨立密碼短語越多,你需要備份的東西就越多。你的家人必須知道這些,而且得區分哪個是誘餌、哪個是真的。你可能有多套配置,複雜度呈指數級上升。
[01:03:19] MICHAEL: 俗話說,複雜是安全的天敵。我最初非常排斥多重簽名,因為它增加了複雜度,我不喜歡複雜。如果你用一個應用程式存放微不足道的比特幣,你可能會說:「就算有 0.01% 的機率丟錢我也無所謂,因為我只是用來做日常頻繁交易。」但現實是,比特幣主要被用來儲存價值,裡面的金額對你很重要。對於安全的冷儲存,你確實需要多重簽名。
過去多重簽名的另一個缺點是需要兩個簽名,這大幅增加了交易的位元組體積,而礦工是按位元組收取手續費的。多重簽名的交易手續費更高,這是系統現實帶來的遺憾代價。但有了 SegWit 後,我們獲得了「見證折扣(Witness discount)」。見證(簽名資料)在礦工計算是否打包交易時獲得了折扣。這背後的原理與運行全節點的激勵有關。現在,只要你使用支援 SegWit 的錢包,你就可以享受多重簽名,而不需要支付更高昂的手續費。
測試備份 (Testing backups)
[01:05:03] STEPHAN: 我們聊到了助記詞和密碼短語。用戶經常想做的一件事是測試備份。他們想假裝「我的 Trezor 丟了,Coldcard 也丟了,我能否用 24 個單字和密碼短語恢復?」 但難點在於,我不希望把這 24 個單字輸入到電腦上,因為可能有惡意軟體偷走它。你有什麼建議嗎?
[01:05:39] MICHAEL: 我會建議,在進行任何真實交易前,先在硬體錢包上使用**測試網(testnet)**進行演練。「嘿,這台電腦可能完全被惡意軟體感染了,如果有人偷走了我的免費測試網代幣,算他們厲害,我也就知道我的系統不安全了,而且我毫無損失。」你可以進行演練,完全不用擔心私鑰洩漏。
因為如果是真金白銀,你每做一步都會反覆確認:「我做對了嗎?是這個步驟嗎?為什麼問我這個?這句話是什麼意思?」 但如果是在測試網上,用著毫無價值的代幣,你可以操作得非常快。你可以嘗試四次不同的方法:「如果我輸入不同的密碼短語會怎樣?這裡為什麼有通知?現在來試試多重簽名吧。」在測試網上盡情嘗試,沒有任何成本。
對於大多數沒有安全晶片的設備(比如 Trezor),直接重置設備非常簡單。生成一個助記詞,故意不安全地記錄下來(存放在 iPhone、Android 或雲端都可以,因為只用來放測試代幣)。重置設備,發送一些測試幣給自己,看看能否恢復設備,更改密碼短語看看會發生什麼,一遍又一遍地測試。嘗試多重簽名,在測試網上盡情實驗。
覺得目前業界對測試網的支援太少了,這非常遺憾,因為它是極其寶貴的資源。過去比特幣手續費上漲時,有人說這對比特幣的推廣很不利,因為大家習慣直接在主網上操作,根本不在乎手續費。他們用比特幣做一些不需要抗審查的事情,純粹是因為簡單好用。當他們剩下一些比特幣時,就慢慢習慣了。最經典的故事就是,他們在絲路(Silk Road)上買東西,剩下一些找零:「這挺有趣的,怎麼運作的?」 但其實,你完全可以在測試網上獲得一模一樣的體驗——發送交易、瞭解運作原理、試錯破壞。等你到了主網,你根本不需要做頻繁交易去擔心手續費,因為你已經在測試網上免費做過 20 次演練了,主網上你只需要做一次正式交易。去玩測試網吧,它絕對是你的好幫手。
查詢第三方服務 (Querying a third party service)
[01:08:48] STEPHAN: 接下來聊聊「我們是否在向第三方服務發送查詢請求」。常見的例子:假設我使用標準的 Trezor 軟體,現在 Trezor 公司就知道我的 xpub(主公鑰)了。如果我使用標準的 Ledger 介面,也是一樣,Ledger 會知道我的餘額等資訊。據我所知,解決這個問題主要有兩種思路:使用 Electrum Personal Server(或 ElectrumX、Rust 寫的 Electrs);另一種是 Bitcoin Core 搭配硬體錢包介面(HWI)。你能聊聊這兩者及其好處嗎?
[01:09:32] MICHAEL: 這涉及個人隱私,也涉及安全問題——「這個 IP 地址擁有大量比特幣」,相當於在自己背上畫了個靶子。此外還有技術細節:如果錢包將擴充公鑰(xpub)發送給官方伺服器,不僅可以用來生成你的所有地址(對隱私極其不利),而且還有一個已知風險。
我不想稱之為漏洞,因為這是系統設計的一部分:如果我擁有的 xpub,再加上你的任意一個子私鑰,我就能推導出該 xpub 下的**所有子私鑰**。這聽起來沒那麼可怕,因為第三方怎麼會拿到你的子私鑰呢?但你可以想像這種情境:有人說「嘿,你的硬體錢包出問題了嗎?我幫你診斷。去硬體錢包高級設定裡,導出一個已花費地址的私鑰。別擔心,資金已經花掉了,沒風險。或者生成一個新私鑰給我。」這就足夠讓你破產了。
這些第三方服務可怕的地方在於,你拿著 xpub 去查詢硬體錢包數據,我假設他們會留存這些資料。也許他們的商業模式就是把數據賣給 Chainalysis。甚至可能有人在中間攔截這些資訊。你的 xpub 可能已經洩漏了。此時如果再洩漏一個子私鑰(雖然不該發生,但萬一發生了),你所有的資金都會面臨風險。這就是為什麼不應該查詢第三方服務的原因,它兼具隱私和安全風險。
你提到的兩個解決方案是 Bitcoin Core 和 Electrum。關於 Electrum,預設情況下,最大的兩家 Electrum 伺服器營運商是 Chainalysis(至少離職員工是這麼說的,如果他們不運行才奇怪,因為這樣就能以極低成本去去匿名化海量的比特幣流量,如果不做就是失職)以及 Bread Wallet(它作為 SPV 客戶端,過去運行了大量伺服器)。你不需要註冊帳號,系統就能運作,就是因為別人在背後運行伺服器。這太可怕了,你直接把隱私交給了雲端的陌生人。
你可以自己運行 Electrum 伺服器,可以是為了造福大眾,也可以只供自己私密連接,但這非常麻煩。你得運行一個完整的 Bitcoin Core 節點,上面再疊加 Electrum 來索引所有地址,還要設定 SSL 證書之類的東西。現在可以用 Docker 來做,簡單了很多。如果你懂 Docker,會覺得輕鬆不少,但這依然工程浩大。
不過,這是目前實現「多硬體錢包、多重簽名」最好的 UI 介面。你可以使用 Electrum,把它放在可能感染惡意軟體的熱機器上運行,這沒問題。你可以選擇是否運行自己的 Bitcoin Core 節點(不运行的話當然有缺點),現在就能實現多硬體錢包的多重簽名。
另一個選擇是 Bitcoin Core。有個東西叫 HWI(Hardware Wallet Interface,硬體錢包介面) ,這是個非常酷的專案。你之前邀請過相關的來賓。我非常喜歡它的地方在於,你能獲得 Bitcoin Core 的所有好處:驗證共識規則、確保收到的比特幣是真的、以最佳方式生成交易。你在參考實現(Reference implementation)中操作,享受優先級 RBF(可替換交易)、手續費加價(Bump fee)、找零地址隨機化、幣種控制(Coin control)等功能。你能獲得 Bitcoin Core 的所有最佳實踐,同時又不需要把私鑰安全性寄託在電腦上,因為私鑰是獨立隔離的。
目前這套方案依然偏向駭客和折騰玩家,還沒達到大眾普及的程度。我寄望於 BIP 174 能夠改變現狀,因為 BIP 174 提供了標準化的通訊規範,可以建構在 Bitcoin Core 之上。每個硬體錢包都應該支援 BIP 174。
我希望普及大眾的方式是透過 BIP 174,雖然 BIP 174 本身沒有突破性的新技術,它只是設備間通訊的標準,但現在所有硬體錢包都應該遵守這個標準,而不是自立門戶。任何不遵守標準的錢包,覺得未來可以直接說:「這跟比特幣不相容,這只是一個山寨幣錢包。你應該用比特幣錢包來存比特幣,這個只配拿去玩山寨幣。」我期待這一天的到來,相信他們很快就會跟進更新,因為這並不難。
[01:16:00] STEPHAN: 太棒了。在這個系列中,我也會邀請 Andrew Chow 來聊聊他在 HWI 方面的工作。那我們進入下一個主題。我們前面提到過,不要簽署未經用戶驗證的內容。比如螢幕不夠大帶來的困難。確認找零地址:硬體錢包擁有主種子(xpriv),可以為不同地址生成私鑰。當你生成發送比特幣的交易時,你要確保找零會回到你控制的地址上,也就是你有對應私鑰的地址。這樣總結對嗎?
[01:16:59] MICHAEL: 對。這會是一個非常巧妙的攻擊:我想花費比特幣,發送 0.1 個比特幣給你,找零發回給我自己。我的熱機器生成了一筆交易(記住熱機器已被惡意軟體感染),它把 0.1 發給你,找零發給我——但找零其實發給了攻擊者。我看著硬體錢包螢幕想著:「嗯,只有 0.1 個比特幣,看起來沒錯,我的資產沒被偷。」我點擊了確認,隨後卻發現所有的找零都跑到了攻擊者的口袋裡。
在任何優秀的硬體錢包實現中,這都是絕對不該發生的。據我所知,除了 Ledger 之外的所有錢包都會檢查這一點。Ledger 居然直接說「請自行驗證輸出」,這簡直瘋了,完全理喻不能,不知道他們怎麼想的。
覺得部分原因在於 $m$-of-$n$ 的複雜性。退一步說,假設是 2-of-2,我的錢包顯示我是兩把金鑰之一,但另一把金鑰其實是攻擊者的,他們可以藉此勒索我的資金。或者在 2-of-3 中,我是其中一把,但另外兩把都是攻擊者的,他們能直接搶走資金。Ledger 就覺得「這太複雜了,我們懶得處理」。因此他們把責任推給最終用戶去驗證輸入和輸出,而不是利用現有工具來自動驗證交易。這非常奇怪。在他們更新軟體之前,我強烈建議**不要使用 Ledger 進行多重簽名交易**,這基本上等於「不要使用 Ledger」。這真的很傻,因為如果他們支援了這個功能,它會是一個有競爭力的產品。
[01:19:15] STEPHAN: 在這個系列中,我也會採訪 Ledger 團隊的人,屆時我會試著提出這個問題。
[01:19:28] MICHAEL: 我不是故意要黑他們,我是希望他們做出一款更好的產品,逼著其他競爭對手也做出更好的產品。最早期的 Ledger HW1 甚至連螢幕都沒有。你能想像沒有螢幕的硬體錢包嗎?那還有什麼意義?你那感染了惡意軟體的電腦問:「你想把比特幣發送到這個地址嗎?」你在沒有螢幕的設備上按下按鈕,默默祈禱它執行了電腦叫它做的事,並且祈禱那是正確的事。現在我們有螢幕了,情況完全不同了。
開源硬體 (Open source hardware)
[01:20:15] STEPHAN: 我們現在生活在未來,硬體錢包都有螢幕了。關於硬體錢包還有其他要補充的嗎?關於「開源硬體」這一點,你怎麼看?因為知名硬體錢包之間存在不同的理念。Trezor 以開源硬體聞名,Coldcard 也非常推崇開源硬體。而 Ledger 則因使用閉源的安全晶片而聞名。你的觀點是什麼?
[01:20:52] MICHAEL: 終極聖杯是一個「開源的安全晶片」。這是大家夢寐以求的,但目前還不存在。我聽過最合理的解釋是,開發這東西需要花費 1000 萬到 2000 萬美元,目前還沒有人願意花這筆錢去開源一個安全晶片。如果真的有人做出來了,大家肯定會蜂擁而至。也許未來我們回頭看會說:「天啊,敢信我們以前用的比特幣錢包居然沒有開源安全晶片嗎?」
目前你要麼選擇在通用微控制器上運行開源軟體(沒有安全晶片),要麼選擇一個理論上非常安全的安全晶片。安全晶片有它的好處(我待會會講),但我們無法驗證它裡面到底運行了什麼,甚至看不到它的程式碼。這就是權衡所在。
我對這個問題的答案是:如果你在理念上偏向任何一方,那就選你支持的。但你完全可以**兩種各買一個,並要求兩者共同簽名**。現在攻擊者必須同時破解這兩者,這對我來說聽起來棒極了。
我對閉源的安全晶片有點排斥,因為任何閉源的東西都是極具吸引力的攻擊目標。宣稱在做一件事,結果背地裡在做另一件事。在我看來這需要盲目信任,但我依然很樂意把它作為多重簽名的一部分。這正是多重簽名的魅力所在——它只有疊加好處。你可以把一個好的錢包和一個差的錢包組合起來,這依然比單用一個好錢包要安全得多。而且你可能根本分不清哪個好、哪個差。明年我們可能會在某款主流硬體錢包中發現漏洞,原本以為很棒的東西變得不怎麼樣,而以為不好的東西反而更可靠。能夠混合使用多種設備,才是未來的趨勢。
[01:23:23] STEPHAN: 這個觀點很好。那軟體中的韌體以及程式碼審查呢?有種說法是「關注程式碼的人越多越好」,因為有更多雙眼睛盯著,發現 Bug 或惡意軟體的機率就越高。
[01:23:45] MICHAEL: 比特幣最酷的地方在於,它是全球最大的漏洞賞金計畫(Bug bounty program)。如果比特幣內部存在惡意軟體或漏洞,人們有強烈的經濟誘因去利用它,無論是為了名聲還是為了巨額財富,它都是全球最大的目標。至今沒出大事說明它運作得非常好,這給了我們更多安全感。比特幣每多存在一年,我們就可以說「這東西變得更難被破譯了」。
一般來說,軟體錢包的使用者越多、盯著的人越多、企業在其上建構的基礎設施越多,我們就可以說「它可能越安全」。如果明天有人推出了一款全新的硬體錢包,我們從未聽說過,我會非常懷疑,絕不敢把畢生積蓄放進去。
但多重簽名再次改變了遊戲規則。第二個簽名(甚至第三個簽名)帶來的疊加安全力量是如此巨大,以至於我寧願要一個「糟糕的第二簽名」,也不要單一金鑰簽名。我希望這是聽眾能帶回家最重要的訊息。
如果一個錢包無法與其他錢包良好相容、不接受簡便的安全提升,對我來說這就是個糟糕的產品。我希望隨著 BIP 174 的普及,大家都能採用它。一年後我們回頭看會覺得:「哇,不敢相信以前比特幣曾經這麼危險。」
這讓我想起了開頭想說但沒說的話:為什麼這件事如此重要?我們很容易陷入鑽牛角尖,討論各種可能被攻擊、被破解或丟失比特幣的極端情況。但通常這種討論的結果是,大家會說:「聽起來太難了,我還是用 Coinbase 吧。」
這太糟糕了!你最不該做的事就是把比特幣交給別人保管,因為那一刻起你擁有的不再是比特幣,而是「比特幣欠條(IOUs)」。Mt.Gox 的用戶給所有人上了慘痛的一課。「Not your keys, not your bitcoin(不是你的私鑰,不是你的比特幣)」,這是比特幣中最重要的一課。
我們很容易困在「我不知道怎麼運行自己的全節點、我不懂命令列、我不懂這個那個」的迷茫中。但如果演變成沒有人真正擁有比特幣,大家都只有比特幣欠條,只剩下少數像我這樣的怪人想自己管理私鑰,那我們將面臨三大危機:
託管損失 (Custodial losses): 這會不斷發生。怪異的是,超大型持有者在安全方面面臨著「規模不經濟」。對於你最初的 1000 萬到 1 億美元加密貨幣,你有很強的動力去好好儲存它。如果每年花 1 萬美元硬體成本、雇用頂尖顧問或工程師,為了保護這 1 億美元,你很樂意每年花幾十萬美元確保一切萬無一失。但如果你託管了 50 億美元(2017 年牛市頂峰時,某些大型託管商的資金量常被提及),你將成為一個超級大靶子。攻擊者只要能偷走你 50 億資產中的 1%,就是 5000 万美元。你將面臨來自各個角落的攻擊,你的員工隨時會萌生邪念(如果還沒有的話),他們會收到巨額賄賂。事實上,交易所最狂的事之一就是試圖去釣魚或賄賂自己的員工,看看他們會不會上鉤,這說明他們防備心有多強,這樣做很好。但靶子實在太大了。
回到傳統金融的弊端: 回顧黃金的歷史,黃金之所以被掌控,部分原因就是出現了可信第三方替你儲存黃金,這徹底改變了遊戲規則。追溯到羅馬帝國,他們可以削減黃金成色、印製沒有足夠黃金背書的硬幣,實行部分準備金制度。你還會遇到像 Coinbase、PayPal 甚至銀行那樣的帳戶凍結和交易報告。我們不希望比特幣變成那樣,所以自己掌握私鑰極其重要。
治理攻擊 (Governance attacks): 我們在 SegWit2x 事件中見識過了,當時有巨頭聲稱:「我們代表了所有比特幣持有者,我們來決定他們的比特幣是什麼。我們要支援一種新幣,並把他們所有的比特幣賣掉換成 SegWit2x。」他們敢這麼說,是因為他們確實掌握了相當大比例的比特幣託管權。這是非常可怕的事。想像一下未來出現了 ETF (譯注:比特幣現貨ETF已於2024年1月上市),該 ETF 控制了兩位數比例的比特幣供應量。他們說:「我們想改變比特幣,我們不喜歡 2100 萬上限,覺得對挖礦經濟不好,我們要修改它,並把所有比特幣賣掉換成新的挖礦幣。」這將引發多麼混亂的世界。也許比特幣能挺過去,因為私鑰持有者和全節點營運商會說:「那不是我的比特幣,我不在乎。祝你好運,你要賣我就低價回收你的比特幣。」相信我們能挺過風暴,但託管機構所佔經濟份額越低、我們自主掌控的份額越高,他們的威脅就越小。這不僅僅是理論探討,也不僅是為了你個人安全(雖然這是你會採納建議的主要原因),這真的對整個生態系統大有裨益。
[01:31:22] STEPHAN: 說得太好了,邏輯非常嚴密。歸根結底,市場上必須有足夠多的人親自掌握私鑰、運行自己的節點。你剛才提到的另一點是,即使你還沒運行自己的節點,至少先掌握自己的私鑰,情況也會好很多。我也一直是這麼認為的。正如 Andreas 所說,比特幣第一法則:Not your keys, not your coins 。第二法則:Not your node, not your rules(非你節點,非你規則) 。我們引導大家的方式(我的聽眾可能大多是中高級玩家)應該是循序漸進的。你不能要求人們直接從「資產放在交易所」一步跨越到「完美運行全節點」。你得引導他們:「邁出下一步:先提現到單個硬體錢包;現在有了硬體錢包,我們試試配置多重簽名硬體錢包;現在再來試試運行全節點。」這正是我們希望大家走的成長路線。
[01:32:40] MICHAEL: 完全正確,而且美妙之處在于人們會自發地走這條路。我在每個階段都會接到諮詢電話。我常見的典型路線是:有人在 Coinbase 或 Square Cash 的下單頁面上,問我:「我要把我的銀行帳號或簽帳卡 PIN 碼輸進這個網站,這是詐騙嗎?」我說:「這取決於你怎麼定義。你大概率能拿到比特幣,應該沒事。」然後他們說:「嘿,我在這網站上有 1 萬美元,感覺有點不踏實,我應該自己保管嗎?」我說:「當然,這裡有各種方法。」於是他們買了硬體錢包。這期間比特幣價格漲了,他們又跑來問:「嘿,這個硬體錢包知道我所有的交易記錄啊。」我說:「是的,這不理想,你應該配合自己的全節點來運行。」現在我們還會告訴他們:「而且你還需要第二個簽名。」人們會自然而然地這麼做,因為大家都不傻。我們不需要要求他們一步到位,只要比什麼都不做有所進步就很棒了。
[01:34:07] STEPHAN: 我同意,但這可能存在倖存者偏差。主動跑來問你的人本來就是有積極性的人,而不積極的人就把資產扔在交易所不管了。
[01:34:23] MICHAEL: 是的,我說的只是那些跑來找我的人。傳聞 Coinbase 在幕後託管著天文數字般的加密貨幣。
10x 比特幣安全指南 (10x Security Bitcoin Guide)
參考連結: https://btcguide.github.io/
[01:34:36] STEPHAN: 這確實是個挑戰,但關鍵在於如何簡化資訊,並提供他們所需的知識。你最近建了一個非常棒的網站 https://btcguide.github.io/ 。我會把連結放在節目註解裡。Michael,告訴我們你建這個網站想達成什麼目標?
[01:35:02] MICHAEL: 說來有些幼稚,這純粹是我個人極度熱愛的領域。多年來我一直渴望一款優秀的硬體錢包,不敢相信 10 年過去了,覺得市面上的產品依然相當平庸。就我個人而言,如果要推薦一款,我會說選 Coldcard。它是「最不爛的」,但絕不是那種你媽媽用了會說「哇,這太好用了」的產品。你必須具備一點技術背景才能使用它,而且我不太喜歡 SD 卡的設計,但它確實能用。我是透過這個研究過程發現它的,以前玩過但沒深入。
我發了一連串推文,表達我對硬體錢包缺乏安全產品必備功能的失望:多重簽名支援、空氣隔離、允許用戶自主輸入並進行無信任運行驗證、以及能從自己的全節點獲取數據的隱私機制。對於一個專為安全而生的設備來說,這些要求並不過分。
大家紛紛留言:「嘿,你沒提到我的錢包,我的錢包其實很好用。」我回復說:「細節很複雜,你的錢包有優點,但也存在致命的缺陷。」然後我開始一一整理這些資訊。所有的資訊原本散落於推文和回覆中,很難系統化。
於是我建立了這個對比網站(也許我該買個獨立網域)。網站根據這些標準,對主要硬體錢包進行星級評分。KeepKey、Ledger、Trezor 和 Coldcard 在多重簽名支援、空氣隔離、用戶輸入、隱私和無信任性方面都接受了評估。
當然還有其他硬體錢包。有人問:「你怎麼沒提到約翰·麥克菲(John McAfee)宣稱不可破解的 Android 手機錢包?」那種評分會低得可憐。我列出了未收錄某些錢包的原因。看到大家的關注點真的很有意思。
有個叫 Cobo Vault 的錢包,擁有漂亮的 QR Code 掃描功能,但它是為山寨幣設計的,對比特幣支援不佳,而且不支援與其他硬體錢包進行多重簽名。這其實不難,但他們就是不做。如果他們支援了,我倒不介意他們支援山寨幣,那只是附加功能,而且他們的 QR Code 螢幕真的很美。雖然很貴(大概 500 美元),但看起來很棒。我不想公開背書說它很棒,但它的 QR Code 和螢幕確實很讚,目前沒人做到這點。
市面上各種產品琳瑯滿目。有些產品把「信用卡大小」當作主打賣點(比如 CoolWallet S)。你會想:「但我只在乎安全性,根本不在乎形狀是不是像信用卡。」網站詳細列出了它們在各個指標上的評分,滑鼠懸停可以看到原因,還有 Q&A 拆解了我們今天聊的大部分內容。
我的目標是促使大家開發出更好的硬體錢包。我想讓拿高分變得更加困難。我希望未來形成一種標準:不支援與競爭對手透過 Bitcoin Core 進行多重簽名的,就不配叫硬體錢包。不支援這個簡直不可思議。你必須有體面的空氣隔離(至少像 SD 卡那樣,目前只有一家支援)。你必須允許用戶輸入種子和助記詞,KeepKey 只有一個按鈕,太瘋狂了;Ledger 有兩個按鈕,極難使用,如果要手動輸入會讓人發瘋,結果大家乾脆不輸入了,然後忘記內容。從隱私角度來看,它們都應該透過 BIP 174 直接連接到 Bitcoin Core。沒有理由做一款不與比特幣直接相容的硬體錢包。
公平地說,BIP 174 出現也才一年左右,我們需要給時間。但只要有兩家率先整合,我會公開公開點名其他人,讓他們的評分直下三千尺。我知道有兩款開發中的新硬體錢包會在發表時原生支援 BIP 174。他們說還有幾個月發表,誰知道呢,硬體開發很難,也許要更久,但我迫不及待了。我相信一年後回頭看,我們會說:「以前日子真艱難,現在終於變好了。」
[01:41:02] STEPHAN: 太棒了。我特別喜歡滑鼠懸停在星星上時顯示的解說。對於試圖理解「什麼是硬體錢包、為什麼這樣評分」的新手來說,這非常關鍵。適度的篩選 curation 很重要。市面上可能有幾十種硬體錢包,但你只需要列出大家熟知的主流產品。關於硬體錢包還有其他想補充的嗎?我們聊了很多,也許可以聊聊「選擇性 Nonce 攻擊(Chosen nonce attack)」?
選擇性 Nonce 攻擊 (Chosen nonce attack)
[01:42:02] MICHAEL: 如果有任何錢包在單金鑰簽名模式下實現了針對「選擇性 Nonce 攻擊」的防禦,它就會成為必買的硬體錢包。我們前面聊過隨機性和硬體隨機數生成器。這是 ECDSA 的客觀現實。ECDSA 是比特幣採用的橢圓曲線數位簽章演算法。你可能聽說過 RSA,那是另一種非對稱加密演算法(以 Rivest、Shamir 和 Adleman 三位數學家命名),你在瀏覽 HTTPS 或 SSL 網站時運用的就是 RSA。
在 ECDSA 中,簽名中的隨機性問題一次次浮出水面。在選擇性 Nonce 攻擊中,攻擊者以某種方式指定了 Nonce(密碼學中只使用一次的隨機數)。攻擊者挑選了那個隨機數,就能從你的簽名中輕而易舉地反推導出你的私鑰。這太可怕了。目前我們還無法證明你的硬體錢包沒有使用攻擊者指定的 Nonce。
關於這種攻擊已有論文發表,過程非常簡單直接。其中一篇就是你之前的來賓 Stepan Snigirev 寫的,他是個量子物理學家,極其聰明。關於這種攻擊我要說明一點:我必須看到你的簽名,且必須指定了你的 Nonce。我如何看到你的簽名?很可能是你在比特幣網路上廣播了交易,此時我得跟你賽跑去實施雙重支付(Double spend)。從這個角度看,它可能不算很強的即時攻擊。但如果我的惡意軟體感染了你的主機電腦,並且在與你的硬體錢包通訊,你可能直接把簽名發給了我。不需要拿到私鑰,只要拿到簽名,因為我指定了 Nonce 並攻破了你的硬體錢包,我就能輕鬆推導出私鑰。
[01:44:21] STEPHAN: 內容真多。澄清一下,在這種情況下,駭客反推出來的是單個地址的私鑰,還是主私鑰(xpriv)?
[01:44:37] MICHAEL: 在這種情況下,他們推導出的是單個私鑰。但假設他們能做到這一點,且手中擁有你的主公鑰(xpub),配合這個子私鑰,他們就能算出**所有的子私鑰**。
這種攻擊的嚴重程度取決於實施方式。在一種情境下,你廣播交易,他們在網路上看到,知道你的 Nonce 和私鑰,試圖以更高的手續費廣播競爭交易進行雙重支付。但他們起步已經落後了,還要看你原始交易是否開啟了 RBF。這種攻擊不是最強的,但利潤極高。如果你發現了某款硬體錢包簽名時使用的 Nonce 漏洞,直接執行攻擊即可。
但一旦漏洞暴露,大家就會喊:「不要再用這款硬體錢包了,快升級或更換!」攻擊者只有很短的時間窗口去攔截傳輸中的交易。但如果他們同時掌握了你的 xpub,就能從那個子私鑰生成所有其他子私鑰,直接竊取你存放的所有資金,那就慘多了。
這是一個複雜且微妙的問題。針對選擇性 Nonce 攻擊有各種用戶體驗和計算難度層面的防禦手段。我預計未來會看到相關防禦,但目前**最好的防禦依然是多硬體錢包的多重簽名**。因為就算攻擊者對其中一款硬體錢包瞭如指掌,將其完全攻破,但只要需要兩個簽名,你依然是安全的。這就是它的神奇之處。我們可以深入討論這些可怕而隱蔽的攻擊細節,它們可能會影響你,也可能不會;但只要你擁有兩個來自不同廠商的硬體錢包並實施 2-of-2 簽名,你就能獲得巨大的安全屏障。
安全晶片的重要性 (Importance of having a secure element)
[01:47:12] STEPHAN: 安全晶片是必需品嗎?還是說它的重要性遠不如多重簽名支援?
[01:47:19] MICHAEL: 對我來說,多重簽名是**絕對必須**的。如果一款硬體錢包設計初衷不支援多重簽名,那它就不是安全產品。我不在乎它宣稱有什麼其他安全功能,它採摘的是最低垂的果實。支援多重簽名既不昂貴也不複雜。不支援多重簽名,等於在說:「我們的商業模式不是做安全產品,而是把你鎖定在我們的平台上。可能因為我們靠山寨幣交易賺最多錢,支援幾千種代幣,內建了 Shapeshift 兌換,或者有管道讓你向我們購買比特幣和山寨幣。」
這不是壞事,你想這麼做是你的權利,雖然我沒興趣,但完全沒問題。問題在於你賣的不再是安全產品,而我只想要安全產品。
我喜歡 Coldcard 的原因之一是他們不支援山寨幣,因為「複雜是安全的天敵」。硬體錢包運行的程式碼越多、功能越多,出現 Bug 或漏洞的機會就越多。保持簡單才是王道。這就是為什麼我前面提到,我的開源命令列錢包是所有比特幣錢包中程式碼行數最少的。到現在依然如此,發布時更是遙遙領先。覺得這很酷,展示了底層邏輯,讓大家更容易看出是否有異常。雖然不保證絕對安全,但這是一個優秀的特性。
我喜歡 Coldcard 這點,但 Trezor 支援很多山寨幣,我也很樂意使用 Trezor。多重簽名才是最重要的核心。至於安全晶片,如果有開源的我全力支持;既然沒有開源的,覺得有也不錯,但我沒有強烈偏好。**混合使用兩者吧**。
給最終用戶的建議 (Advice for end users)
[01:49:59] STEPHAN: 對於想要提升安全等級的聽眾,假設他們想在家里運行 Bitcoin Core 搭配 HWI,配置多重簽名硬體錢包並進行分散保管。這是個好目標嗎?你有什麼建議?
[01:50:21] MICHAEL: 目前就安全與易用性的權衡而言,如果你想做多硬體錢包的多重簽名,**你應該使用 Electrum**。我不太喜歡這個建議,因為 Electrum 在隱私和強制執行共識規則方面有缺點,但你可以額外運行自己的 Electrum 伺服器。
如果你轉用 Electrum 進行多硬體錢包多重簽名,會比直接使用廠商給的預設 App 安全得多(預設 App 毫無隱私可言,把所有資訊上交,連在熱機器上非常危險)。Electrum 對空氣隔離支援得非常好,你想用空氣隔離隨時可以切換。雖然多硬體多重簽名不一定非要空氣隔離,但如果你擔心,可以加上。我知道很多大戶在 Electrum 空氣隔離架構上記錄著八位數(數千萬美元)級別的交易。目前我推薦使用 Electrum。
但我希望很快能推薦「透過你自己的 Bitcoin Core 節點進行 PSBT (BIP 174)」,我看到相關開發正在蓬勃發展。那是運行 Bitcoin Core 更好得多的方式,因為你不用偏執地擔心:「這是我運行的真實 Bitcoin Core 嗎?作業系統有漏洞嗎?防火牆配置對嗎?」
如果私鑰留在硬體錢包裡,你運行 Bitcoin Core 的唯一風險僅限於隱私和可能處於錯誤的共識規則下。這些雖然不是小風險,但跟「直接丟錢」完全是兩碼事。現在你可以首先集中精力在硬體錢包端確保「不丟錢」,然後再根據意願集中精力在熱機器端選擇作業系統、驗證級別。人們應該有權選擇適合自己的防護等級。
但首要任務是保護好資產。資產損失對整個生態系統的打擊太大了。雖然作為持有者,別人丟錢客觀上讓總量減少,我能獲得一點微小的資產增值好處,但這不利於新手加入,讓大家覺得就算投資成功了也可能隨時血本無歸。
[01:53:14] STEPHAN: 關鍵在於讓普通人也能輕鬆保護比特幣,達到合理安全,而不是要求每個人都像擁有龐大資源的億萬富翁那樣去做防護。
[01:53:31] MICHAEL: 類比網站服務的 SLA(服務級別協議)可用性,大家常說「追求 9 的數量」。做到 99% 可用很容易,99.9% 也不難;99.99% 需要付出努力,但可實現;要做到 99.999%(5 個 9),你得非常專業;6 個 9 意味著一年只能停機幾秒鐘。
比特幣安全也是一樣的邏輯,只是方向相反:「我丟錢的機率是多少?」也許你覺得 0.1% 的風險可以接受,針對這筆金額你願意做這麼多功課。但如果你希望機率降到 0.01%、0.001% 甚至 0.0001%,你就必須做足每一個額外步驟。
從防範損失的角度來看,Bitcoin Core 是你最後才需要擔心的事。每個人都運行全節點固然很棒,但為了防止丟錢,你首先要聚焦在**硬體錢包端**,其次才是 Bitcoin Core 端。
我也希望現在就能告訴大家:「技術已經成熟了,你可以輕鬆在樹莓派(Raspberry Pi)上運行 Bitcoin Core,不需要任何命令列知識就能做多硬體錢包多重簽名。」相信一年後可以實現,但今天還做不到。
[01:55:24] STEPHAN: 太棒了,非常感謝。那我們為聽眾總結一下:兩大核心要點,第一,**多重簽名具有疊加效應**,儘量使用它;第二,**善用測試網**,讓自己對交易操作完全熟悉和安心。
沙米爾秘密共享方案 (Shamir’s Secret Sharing scheme)
參考資料:
* How to Share a Secret (Shamir 原始論文, 1979): http://web.mit.edu/6.857/OldStuff/Fall03/ref/Shamir-HowToShareASecret.pdf
* How to Share a Secret, Infinitely (論文): https://eprint.iacr.org/2016/194.pdf
* SLIP-39, Satoshi Labs 助記詞的沙米爾秘密共享規範: https://github.com/satoshilabs/slips/blob/master/slip-0039.md
[01:55:59] MICHAEL: 對,測試一切,測試網交易完全免費。還有一個很少人在用、但覺得很多人應該用的免費技術——**沙米爾秘密共享方案(Shamir’s Secret Sharing scheme)**。這是建構在硬體錢包和備份策略之上的工具,跟多重簽名有點像但又不太一樣。如果有時間我們可以聊聊。
[01:56:35] STEPHAN: 來吧,我們把它補充完整。
[01:56:39] MICHAEL: 沙米爾秘密共享方案源自 Adi Shamir 1979 年的論文 。他就是 RSA 加密演算法中的「S」。他是密碼學界的神級元老,而且至今活躍(Merkle tree 的 Ralph Merkle 也還在)。Adi Shamir 在 1979 年發表了這篇只有兩頁紙的論文《How To Share a Secret》,閱讀並理解它非常快。
核心思想是:你可以設定一個 $m$-of-$n$ 的門檻來拆分你的秘密。這個秘密可以是比特幣私鑰、密碼短語、通用助記詞,或是解鎖存放所有秘密的 USB 隨身碟密碼。你可以把秘密拆分成若干碎片(Shares),只要收集到 $m$ 個沙米爾碎片,就能重構出秘密;但如果只拿到 $m-1$ 個,就**什麼都拿不到**。
這絕對優於任何粗暴切分密碼的做法(比如「我把紙切成兩半,一半放家裡,一半放公司」)。首先,切成兩半的話,丟失任何一半你就完蛋了,你顯然更想要 2-of-5 而不是 2-of-2。其次,切半並不安全,假設密碼有 16 個字元,兩邊各 8 個,拿到 8 個字元的人可以暴力破解剩下的 8 個字元;而沙米爾方案中,少一個碎片就完全無法暴力破解。
這是一個非常聰明的演算法,在比特幣邊緣領域應用了很久,但尚未普及。我常問比特幣玩家一個問題:「如果你被公車撞了,你的比特幣會怎樣?」對大多數人來說,答案是比特幣隨他們灰飛煙滅。這很悲傷,特別是如果你有家人的話。
另一種極端是有人把助記詞明文放在家裡保險箱、床墊下或藏寶圖裡。任何人只要看到那個種子(如果沒設 Passphrase),就能直接拿走資金。你需要備份以防火災、洪水或硬碟損壞,比如用 Cryptosteel 金屬板;但對於密碼短語,最聰明的拆分方式就是沙米爾秘密共享方案。
你可以把密碼短語拆分後交給值得信任的親朋好友,設定門檻(比如 2-of-5 或 11-of-20)。如果你不幸出事,只要他們沒有同時罹難(達到法定人數),他們就能拼湊出密碼短語。結合你在銀行保險箱裡留下的實體種子,你的比特幣就能被成功恢復。未來我們會看到這項技術被廣泛採用,畢竟過去比特幣玩家多為年輕小夥子,總覺得自己長生不老、不會出事。
[02:01:09] STEPHAN: 如何把沙米爾方案整合到硬體錢包多重簽名架構中?比如 Casa 採用無種子(Seedless)方案:他們的 3-of-5 包含三個硬體錢包、一個手機端錢包、以及 Casa 託管的恢復金鑰,沒有種子備份。但另一種思路是自己做 3-of-5 多重簽名硬體錢包,那沙米爾秘密共享應該放在哪個環節?
[02:01:48] MICHAEL: 這裡最棘手的依然是「複雜是安全的天敵」。而且繼承人得處理這一切,而你當時已經不在人世無法指導他們。當繼承人打開保險箱看到 Cryptosteel 金屬板,完全一頭霧水;聽到其他人手裡有沙米爾碎片,又搞不懂沙米爾的 $m$-of-$n$ 和多重簽名的 $m$-of-$n$ 是什麼關係。目前這方面的體驗非常混亂。
Trezor 提出了一個 SLIP-0039 草案 ,試圖標準化密鑰拆分的沙米爾方案。我希望看到類似 WIF(錢包導入格式)那樣標準化的序列化格式,掃描 WIF,任何錢包都能識別並導入私鑰。但在多重簽名和 HD 錢包架構下,情況極其複雜。比如:「我現在拿著一個 2-of-3 HD 錢包種子的沙米爾碎片,這是 6-of-10 沙米爾架構中的一片,我進行到哪一步了?我還需要什麼?資料齊全嗎?」
終極目標是將資料導入 Bitcoin Core,系統就能自動識別並顯示「我知道怎麼讀取,這是你的資產」。目前現狀還很混亂,這種複雜性甚至在逼著人們走向中心化託管。因為雖然 Coinbase 沒大肆宣傳,但法律上他們有義務將資產轉交給遺產繼承人(雖然過程據我所知非常繁瑣,但確實成功過)。
我們應該有更好的非託管解決方案。我知道有一家託管公司正在開發新標準:他們掌握一把鑰匙,你掌握兩把(2-of-3 模式)。憑死亡證明,他們可以用他們的鑰匙結合你剩下的一把鑰匙來恢復資產。你只需要確保家人能拿到剩餘的一把鑰匙。這時候就可以用沙米爾方案把那一把鑰匙拆分給多個家人。這樣即使家人合謀,也只有一把鑰匙,依然無法偷錢。
你可以把一份給律師,一份給託管機構,剩下的拆分給親友。不過這也會帶來奇怪的人性博弈:買人壽保險,受益人有動機殺你;把遺產的沙米爾碎片發給朋友,朋友也有動機殺你。所以,請選擇不會殺你的朋友。
[02:05:31] STEPHAN: 這絕對是金玉良言。
[02:05:35] MICHAEL: 而且門檻要設高一點,需要大多數人合謀才行。
[02:05:42] STEPHAN: 雖然有點複雜,但重要的是大家開始邁出第一步。目前很多人還把資產留在交易所,他們只需往前走一步,這正是我們製作這個 Podcast 的初衷。今天內容非常豐富,未來一定會再邀請你來。最後,請告訴聽眾可以在哪裡關注你和閱讀你的文章。
[02:06:28] MICHAEL: 我偶爾會在 Twitter 和部落格發布比特幣相關內容。我的 Twitter 是 @mflaxman ,這是最方便找到我的地方。個人網站是 michaelflaxman.com 。
[02:06:40] STEPHAN: 太棒了。非常感謝你,今天的內容非常有教育意義,相信聽眾收穫頗豐。
[02:06:50] MICHAEL: 謝謝你,希望我帶給大家的幫助多過困惑。