“好的多重簽名”和“壞的多重簽名”

買賣虛擬貨幣

概要:這篇文章的要點在於定義一下“好的多重簽名”和“壞的多重簽名”。好的多重簽名免除了人們必須相信個體的麻煩,促進對消費者的保護,而壞的多重簽名僅僅是對加密經濟安全性的威脅。本文試圖釐清兩者的區別。

經過數年基礎設施與技術的發展,看起來多重簽名錢包技術終於在比特幣世界裡有了長足進展。 greenaddress.it 和bitgo 是最初的兩個競爭者,後者最近拿到1200萬美元的風投並自稱囤有價值超過1億美元的比特幣。

從比特幣系統的角度看,多重簽名越來越多的出現,是非常受歡迎的,比如已知的好處,比特幣協議的這一組成部分面世接近兩年,現在主流的消費者終於可以享受它的果實了。

多重簽名的好處尤其包括消費者—商家第三方擔保應用,在有必要進行保護的地方,允許開放自由的市場作為仲裁員,保證比特幣交易的相對安全和無欺詐。其好處還包括作為個人儲存錢包的應用,保護使用者免受任何因為單一秘鑰帶來的損失和妥協。

當消費者保護成為被關注的焦點 ,數字貨幣許可證(bitlicense)的浮現帶來的對數字貨幣生意的高度限制,在保護消費者權益方面,多重簽名提供了不同於中心化監管的一種選擇——不要完全確認每一個生意中的個體是可信的。我們可以建立一個系統,最大化地去除單點故障,優先信賴數字上的安全。

然而,像多重簽名這樣的潛在的技術革命,依然存在被誤傳和過譽的風險。就像一些企業會宣傳自己的地址由“3”開頭的品牌效益,卻沒有實際的取信於人的努力。這篇文章的要點在於定義一下“好的多重簽名”和“壞的多重簽名”。好的多重簽名免除了人們必須相信個體的麻煩,促進對消費者的保護,而壞的多重簽名僅僅是對加密經濟安全性的威脅。本文試圖釐清兩者的區別。

客戶端的革命

真正涉及多重簽名以前,我們必須首先仔細分析一項被一些公司採用的特殊技術,這項技術看起來是出於增強安全性和降低對信任的需求:客戶端網頁應用。

在客戶端網頁應用之前,比特幣客戶端有兩種主要方式。

第一,桌面客戶端( the desktop clients),你直接下載程式到你的電腦上。桌面客戶端的好處是,使用者在自己的機器上掌握自己的私鑰,所以不必依賴任何第三方就能儲存自己的資金。但是它的易用性有一定的缺陷:至少使用者需要去下載。

第二,伺服器端線上錢包(the server-side web wallets),有一個第三方替你儲存你的比特幣,給你一個賬號可以方便的轉入和轉出,就像是用谷歌和臉書賬號一樣,不需要下載任何軟體。它有很高的易用性,但是他要求你對第三方的信任。

客戶端網頁應用( client-side web apps )是一個簡潔的第三種解決方案:儘管依然是透過網頁應用登陸網站,但是不需要下載必需的軟體,私鑰的儲存和變更使用網路瀏覽器內建的用javascript編寫的客戶端完成。因此,儘管這種應用,與受信任的伺服器錢包提供的網頁互動相比,有同樣的便捷性,但是伺服器並不獲取你的個人私鑰。看起來兼有兩方的長處。現在最流行的客戶端錢包可能是blockchain.info.

現在,讓我們評價一下這種形式的優點。現在,javascript客戶端當然不乏批評者;甚至matasano專門有一篇名為“javascript cryptography considered harmful”的文章。儘管他的觀點,完全否認基於瀏覽器加密的客戶端的任何優點,相當極端,但他確實有合理的地方——尤其是,當你下載一個瀏覽器javascript時,你依然要信賴它的來源。這就是說,如果blockchain.info或某個blockchain.info的流氓員工想要,或者政府強迫他們,他們可以寄出包含你私鑰的程式碼,或者簽署一個將你的全部資金髮送到他們地址的交易。而你永遠不能及時知道。

現在,如果有人將這個論點推到極致,他可能會聲稱,即便是下載的客戶端,也可能會釋出會偷你私鑰的版本。但是顯然這種可能性會小得多——尤其是當你只下載過一次這個軟體的時候。

你有多信任各種情形下的軟體呢?讓我們看一看,想要成功,對每種情況的攻擊需要什麼條件

