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

轉自:http://blog.sina.com.cn/s/blog_12ce70a430102vbu9.htmlhtml

 

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

-- 隨機系列談之四

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

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

HD模型的最大優勢是不使用私鑰就能生成大量的由您掌握的地址,其原理就在於直接經過主公鑰就能夠生成任意數量的子公鑰,整個過程無需訪問主私鑰。這個特性有以下好處:
一、備份容易,只需備份主私鑰,新增地址無需再次備份私鑰;
二、保證主私鑰的冷存儲,不管新增多少個地址,僅需主公鑰就能完成,無需主私鑰介入;
三、方便的第三方審計,只需給第三方機構或會計提供主公鑰,他就能夠看到全部下級地址的交易,但又不能花費任何幣(由於沒有子私鑰);
由於HD模型的這些好處,錢包解決方案和比特幣企業就能夠很方便的進行私鑰管理。好比說,電子商務網站或交易所就能夠在網站服務器上存放主公鑰,而後按需新增子地址,對每一個用戶、每一個商品甚至每筆交易都使用一個全新的比特幣地址,而整個過程不會涉及冷存儲的主私鑰;再好比說,我的能夠冷存儲主私鑰,在熱設備上存放主公鑰,就能方便的生成任意數量的地址,知足本身不斷新增地址而又無需備份私鑰的需求。

