千里之堤毀於蟻穴(慎用HD Wallets)

現在我們都該明白,無論怎樣強調隨機對於比特幣的重要性都不爲過,隨機的確稱得上是比特幣的“命根子”。
在過去的幾篇文章中,小太已經介紹過了一些因隨機問題可能導致私鑰暴漏的情況,今天,我再跟大家聊聊分層確定性(Hierarchical Deterministic)錢包。

HD Wallets因其“只需要一個主(根)私鑰,就能生成海量子私鑰”這個特性廣受歡迎,在過去的一年裏,越來越多的錢包解決方案和比特幣企業開始支持或採用HD模型來進行私鑰管理,可是,大部分人並未意識到其中可能存在的潛在風險。(本文不討論HD的原理,有興趣的童鞋可參閱《分分鐘搞懂HD錢包》及 BIP32 規範中的相關說明)

msbt_0409

HD模型的最大優點是不使用私鑰就能生成大量的由您掌握的地址,其原理就在於直接通過主公鑰就可以生成任意數量的子公鑰,整個過程無需訪問主私鑰。這個特性有如下好處:

1、備份容易,只需備份主私鑰,新增地址無需再次備份私鑰;
2、保證主私鑰的冷存儲,無論新增多少個地址,僅需主公鑰就能完成,無需主私鑰介入;
3、方便的第三方審計,只需給第三方機構或會計提供主公鑰,他就可以看到所有下級地址的交易,但又不能花費任何幣(因爲沒有子私鑰);

因爲HD模型的這些好處,錢包解決方案和比特幣企業就可以很方便的進行私鑰管理。比如說,電子商務網站或交易所就可以在網站服務器上存放主公鑰,然後按需新增子地址,對每個用戶、每個商品甚至每筆交易都使用一個全新的比特幣地址,而整個過程不會涉及冷存儲的主私鑰;再比如說,個人可以冷存儲主私鑰,在熱設備上存放主公鑰,就能方便的生成任意數量的地址,滿足自己不斷新增地址而又無需備份私鑰的需求。

但這些好處其實是有代價的,因爲HD模型有一個天生的“缺陷”(無論是Type1、Type2、還是遵循BIP32規範的確定性錢包),那就是隻要暴漏任何一個子私鑰,再加上主公鑰,就能反推出主私鑰,這是“致命”的。
也就是說,對於企業或個人,如果您使用HD模型管理私鑰,出於方便的增加地址及第三方審計等目的,主公鑰往往暴漏在外(主公鑰的安全級別當然要遠低於主私鑰)。大家可能會認爲,我們只要能安全的保管好私鑰就足夠了(比如說絕對冷存儲主私鑰,離線的使用子私鑰簽名交易等),但通過前幾篇文章,您就該明白,如果使用了不夠安全的隨機數,簽名交易也有可能會暴漏私鑰。對於非HD解決方案來說,一個有問題的簽名最多隻會暴漏一個私鑰,而在HD模型的情況下,任何一個子私鑰的暴漏,都有可能導致主私鑰的暴漏,最嚴重的情況下,整個樹狀的分層模型會整個崩塌,企業或個人的比特幣資產也會全部丟失,這就是HD模型的最大風險。

HD模型的“安全”與“易用”其實是個悖論,爲了易用,我們希望無論新增多少個地址都無需備份私鑰,這就需要熱的(泄露概率高)主公鑰,而爲了安全,又必須保護好主公鑰,否則任何一個子私鑰的泄露,都能反推出主私鑰。這顯然是個矛盾,而如果發生潛在的隨機數問題,又會放大這種矛盾。因此,在這裏,我特別提醒大家謹慎使用HD模型。

比特幣的安全就在於隨機,我們希望隨機的生成一個個比特幣私鑰用來存幣,希望使用隨機的k值來簽名交易。而HD Wallets的模型其實是基於一個唯一的(根)隨機數來確定性的構建了整個分層級的、樹狀的私鑰大廈(私鑰和私鑰間有着確定性的計算關係)。這座大廈,在沒有遇到任何問題的時候,看起來也許是固若金湯,但任何一個小問題(如r值問題、內鬼盜竊等)的發生,都有可能導致整個大廈的崩塌。
這也許就是傳說中的“千里之堤毀於蟻穴”吧!

最後,再說一句,儘量使用不相關(隨機)的私鑰解決方案吧,這纔是比特幣之本,比特幣企業和個人應謹慎使用HD Wallets。

小太關於隨機這個系列的文章就暫告一段落了,必須再次提醒大家,隨着安全專家和***對k值更爲深入的分析,因不安全隨機數導致的丟幣未來可能會越來越多,如果企業和個人採用了HD方案,甚至有可能會放大這種災難,隨機理應引起業內人士的足夠重視。
看完這幾篇文章,有人可能會擔心“比特幣到底安不安全?”。在這裏,小太可以很負責的告訴您,直到今天(及可預計的未來),比特幣很安全,比特幣所依賴的橢圓曲線簽名算法(ECDSA)也很安全,不安全的是一些有問題隨機數生成器或技術解決方案,這些都與比特幣無關。

本系列文章要特別感謝 Nicolas, Pinar, Filippo 這三位大牛,他們最近發表的論文(https://eprint.iacr.org/2014/848.pdf)讓小太收益良多。在該論文中,幾位作者深入的解釋了不安全隨機數的風險及其對HD Wallets可能造成的災難,該篇論文乾貨十足,值得每位從業者學習。

----


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章