桌面客戶端,原始的——攻擊系統的程式碼提供者,或者攻擊者,需要在gigub的客戶端倉庫裡面提交一個包含後門的補丁,你需要在組織內部或外部的某人掃描程式碼並發現這個後門之前,下載這個客戶端(才能中招)。

桌面客戶端,二進位制的( binary,普通人的選擇)——攻擊系統的程式碼提供者或者攻擊者,需要編制併釋出一個包含後門的客戶端,你要在組織內的某人刪除這個版本之前下載它。(在大多數情況下,透過反編譯二進位制客戶端發現後門是不可能的,所以漏洞必須是內在的,儘管長期看來一旦入侵被發現,這個漏洞也就永遠被堵住了。)

客戶端瀏覽器網頁應用( client-side browser webapp) ——攻擊者需要在內容釋出網路,快速插入一個包含後門的客戶端版本,只有在這一時間段內(惡意版本釋出和下線之間的時間段)登陸的使用者是易受攻擊的。

伺服器端瀏覽器網頁應用( server-side browser webapp )——攻擊者需要僅需進入網站的冷錢包,如果這一點成功的話,顯然每一個使用者的賬戶都會受到連累。

因此,我們能夠看到一個安全性的等級,越往下,安全性越低,你需要投入的信任越多。短期和長期的攻擊者之間有一個獨有的區別:公司是邪惡的?還是僅僅是在被發現之前,一些人透過一些漏洞進入伺服器的幾分鐘或幾個小時?對付長期的攻擊者,只有透過從開源社羣下載一些穩定版本能夠幫到你,而對付短期的攻擊者,二進位制的桌面應用就做的很好,甚至客戶端瀏覽器網頁應用也能限制一小部分使用者的伎倆。

一般來說,儘管,在桌面端和瀏覽器端存在著基本的區別:前兩個,如果攻擊者短期侵入,在安全設定正確的前提下,根本不足為害,因為問題會被很快解決。而在後兩種情況下,短期侵入也是有害的。客戶端瀏覽器基礎的app比伺服器基礎的錢包僅僅增加了一部分的安全性。

問題怎麼解決呢?最簡單的辦法是將客戶端的網頁應用改成瀏覽器擴充套件,這幾乎徹底解決了這個問題;從安全形度看,瀏覽器擴充套件等同於,在比如java或者python互動環境中執行的桌面應用。然而,這是以增加了一個額外的步驟來實現的——使用者必須下載一個瀏覽器擴充套件,而不是僅僅相信伺服器。因為這個原因,儘管像blockchain.info提供了他們自己的瀏覽器擴充套件,但是大多數人卻沒有使用。

注意,以上所說的當然不是對客戶端瀏覽器javascript的指控;我的意思不過是說,客戶端瀏覽器javascript並不比伺服器掌握你所有錢的方式有特別高的安全性,或者不需要支付那麼高的信任成本。

除了安全和信任,還有其他的理由去寫一個客戶端瀏覽器javascript加密貨幣應用,最大的理由就是便捷。因為越多的事情在瀏覽器那裡完成,你作為一個應用開發者,就可以省略越多的基礎工作。

以太坊正是由於這個原因使用客戶端javascript(開發的方便和對拒絕服務攻擊的穩健性)。當然你在使用這個app的時候你是相信以太坊的,但是無論如何,這不是一個問題,因為你相信以太坊能夠開發一個平臺。因此,如果我們承認,我們相信像blockchain.info這樣的提供者,我們可以說使用客戶端加密是合理的。然而對於多重簽名,故事是完全不同的……

熔合的多重簽名錢包

前面關於客戶端安全性的討論是重要的,因為,它帶來了對一個重要的,有時候被忽略的,加密貨幣協議中關於安全性的組分:原始碼自身的安全性。儘管比特幣這樣的加密協議理論上講是無須懷疑的,但事實上幾乎沒有人有能力自己檢驗所有的程式碼。在黑暗c競爭中,聰明的開發者展現了一個軟體免於攻擊是多麼的困難。因此,除了程式協議的原始開發者,幾乎每一個人都是要支付一定的信任成本的。

在多重簽名中,我們試圖做的是,明確消除信任任何一個實體的必要。一般來說,有兩種多重簽名實現的途徑。

第一種我們稱作延伸版的2-of-2。基本的2-of-2的概念是簡單的,一個秘鑰由使用者掌握,可能是透過密碼推斷的腦錢包,可能是瀏覽器或客戶端隨機生成的加密秘鑰。另一個秘鑰則由伺服器掌握。當使用者想要交易的時候,他們在電腦上登陸錢包,然後使用他們的私鑰簽署一個從自己的地址傳送資金的交易。這時交易送達伺服器,伺服器做一些反欺詐檢驗,比如向使用者的手機上傳送一個驗證碼,要求使用者輸入這個驗證碼。如果成功,伺服器簽署這個交易併傳送。