但這些好處實際上是有代價的,由於HD模型有一個天生的「缺陷」(不管是Type一、Type二、仍是遵循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可能形成的災難,該篇論文乾貨十足,值得每位從業者學習。

----------------------------------------------------------------------------------------------


分分鐘搞懂 HD 錢包

第一次看到 HD 這個詞被用在比特幣錢包中時,很容易就把它理解成硬件(Hardware)錢包,其實它是分層肯定性(Hierarchical Deterministic)錢包的縮寫 HD Wallets。
「分層肯定性」這個詞乍看起來很「高大上」,各種文檔也把它描述的「雲裏霧裏」的,其實原理自己很簡單,兩句話就能說清楚:
首先,要用一個隨機數來生成主(根)私鑰,這和任何一個比特幣錢包生成任何一個私鑰沒任何區別;
而後,再用一個肯定的、不可逆的算法,基於主私鑰生成任意數量的子私鑰;
看到了沒?很簡單吧?

那爲何要用「肯定、不可逆」的算法呢?由於「肯定」才能保證從一個主私鑰能夠生成出所有的子私鑰,而「不可逆」則是爲了確保不能經過子私鑰反推出主私鑰。
例如,SHA256 就能夠當作是「肯定、不可逆」的算法,咱們能夠很容易的使用 SHA256 設計出一個 HD 模型:SHA256(seed + n)
在這個模型裏,seed 爲主私鑰,n=(1,2,3......)計算出來的結果對應於第(1,2,3......)個子私鑰。
這其實就是類型1肯定性錢包(Type1 HD Wallets),固然,咱們還能夠基於更多「肯定、不可逆」的算法來設計其它 HD 模型,好比 BIP32,再好比類性2肯定性錢包(Type2 HD Wallets)。算法能夠複雜,但原理都同樣,很簡單,並且,只要 SHA256 是安全的,HD 模型就是安全的。

HD 模型在數學上有一個很是「好」的特性:只須要主公鑰,就能夠生成出任意數量的子公鑰。也就是說,無需私鑰介入(主私鑰和子私鑰),就能基於主公鑰生成新(公鑰)地址,而這些地址其實都能被主私鑰所控制。
這個特性使得 HD 模型在過去一年裏被愈來愈多的應用於企業和我的比特幣錢包解決方案,惋惜,優勢每每伴隨着代價,某些狀況下,代價甚至是「致命的」。

下一篇文章中,小太將和您說說 HD 模型的潛在風險。

----------------------------------------------------------------------------------------------




本文不討論HD的細節,僅談其中潛在的風險。(有興趣的童鞋可參考 http://www.8btc.com/hd-wallets 及 BIP32 的內容更深刻的瞭解HD Wallets)




常常有用戶建議咱們支持分層肯定性錢包(HD Wallets)功能,在過去的一年裏,你們也能看到愈來愈多的錢包解決方案(如MultiBit等)開始HD化,也有愈來愈多的比特幣企業開始利用HD來進行錢包管理,彷佛只要是有了HD,人們就不再用爲私鑰而頭疼了,那真是這樣的嗎?

讓咱們先來了解一下到底什麼是分層肯定性(Hierarchical Deterministic)錢包,乍看起來,這個名詞彷佛很難理解,其實它的原理很簡單,幾句話就能講清楚:
首先,用一個隨機數來生成主(根)私鑰;
而後,再用一個肯定的、不可逆的算法,基於主私鑰生成任意數量的子私鑰;

爲何要用「肯定、不可逆」的算法呢?由於「肯定」才能保證從主私鑰能夠生成所有的子私鑰,而「不可逆」則是爲了確保不能經過子私鑰反推出主私鑰。
例如,SHA256就能夠當作是「肯定、不可逆」的算法,咱們能夠很容易的使用SHA256設計出一個HD模型(注:seed爲主私鑰):
SHA256(seed + n)
這其實就是(Type 1)肯定性錢包。固然,咱們還能夠基於更多「肯定、不可逆」的算法來設計其它HD模型,好比BIP32,再好比(Type 2)肯定性錢包,算法能夠複雜,但原理都同樣,很簡單。
選定了算法,咱們還能夠基於任何一個子私鑰做爲下一級的主私鑰,繼續使用相同算法來生成下一級的子私鑰,也就是說,能夠一層一層的樹狀結構向下生成,這就是爲何會稱其爲分層肯定性的緣由。

HD Wallets的特性和優勢在某些狀況下彷佛特別適合企業和用戶的一些需求(可參閱http://www.8btc.com/hd-wallets)


不管對於企業仍是我的來講,比特幣私鑰管理老是件讓人「頭疼」的事,咱們不只須要多個地址、還須要區分冷熱、而且考慮備份方式,這很麻煩。
考慮到這一點,有人「創新」的設計了一套分層肯定性(Hierarchical Deterministic)模型來生成私鑰,支持HD模型生成私鑰的錢包被稱爲HD Wallets。
乍看起來「分層肯定性」彷佛很難理解,其實原理自己很簡單,幾句話就能夠說清楚:
首先,用一個隨機數生成主(根)私鑰;
而後,用一個肯定的、不可逆的算法,基於主私鑰來生成任意數量的子私鑰;
那麼爲何要用肯定的、不可逆的算法呢?這也很簡單,由於「肯定」才能保證從主私鑰能生成所有的子私鑰,而「不可逆」則是爲了確保不能經過子私鑰反推出主私鑰。

最典型的「肯定、不可逆」的算法就是SHA256,這樣咱們能夠很容易的就設計出一個分層肯定性模型(注:seed爲主私鑰):
SHA256(seed + n)
這其實就是類型1肯定性錢包。
固然,基於相同的原理,咱們能夠設計出更多的「肯定、不可逆」的算法來生成子私鑰,好比說BIP32,再好比Armory所設計的類型2肯定性錢包,算法能夠複雜,但原理都同樣,很簡單。
肯定了算法,咱們還能夠基於任何一個子私鑰來做爲下一級的主私鑰,繼續使用相同的算法來生成下一級子私鑰,也就是說,能夠是一層一層的樹狀結構向下生成,這就是爲何稱其爲分層肯定性的緣由。

好了,簡單介紹完HD Wallets的原理,我在來講說這種模型的「優勢」:
一、管理容易,只需保管好(備份)一個主私鑰便可,經過主私鑰能夠生成所有的子私鑰甚至是多級子私鑰;
二、由於能夠從父公鑰生成所有子公鑰,這意味着咱們能夠在不影響父私鑰冷存儲的狀況下,生成任意數量的子地址用於比特幣收款,這在電子商務場景下頗有用,您能夠爲每一個商品、每一個用戶、甚至是每筆交易都生成一個全新的比特幣地址,而這個過程徹底無需進行任何私鑰管理;
三、多層樹狀結構很像是商業組織(如企業)的結構,好比說:總經理掌握主私鑰,部門經理掌握1級子私鑰,員工掌握2級子私鑰(這能不能算成是優勢,其實很值得商榷,由於若是真發生了比特幣資產的丟失,到底該算到總經理、部門經理、仍是員工的頭上呢?);
四、更方便的審計,能夠給會計或第三方審計任何一級上的公鑰,他就能夠看到該級下的全部交易,因爲沒有下一級私鑰,只能審覈(看),而不能花任何的幣;
因爲HD Wallets看起來優勢多多,愈來愈多的錢包開始使用或支持這種解決方案,好比說:MultiBit HD、Electrum、Trezor等,甚至貔貅(雲幣)這個開源交易所平臺聽說也採用了這種模型來進行私鑰管理。那麼,HD Wallets到底好很差呢?

有很多用戶在bitcointalk論壇上建議比太錢包支持HD Wallets,小太當時的回答是「咱們將來可能會考慮哈」。如今,在這篇文章中,小太能夠很認真的回答這個問題,那就是「咱們不會考慮支持HD Wallets」,緣由很簡單,由於它不安全,若是在隨機數不夠安全的狀況下,它甚至會放大風險,放大多少倍呢?也許是主私鑰!

經過上面的原理性介紹,你們就應該能明白,整個HD Wallets的體系實際上是構建在一個隨機數(主私鑰)之上的,雖然這種模型有着一些管理和審計上的優勢,但若是暴露出任何一個小缺陷,就有可能致使整個體系的崩塌,千里之堤每每會毀於蟻穴,就是這個道理。
好比說,關於HD Wallets,有一個天生的、被你們討論過屢次的缺陷,即:主公鑰+子私鑰能夠反推出主私鑰。這在完美的狀況下,不會有任何問題,企業和我的既不該該暴露主公鑰,也不該該暴露子私鑰。但即使比特幣是完美的,並不表明使用比特幣的企業或我的是完美的,也不表明第三方所開發的各類比特幣錢包解決方案是完美的。
咱們可能會由於各類緣由暴露主公鑰,好比爲了第三方審計,再好比爲了方便的新增地址而在網站服務器(企業)或熱設備(我的)上存放主公鑰,在這種狀況下,主私鑰可能的確作到了絕對的冷、絕對的安全,但主公鑰顯然存在暴漏風險。
在這種狀況下,企業或我的若是能確保子私鑰的安全,顯然問題也不大,但是,經過小太以前兩篇關於隨機數的討論,您就應該知道,若是基於不安全的隨機數生成器進行簽名,存在多種暴漏私鑰的可能,對於通常的私鑰來講,這可能致使單個私鑰的暴漏,但對於HD Wallets來講,則可能因爲暴漏單個子私鑰而最終致使暴漏主私鑰,這算法

相關文章
相關標籤/搜索