我們知道,在密碼貨幣世界,私鑰就代表著資產(chǎn),而私鑰的遺忘或者遭竊,對(duì)于任何人來(lái)說(shuō)都是毀滅性的,歷史上有很多人因?yàn)檫z忘了私鑰而丟失了自己早期投資的密碼貨幣,有的甚至因此而痛失了價(jià)值數(shù)億的資產(chǎn)。
而關(guān)于私鑰安全的解決方案,一種是冷存儲(chǔ),另一種則是多重簽名技術(shù)。
本文則要探討多重簽名技術(shù)的應(yīng)用。一般多簽技術(shù)分為兩類,一類是N-of-N,即需要所有私鑰持有者進(jìn)行簽名才能使交易生效,這是令黑客最頭疼的,因?yàn)樗枰瑫r(shí)攻破所有人的私鑰才能夠控制資產(chǎn)。而常用的N-of-N多簽方案有2-of-2,3-of-3。
而另一類方案則是N-of-M (其中N小于M),即M個(gè)私鑰當(dāng)中,至少有N個(gè)私鑰進(jìn)行簽名,則交易可生效。這種方案也是幣圈公司常用的一類方案,最為常用的方案有2-of-3。
然而,這些多簽方案同時(shí)這也會(huì)引入很大的風(fēng)險(xiǎn),例如其中某個(gè)私鑰丟失(某個(gè)持有者發(fā)生意外),或者某個(gè)私鑰持有者心生貪念而向其他持有者發(fā)出威脅時(shí),那么相關(guān)資產(chǎn)就會(huì)處于丟失危險(xiǎn),我們可以把這類無(wú)法動(dòng)用資產(chǎn)的情況統(tǒng)一稱為癱瘓。
而既要很好地防御黑客的攻擊,又要預(yù)防無(wú)法動(dòng)用資產(chǎn)的情況,這似乎成為了一個(gè)悖論。
那到底有沒(méi)有解決辦法呢?
來(lái)自康奈爾大學(xué)的計(jì)算機(jī)科學(xué)教授Ari Juels(工作量證明機(jī)制提出者之一),康奈爾大學(xué)博士后Iddo Bentov, 康奈爾大學(xué)計(jì)算機(jī)科學(xué)博士生Fan Zhang,康奈爾大學(xué)計(jì)算機(jī)科學(xué)博士生Phil Daian共同提出了一種稱為癱瘓證明(Paralysis Proofs)的技術(shù),這使得多重簽名方案又有了新的可能。
以下為整合譯文(注:其中的“我們”,指康奈爾大學(xué)的研究者):
從埋藏于“金銀島”的黃金寶藏,到七枚失蹤的法貝熱彩蛋,丟失和被盜的寶藏,一直是傳說(shuō)中的事情。然而,在比特幣的世界,這里沒(méi)有公主、惡龍或者海盜,這里也沒(méi)有太多的浪漫。財(cái)富的丟失,往往只是因?yàn)楣P記本電腦上的私鑰遺失了,或者弄丟了自己打印或抄寫(xiě)的帶有私鑰的紙條,又或者是遭到了黑客的洗劫。
密鑰管理在任何密碼系統(tǒng)中都是至關(guān)重要的。像比特幣和以太坊這樣的密碼貨幣也不例外。私鑰的丟失或被盜,可能是災(zāi)難性的,而要很好地處理私鑰也是一件非常困難的事情。用戶需要保護(hù)他們的私鑰,以免受狡猾黑客的竊取,同時(shí)又要妥善地保護(hù)它們以防資產(chǎn)丟失。密鑰管理在商業(yè)情景下尤其具有挑戰(zhàn)性,通常沒(méi)有人會(huì)信任完全被控制的資源。
一般而言,我們會(huì)使用多重簽名(multisig)技術(shù)來(lái)管理密碼貨幣的私鑰,這是一種強(qiáng)大的方法,簡(jiǎn)單說(shuō)就是讓多個(gè)用戶分別保管一個(gè)私鑰,而要進(jìn)行交易,就需要其中幾個(gè)私鑰進(jìn)行簽名。這種密鑰分發(fā)的方式,也被稱為秘密共享。
我們則發(fā)布了一篇論文,解決了一般秘密共享方案(尤其在密碼貨幣領(lǐng)域)存在的嚴(yán)重問(wèn)題。我們將這個(gè)問(wèn)題稱為癱瘓問(wèn)題。
秘密分享如何導(dǎo)致癱瘓問(wèn)題的發(fā)生?
幾個(gè)月前,一位熟人向我們提出了一個(gè)簡(jiǎn)單,但非常有趣的問(wèn)題,而它也是現(xiàn)實(shí)世界密鑰分發(fā)挑戰(zhàn)的一個(gè)很好的例子。
這位朋友(這里化名為Richie)和他的兩位商業(yè)伙伴共享了大量比特幣的所有權(quán)。而他們自然不希望當(dāng)中有任何一個(gè)人能夠把這些比特幣偷偷拿走。他們希望確保這些比特幣只有在所有人的同意下才能夠使用。有一個(gè)簡(jiǎn)單的解決方案,對(duì)吧?他們可以使用3 of 3的多重簽名方案,然后三個(gè)人都需要簽名才能夠使用這些比特幣。問(wèn)題似乎解決了!但真的是這樣嗎?
很顯然,故事到這里并沒(méi)有結(jié)束。當(dāng)然,Richie和他的合作伙伴也會(huì)擔(dān)心其中有人把私鑰給弄丟的情況。例如存儲(chǔ)密鑰的設(shè)備可能會(huì)壞掉,密鑰也有可能被錯(cuò)誤刪除,或者有人遭遇了一些非常不幸的情況(例如車禍),那么其中一名合伙人的私鑰就會(huì)丟失。則最終的結(jié)果是所有的比特幣就完全丟失了!
這并不是唯一糟糕的場(chǎng)景,Richie和他的合作伙伴也可能對(duì)如何花這些錢有著不同的看法,而且也無(wú)法達(dá)成協(xié)議。更糟糕的是,假設(shè)其中有一位合伙人是惡意或貪婪的,她可能通過(guò)扣留她的密鑰部分,來(lái)勒索其他人(換取資金)。在這種情況下,比特幣也可能會(huì)暫時(shí)或永久性地丟失。
這里使用了“癱瘓”這個(gè)術(shù)語(yǔ),以表示任何不能花費(fèi)比特幣的尷尬情況。不幸的是,N-of-N的多重簽名方案無(wú)法解決癱瘓問(wèn)題。事實(shí)上,它會(huì)使問(wèn)題變得更糟,因?yàn)閬G失任何一個(gè)密鑰都會(huì)是致命的。
出于這個(gè)原因,我們需要在滿足Richie及其合作伙伴目標(biāo)的同時(shí),也要避免掉癱瘓的情況,即需要讓所有人都同意花費(fèi)這些比特幣,這似乎是不可能的!假設(shè)我們有一個(gè)N-of-N 的多重簽名方案,而要完成一筆交易,我們顯然需要讓所有合伙人同意簽署才可以做到。如果(N-1)位合伙人可以在某位合伙人的密鑰丟失的情況下,以某種方式獲得對(duì)比特幣的訪問(wèn)權(quán)限,他們可簡(jiǎn)單地假裝其中一份密鑰已經(jīng)丟失,并自行獲取資金。換句話說(shuō),我們實(shí)際上一開(kāi)始實(shí)施的就是(N-1)of-N的多重簽名方案,這就產(chǎn)生了矛盾。
Richie的問(wèn)題,似乎讓我們處在了癱瘓的狀態(tài)。..。..
解決悖論
由于兩種強(qiáng)大技術(shù)的出現(xiàn)(區(qū)塊鏈和可信硬件),特別是英特爾SGX,事實(shí)證明我們實(shí)際上是可以解決這種悖論的。我們可以有效地在一般環(huán)境中做到這一點(diǎn),據(jù)我們所知,這是有史以來(lái)第一次。為此,我們引入了一種稱為癱瘓證明(Paralysis Proof)系統(tǒng)的新技術(shù)
正如你會(huì)看到的,在以太坊平臺(tái)當(dāng)中,我們可以相對(duì)容易地實(shí)施這種癱瘓證明系統(tǒng),我們只需要用到一個(gè)智能合約,而不需要英特爾SGX。我們?cè)谡撐闹刑峁┝艘蕴缓霞s的例子。然而,比特幣中存在的腳本約束,這使得它需要用到SGX設(shè)備,并且還會(huì)引入一些技術(shù)挑戰(zhàn)。
簡(jiǎn)單了解癱瘓證明系統(tǒng)
總體原理是相當(dāng)簡(jiǎn)單的。受信任的第三方,將所有的密鑰都保存在托管處。如果一方或多方不能或不愿簽署交易,則會(huì)導(dǎo)致上述的癱瘓情況,其他人則產(chǎn)生一個(gè)癱瘓證明,表明情況就是這樣的。鑒于此證明,第三方使用其持有的密鑰來(lái)授權(quán)交易。
但是,如果我們引入了一個(gè)可信的第三方,顯然,我們沒(méi)法實(shí)現(xiàn)Richie和他的朋友們提出的安全目標(biāo)。因?yàn)橛幸环娇梢钥刂扑械乃借€!
而這就是SGX發(fā)揮作用的地方了。SGX應(yīng)用,其行為基本類似于具有預(yù)定約束的可信第三方。例如,它可被編程,以便只有在提供有效證明時(shí)才能夠簽署交易。(從這個(gè)意義上講,SGX應(yīng)用的行為與智能合約非常相似。)感謝SGX,我們可以確保在可證實(shí)的癱瘓情況發(fā)生時(shí),讓多數(shù)私鑰持有者能夠訪問(wèn)到比特幣資產(chǎn)。
一些技術(shù)細(xì)節(jié)
當(dāng)然,即使考慮到SGX的這種魔力,我們?nèi)匀恍枰_保癱瘓證明(Paralysis Proof)的生成是合法的。我們不希望Richie的合作伙伴能夠“指控”他,錯(cuò)誤地聲稱他已經(jīng)死亡,比如說(shuō)對(duì)運(yùn)行SGX應(yīng)用的主機(jī)發(fā)起日食攻擊( eclipse attack)。令人高興的是,區(qū)塊鏈本身提供了一種強(qiáng)有力的方式來(lái)傳輸消息,并讓某方知道傳輸者還活著。為了在比特幣網(wǎng)絡(luò)上實(shí)施癱瘓證明系統(tǒng),我們利用了這個(gè)事實(shí)以及一些技巧。為了簡(jiǎn)單起見(jiàn),我們將重點(diǎn)關(guān)注無(wú)法訪問(wèn)的密鑰的問(wèn)題,而暫時(shí)擱置其他形式的癱瘓情況。
一個(gè)癱瘓證明會(huì)被構(gòu)建,證明某P方不及時(shí)響應(yīng)(無(wú)法簽署交易)。該系統(tǒng)會(huì)發(fā)出一個(gè)挑戰(zhàn)(challenge),“被控”方必須對(duì)我們所謂的“生命信號(hào)”作出回應(yīng)。如果在一段預(yù)定的時(shí)間內(nèi)(例如24小時(shí))沒(méi)有生命信號(hào)響應(yīng)這一挑戰(zhàn),則這種缺席便構(gòu)成了癱瘓證明。
而對(duì)于比特幣而言,P方的生命信號(hào),可以采用可忽略不計(jì)數(shù)量(例如0.00001 BTC)的比特幣UTXO形式,它可以是由P方發(fā)出(從而證明她還存在),或者通過(guò)pk_SGX發(fā)出(但需要等延遲過(guò)后才可以進(jìn)行)。請(qǐng)注意,sk_SGX僅是被SGX應(yīng)用所知的。
讓我們?cè)倌萌齻€(gè)合伙人作為例子。假設(shè)他們每個(gè)人都擁有一個(gè)密鑰對(duì) (sk_i, pk_i)。首先,他們會(huì)托管自己的比特幣資金(假設(shè)有5000 BTC)到UXTO_0這個(gè)可花費(fèi)的輸出,當(dāng)三人都同意的情況,或者通過(guò)pk_SGX,就可以對(duì)其進(jìn)行使用。現(xiàn)在,假設(shè)P_2和P_3決定指控P_1。SGX應(yīng)用在收到兩人的請(qǐng)求之后,會(huì)準(zhǔn)備以下兩筆交易,并將其發(fā)送給P_2 和 P_3:
· t_1(交易1)創(chuàng)建了0.00001 BTC 的生命信號(hào)UTXO_1 ,對(duì)此pk_1可以立即使用它,或者在超時(shí)后(例如144個(gè)區(qū)塊,約24小時(shí))可由pk_SGX使用;
· t_2 (交易2)會(huì)花費(fèi)UTXO_0以及生命信號(hào)UTXO_1,然后將它們發(fā)送到一個(gè)可由pk_2和pk_3控制的地址(或者,如果他們想要留在癱瘓證明系統(tǒng)當(dāng)中,pk_SGX也是可選的)。
因此,指控P_1的合伙人應(yīng)該向比特幣網(wǎng)絡(luò)廣播t_1,等待t_1被添加到區(qū)塊鏈后,再等待接下來(lái)的144個(gè)區(qū)塊,然后將t_2廣播到比特幣網(wǎng)絡(luò)。而在這期間,會(huì)出現(xiàn)兩種可能的結(jié)果:
· 在合法指控的情況下,P_1確實(shí)是無(wú)法使用t_1交易的,而一旦t_2交易被網(wǎng)絡(luò)確認(rèn),則P_2和P_3將獲得比特幣的訪問(wèn)權(quán)。這確保了BTC基金的可用性。
· 然而,在發(fā)生惡意指控的情況下,上述方案確保P_1在144個(gè)區(qū)塊時(shí)間內(nèi)可提出上訴。為此,P_1可使用那個(gè)僅為她所知的密鑰,來(lái)花費(fèi)UTXO_1。由于t_2將UTXO_0和UTXO_1都作為輸入,因此花費(fèi)t_1,會(huì)使得t_2成為一筆無(wú)效交易。
安全論證
生命信號(hào)的安全性,源于在t_1中使用了CheckSequenceVerify。詳細(xì)地講,只有當(dāng)每個(gè)輸入的驗(yàn)證部分(比特幣當(dāng)中被稱為腳本簽名-ScriptSig)都是正確的時(shí)候,t_2才會(huì)有效。SGX飛地設(shè)備為花費(fèi)托管基金而而生產(chǎn)的驗(yàn)證部分會(huì)立即生效,但只有在t_1交易被納入比特幣區(qū)塊鏈之后(需等待144個(gè)區(qū)塊,由于CSV條件),花費(fèi)t_1的驗(yàn)證部分才會(huì)有效。因此,將超時(shí)參數(shù)設(shè)置為較大值有兩個(gè)目的:(1)給予P1足夠的響應(yīng)時(shí)間,以及(2)確保攻擊者無(wú)法通過(guò)制造自己的鏈取代比特幣區(qū)塊鏈。
在以太坊平臺(tái)上的應(yīng)用
以上提到的都是關(guān)于比特幣的例子,但癱瘓證明系統(tǒng)其實(shí)不僅僅可以應(yīng)用于比特幣,對(duì)于像以太坊這樣的智能合約平臺(tái),其實(shí)現(xiàn)會(huì)更為簡(jiǎn)單,我們可通過(guò)合約替換掉對(duì)可信SGX硬件的需求。
我們給出的參考實(shí)現(xiàn)代碼只有117行,以下為其中的主要邏輯:
function spend(uint256 proposal_id) public {
// Get rid of any paralyzed keyholders
prune_paralyzed_keyholders();
require(is_keyholder(msg.sender));
require(proposal_id 《 proposals.length);
// add sender‘s signature to approval
proposal_sigs[proposal_id][msg.sender] = true;
// if enough proposers approved, send money
uint num_signatures = 0;
for (uint256 i = 0; i 《 keyholders.length; i++) { if (!paralyzed[keyholders[i]]) { if (proposal_sigs[proposal_id][keyholders[i]]) { num_signatures++; } } } if ((num_signatures) 》= required_sigs) {
if (!proposals[proposal_id].filled) {
proposals[proposal_id].filled = true;
proposals[proposal_id].to.transfer(proposals[proposal_id].amount);
}
}
}
function remove(address accused) public {
// Get rid of any paralyzed keyholders (prevent paralyzed requester)
prune_paralyzed_keyholders();
// both requester and accused must be keyholders
require(is_keyholder(msg.sender));
require(is_keyholder(accused));
// There shouldn’t be any outstanding claims against accused
require(!(paralysis_claims[accused].expiry 》 now));
// Create and insert an Paralysis Claim
paralysis_claims[accused] = ParalysisClaim(now+delta, false);
NewAccusation(accused, now + delta); // Notify the accused
}
function respond() public {
require(paralysis_claims[msg.sender].expiry 》 now);
paralysis_claims[msg.sender].responded = true;
}
完整的合約代碼,讀者可訪問(wèn):https://github.com/pdaian/paralysis_proofs 查看
其它的應(yīng)用
而除了密碼貨幣應(yīng)用,癱瘓證明技術(shù)還可以應(yīng)用于憑證解密。你可以使用癱瘓證明來(lái)創(chuàng)建一個(gè)用于釋放文件的證明,允許一個(gè)人或一組人對(duì)其進(jìn)行解密。以下是一些應(yīng)用示例,這些策略可以通過(guò)區(qū)塊鏈(審查阻力通道)和SGX的組合來(lái)實(shí)現(xiàn):
· 每日支出限額:可確保在24小時(shí)內(nèi),從一個(gè)公共池中能夠花費(fèi)的資金,不會(huì)超過(guò)一個(gè)預(yù)先商定的金額(比如說(shuō)0.5 BTC,作者們?cè)谠撐闹杏懻摿艘恍?shí)際限制)
· 事件驅(qū)動(dòng)的訪問(wèn)控制:使用一個(gè)oracle,例如Town Crier系統(tǒng)(實(shí)際上是第一個(gè)面向公眾的SGX應(yīng)用),這可以在現(xiàn)實(shí)世界的事件中對(duì)訪問(wèn)控制策略進(jìn)行條件化。例如,通過(guò)提供匯率數(shù)據(jù)反饋,每日支出限額可能以美元而非BTC計(jì)價(jià)。人們甚至可原則上使用自然語(yǔ)言處理響應(yīng)現(xiàn)實(shí)世界的事件。例如,如果因?yàn)橐环菥哂行孤?a target="_blank">信息的文件,其作者被美國(guó)聯(lián)邦政府起訴,那么某個(gè)記者就可以對(duì)這份文件進(jìn)行解密。
· 升級(jí)閾值要求:如果預(yù)先設(shè)定數(shù)量的參與者同意,就可以在訪問(wèn)結(jié)構(gòu)中添加和刪除參與者,即更改關(guān)于授權(quán)參與者數(shù)量的規(guī)則。例如,可以把k-of-N的多重簽名方案更改為(k+1)-of-(N+1)的簽名方案。在常規(guī)的秘密共享方案當(dāng)中,這是不可能進(jìn)行升級(jí)的,因?yàn)橐唤M授權(quán)參與者總是可以重建他們持有的私鑰。但是,如果SGX應(yīng)用控制了解密密鑰,它就可以監(jiān)視區(qū)塊鏈,以確定參與者是否已投票進(jìn)行升級(jí),如果它們被記錄到了區(qū)塊鏈上,則投票不會(huì)受到抑制。
存在的安全隱患以及未來(lái)的改進(jìn)工作
當(dāng)然,在引入可信SGX硬件的同時(shí),也會(huì)引入側(cè)信道攻擊((side channel attack)的風(fēng)險(xiǎn),這也是這個(gè)方案主要會(huì)遇到的問(wèn)題。而在未來(lái)的工作當(dāng)中,我們將探索減輕這種攻擊的技術(shù)。例如,在一個(gè)允許N-of-N多簽方案可被降級(jí)為 (N ? 1)-of-N多簽方案的系統(tǒng),有可能讓一個(gè)SGX飛地應(yīng)用存儲(chǔ)和有條件地釋放單個(gè)私鑰,而不是控制一個(gè)主私鑰。這將限制側(cè)信道攻擊帶來(lái)的危害。我們也可以在多個(gè)SGX飛地設(shè)備存儲(chǔ)密鑰,這有助于減輕節(jié)點(diǎn)的失效風(fēng)險(xiǎn),同時(shí)也有助于恢復(fù)節(jié)點(diǎn)故障,這是另一個(gè)需要去研究的工作。
附錄
在論文當(dāng)中,我們討論了很多有趣的擴(kuò)展部分內(nèi)容,以下是其中列出的兩點(diǎn):
利用契約(covenants)提議的癱瘓證明
如上所述,由于比特幣存在腳本約束,想要在該網(wǎng)絡(luò)上應(yīng)用癱瘓證明,就需要使用SGX設(shè)備。實(shí)際上,我們還提出了一種不需要用到可信硬件,但“效率稍低”的方法,這就需要用到一種稱為covenants(契約)的提議比特幣功能。然而,使用這種方法的復(fù)雜性,明顯會(huì)高于SGX可信硬件方法(無(wú)論是概念還是鏈上復(fù)雜性方面),因此我們并不推薦。
另一種更好的方案
在前面提到的例子當(dāng)中,資金可以由pk_SGX單獨(dú)使用,但重要的是,這不是唯一的選擇。事實(shí)上,人們可以在安全性和癱瘓容忍度之間進(jìn)行權(quán)衡,以最好地滿足他們的需求。
例如,如果三位合伙人只希望容忍最多一個(gè)缺失的私鑰,他們可以做的,是把資金轉(zhuǎn)移到一個(gè)3-of-4 的多簽地址當(dāng)中,其中第四個(gè)參與者就是SGX飛地設(shè)備。如果所有人都活著,那么他們可以在不需要SGX的情況下使用比特幣資金。如果其中有一位合伙人出現(xiàn)了意外,他無(wú)法進(jìn)行簽名,如果剩下的兩名合伙人能夠展示癱瘓證明,則SGX飛地設(shè)備將釋放出它的私鑰。因此,即使攻擊者通過(guò)側(cè)信道攻擊攻破了SGX設(shè)備持有的私鑰,他也無(wú)法花費(fèi)這些比特幣資金,而唯一例外情況,就是兩位合伙人是和攻擊者串通好的。
評(píng)論
查看更多