然而,這個策略天生就是脆弱的。如果你的電腦被攻擊,或者你忘記了自己的密碼,那麼你就不能登入自己的錢包,而伺服器對此則無能為力。類似的,如果執行伺服器的公司出了什麼意外,或災禍,或跑路了。你也不能使用了。

延伸版的2-of-2解決了這個問題。本質上,每一次你的客戶端發起一個新的交易,它實際上產生兩個交易:一個是你希望的資金轉移,第二個是在第一個交易完成後,將你其餘的資金轉移到另一個由你控制的地址。但是隻有第一個是公開的,----第二個交易返還給你,這樣即便伺服器消失你依然有辦法恢復你的資金。注意這是2-of-2地址,伺服器無法在不經你同意的情況下撤銷你的交易。應該注意的特殊的一點是,伺服器應該是第一個簽署交易的,而不是第二個,否則伺服器就可以惡意的只簽署第一個交易而不簽署第二個,然後跑路,將使用者留風中哭泣。

第二種策略是簡單的2-of-3.有三條秘鑰:你的秘鑰,伺服器秘鑰,還有一個由你以安全的離線方式儲存的秘鑰。就像上面一樣,你簽署交易,伺服器向你的手機傳送一個驗證碼,你在電腦上輸入驗證碼,伺服器簽署交易;這就是全部了。如果你丟失了密碼,你可以使用備用秘鑰和伺服器秘鑰傳送交易到一個新錢包;如果你或者服務期被攻擊了,那攻擊者也僅僅是獲得了三分之一秘鑰,如果伺服器有意作惡或者跑路,它僅僅掌握三分之一秘鑰,而你掌握三分之二。與2-of-2的邏輯類似,你丟失你的秘鑰或伺服器消失的情況下,你可以申請一個緊急交易。因此,我們有兩個稍有不同但是在很多方面類似的協議來建立一個多重簽名,以防單點故障……

……直到我們開始考慮軟體程式碼。一個流行的多重簽名錢包是bitgo,當前多數情況下作為一個客戶端javascript網頁應用出現;因此我們可以使用分析blockchain.info一樣的方法來分析bitgo(注意,我並沒有特意針對bitgo,它僅僅是最突出和資金充足的一個,其他類似的選擇,通常工作原理與之一樣。)如果攻擊者控制了bitgo的伺服器,他們就有能力向使用者輸送錯誤的網頁應用。

現在,人們可以合理的認為,(1)bitgo是一個值得信任的公司,因此他們不太可能監守自盜,(2)多重簽名的存在意味著攻擊者必須從兩方面而不是一方面攻擊bitgo。

但是,這並沒有繞開最開始的軟肋。中心化的伺服器端錢包可以達到相同的安全效果,不需要使用者儲存秘鑰那麼複雜,只要額外增加一個多重簽名步驟或者秘密分享到他們的冷錢包就可以了。因此,這種客戶端瀏覽器多重簽名錢包可以被認為,完全是對加密經濟安全性的威脅。這並不是說bitgo不安全,相比於大多數的選擇,它還是不錯的。這只是說,這種“多重簽名”並沒有提供一些人想象它具有的,精確的安全保證。

為什麼瀏覽器javascript與多重簽名組合在一起是有問題的?其哲學原因是,瀏覽器javascript多重簽名錢包的提供者,與很多桌面應用的提供者一樣,在試圖從一開始就建立一個不受單點故障影響的協議,但是他們在協議中同時扮演兩個角色:客戶端和伺服器,這使他們在現實中犧牲了原定的優勢。問題看起來是基礎性的,在任何互動中,考慮到客戶端的重要性,這個問題可能是無解的。就像我們上面看到的,無論你如何下載一個軟體,除非你有時間檢查每一行程式碼,我們不得不預設你是相信軟體的提供者的。乍看起來,這個問題是無解的,但是就像我們即將看到的,有解決辦法。解決辦法又一次來源於多重簽名——這一次是正確的方向。

未熔合的多重簽名

我相信現實生活中我見到的多重簽名的正確實現是基於 cryptocorp. cryptocorp實現多重簽名的方法有根本不同:不是試圖採用paypal的模式(事實上,幾乎所有前加密時代商業的模式),將介面和安全提供者打包處理。cryptocorp歸納和提煉了介面的角色,將安全提供者作為他們唯一的核心產品。這就是說,cryptocorp將他的大多數資源用來專門發展和改進它的簽名資料庫伺服器的演算法和高階功能。而讓其他的錢包提供者與之結合,來提供有相相容的接合點。在3月份在德克薩斯舉行的比特幣會議上,cryptocorp展示了改進的electum錢包原型;現在他們在與超過十個錢包提供商合作,整合支援他們的分伺服器。

當然,一個問題是,cryptocorp的伺服器有什麼特別呢?如果是一個使用谷歌認證做手機二次驗證的app,簽署幾天內可被寫入nodejs的交易;這個我自己都能做。cryptocorp的出色之處在於用來甄別不正當交易的先進演算法。花三刀買杯咖啡?cryptocorp甚至不耐煩去等待確認;花500刀買個膝上型電腦?也需要稍微嚴格的檢查一下;花50000刀買個汽車?準備好接受接近kyc認證那樣的檢驗吧。除非收款地址被認為屬於老牌的bitpremier,在那種情況下可以經過較少的麻煩傳送交易,因為一旦你發生錯誤,你總是可以要求退款——而如果接收地址與駭客有所關聯,那麼即使是3刀的交易也會請求檢驗。

那麼為什麼cryptocorp的方式更好呢?從以上我對多重簽名常見方式的批評來看,答案是顯而易見的:整個資料庫的建立和整個軟體的維持是完全分開的。事實上,即使你的軟體完全被攻擊者控制,使用cryptocorp,你依然是相當安全的。你可以使用獨立的工具驗證你看到的地址是不是合法的(而不是所有的秘鑰實際上控制在攻擊者手中的虛假的多重簽名)。客戶端不能單方面傳送交易,如果客戶端試圖發起更加狡猾的攻擊,比如改變交易的輸出或者數額,資料庫會發現它。因此,實際上,不會有單點故障的失敗,加密貨幣零信任的許諾最終得以實現。

值得注意的是,cryptocorp並不是以廣義和高模組化的方式做事的唯一的公司, codius,其資料庫基礎來自ripple的智慧合約平臺,再以幾乎相同的方式解決這個問題。還有基於消費者保護的立場的bitrated,和他的買家、賣家、公證人的開放市場。儘管bitrated有所下降,因為它是一個瀏覽器基礎的網頁應用,而不是一個客戶端應用或瀏覽器擴充套件。或者實現與協議多樣的相容會更好。

去中心化友好的商業文化

要讓加密商業更像cryptocorp, codius 或者bitrated,而不是更像paypal,我們有很長的路要走。在技術商業社羣,很大的力量總是傾向於創造一個一站式解決的生態系統。而不是一個單一的元件,修建一個“護城河”,這樣你的使用者無法離開你的產品。前者恰恰是走向了去中心化生態系統的反面。商品化,普遍化,關注點分離的原則對一個去中心化生態系統的健全是如此的重要。儘管目前如果你有一個安全和壟斷的位置,公司利潤會有巨大的增長。但是加密貨幣應用變得模組化和可替換是這個遊戲的未來。

我們必須注意到,cryptocorp已經試圖超越這個障礙,透過實現真正真正好的簽名資料庫,超越“只是簽名資料庫”的烙印——與cryptocorp合作的錢包也做了同樣的事情。甚至交易所,或許在全世界有許許多多的的交易所,依然試圖將他們自身與加密貨幣區分開來。但目前,在服務中的仲裁服務比如bitrated,仲裁者可以選擇專門從事不同的行業,不同的商業模式(比如,產品質量的接受標準,消費者希望讀到的購買協議的程度,等等),並有允許他們支付最少費用的最佳的風險模式。

此外,也許執行一個多重簽名資料庫不一定非得是在買賣中。像dns伺服器,任務可以簡單地商品化,並由大公司,非盈利的研究團隊和愛好者共同完成。這樣的情形會更好,因為各自完成自己的部分,會有一個穩定獨立的收入來源,和更多的維護聲譽的需要,所以我們能夠預期資料庫跑路和欺詐更少。但是最終,如果社羣需要真正的去中心化,市場會以某種方式配置自身來實現它,唯一留下的事情是完成這個轉變的有組織的努力。

更新:bitgo的ben davenport已經回覆,說他們已經有了一個api支出使用他們的服務,就像一個純cryptocorp那樣,很快他們還將推出瀏覽器擴充套件。我讚賞他們的快速反應和對穩固安全性實踐的付出。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;