門(mén)限簽名技術(shù)及ZenGo錢包介紹
區(qū)塊鏈錢包作為數(shù)字貨幣世界的入口,它糟糕的體驗(yàn)把大部分人擋在門(mén)外,說(shuō)的就是你:助記詞備份(或私鑰備份)。現(xiàn)在一個(gè)激動(dòng)人心的簽名方案讓體驗(yàn)提升一大步,也是博客的主角:門(mén)限簽名技術(shù)及ZenGo錢包。
ZenGo錢包不需要備份助記詞,交易也不需要輸入密碼,一切只需要FaceID/TouchID。
私鑰是一切
在數(shù)字貨幣里擁有賬戶的私鑰就表示擁有了資金的所有權(quán),助記詞則是推倒出私鑰的一種方式,我有另一遍文章介紹過(guò)助記詞與私鑰的推倒關(guān)系[1],這里不復(fù)述。
為了保證資金的安全,助記詞(或私鑰)的保管就需要足夠的小心, 一方面我們要進(jìn)行備份,乙方私鑰丟失,另一方面由于備份也會(huì)增加被盜風(fēng)險(xiǎn),這也是錢包糟糕的體驗(yàn)的一大原因(貌似安全和體驗(yàn)無(wú)法兼得)。
為了提高資產(chǎn)的安全性,尤其是大額資產(chǎn),目前通常有這兩個(gè)方案:多簽簽名(MultiSig)和 密鑰共享(Secret Sharing)模式。
門(mén)限簽名(TSS)方案可以理解為是這兩個(gè)方式的結(jié)合,所以先介紹這兩個(gè)方案。
多簽簽名 MulTISig
如果大額的資產(chǎn),通常會(huì)使用多簽(MulTISig)的方式來(lái)分擔(dān)風(fēng)險(xiǎn)與責(zé)任,多簽通常需要有多個(gè)私鑰(N),只有當(dāng)其中的M個(gè)私鑰參與的簽名,才可以動(dòng)用資產(chǎn),因此正確使用(不把私鑰放在一起,由不同的人保管),確實(shí)可以提高安全性,因?yàn)榧词共糠炙借€被盜或丟失,資產(chǎn)依然是安全的。
多簽:一個(gè)有多把鑰匙的保險(xiǎn)柜
使用多簽簽名時(shí),還應(yīng)該避免私鑰復(fù)用,私鑰復(fù)用會(huì)增加私鑰泄漏的風(fēng)險(xiǎn)。
多簽簽名通常使用鏈上合約(或腳本)實(shí)現(xiàn),這也給多簽帶來(lái)一個(gè)缺點(diǎn):需要支付更高的交易費(fèi)用以及多人異步簽名導(dǎo)致的更長(zhǎng)的交易確認(rèn)時(shí)間。
密鑰共享(Secret Sharing Scheme)模式
密鑰共享模式 (簡(jiǎn)稱:SSS) 通過(guò)將密鑰分成多個(gè)部分并以冗余方式分開(kāi)保管,發(fā)起交易則將一定數(shù)量的密鑰重新組裝為密鑰進(jìn)行簽名,這個(gè)方案也可以密鑰被盜的分享,同時(shí)解決了上述多簽費(fèi)用高的缺點(diǎn)。不過(guò)SSS 有一個(gè)主要缺點(diǎn):當(dāng)密鑰被重新組裝時(shí),會(huì)為攻擊者提供了獲取密鑰的可乘之機(jī)。
密鑰共享:一個(gè)把鑰匙分層多個(gè)部分
門(mén)限簽名(Threshold signatures)方案
門(mén)限簽名方案(簡(jiǎn)稱:TSS)則結(jié)合 SSS 和多簽的優(yōu)點(diǎn),它基于多方安全計(jì)算 (MPC: MulTI-Party ComputaTIon ) 使用多個(gè)分片(目前是兩個(gè)部分)的秘鑰輪流進(jìn)行(交易)簽名,生成最終有效的簽名。大家可以理解為:先用一個(gè)鑰匙旋轉(zhuǎn)一個(gè)角度,再用另一個(gè)鑰匙旋轉(zhuǎn)一個(gè)角度才可以打開(kāi)保險(xiǎn)柜。
技術(shù)細(xì)節(jié)可以閱讀ZenGo 說(shuō)明[2]和論文:Fast Secure Two-Party ECDSA Signing[3]
門(mén)限簽名方案跟前面多簽和 SSS 方案不同的是:
?多簽通常是需要 M/N 個(gè)簽名,而門(mén)限簽名(目前)需要多方都參與簽名。
?多簽通常是鏈上進(jìn)行的,費(fèi)用較高,并且不同的鏈多簽的實(shí)現(xiàn)方案差別很大。而門(mén)限簽名是鏈下的純密碼學(xué)的計(jì)算生成簽名,兼容性更強(qiáng)。
?多簽是可以異步進(jìn)行簽名,而門(mén)限簽名要求所有參與方在操作過(guò)程中都同時(shí)在線。
?和 SSS 也不一樣,SSS雖然分片密鑰,但是最終要重構(gòu)出密鑰來(lái)簽名,那么就存在單點(diǎn)故障和重構(gòu)出的密鑰被泄露的可能。而門(mén)限簽名不需要重構(gòu)出密鑰。
ZenGo 錢包
ZenGo 錢包則運(yùn)用了門(mén)限簽名方案,它使用兩個(gè)獨(dú)立(部分)秘鑰來(lái)取代傳統(tǒng)的單個(gè)私鑰模式。其中一個(gè)秘鑰保存在手機(jī)上(用 TouchID/FaceID 授權(quán)訪問(wèn)),另一個(gè)存儲(chǔ)在 ZenGo 服務(wù)器上,在進(jìn)行交易的時(shí)候,手機(jī)和 ZenGo 服務(wù)器通信共同完成簽名。
實(shí)際使用時(shí),ZenGo體驗(yàn)很好,強(qiáng)調(diào) Keyless 概念,只需要touchID或faceID 授權(quán)就可以進(jìn)行交易。
注意:ZenGo僅用來(lái)做交易簽名,服務(wù)器和設(shè)備進(jìn)行通信簽署交易,通信過(guò)程不會(huì)相互暴露秘鑰,僅僅是對(duì)簽名后的數(shù)據(jù)進(jìn)行通信。
ZenGo的方案只要兩部分不同時(shí)發(fā)生問(wèn)題(如泄漏),可以確保資產(chǎn)總是安全的, 我們分別考慮下設(shè)備丟失和ZenGo服務(wù)關(guān)停的問(wèn)題。
設(shè)備丟失(或盜竊)怎么辦?
當(dāng)設(shè)備丟失(或盜竊)時(shí),獲得設(shè)備的人由于沒(méi)有我們的 TouchID/FaceID ,可以確保我們的資金不會(huì)被轉(zhuǎn)移。
那么如何取回自己的資產(chǎn)呢?ZenGo 錢包提供了一個(gè)對(duì)設(shè)備部分的秘鑰備份的方案:設(shè)備秘鑰通過(guò)加密之后存儲(chǔ)在 ZenGo 服務(wù)器上, 而對(duì)應(yīng)的解密秘鑰則單獨(dú)存儲(chǔ)在個(gè)人 iCloud 帳戶中,通過(guò)兩步認(rèn)證授權(quán)恢復(fù)解密秘鑰。
因此只要設(shè)備丟失和icloud關(guān)停兩件事情不同時(shí)發(fā)生,就可以還原出設(shè)備部分秘鑰,從而取回資產(chǎn)。
ZenGo 服務(wù)關(guān)停怎么辦?
盡管ZenGo宣稱有最好的安全性和穩(wěn)定性,ZenGo同樣提供了方案應(yīng)對(duì)ZenGo服務(wù)關(guān)停的風(fēng)險(xiǎn):
ZenGo 構(gòu)建了第三方獨(dú)立的托管服務(wù) Escrow[4] 和 監(jiān)聽(tīng)服務(wù)Trustee[5] 。
Escrow 可以理解為是ZenGo服務(wù)器的一個(gè)備份,而 Trustee 則會(huì)監(jiān)聽(tīng) ZenGo 服務(wù)的狀態(tài),當(dāng) Trustee 發(fā)現(xiàn)ZenGo 服務(wù)關(guān)停時(shí),它會(huì)請(qǐng)求 Escrow 把對(duì)應(yīng)的秘鑰轉(zhuǎn)移到每個(gè)用戶Github賬號(hào)。這種情況ZenGo錢包(客戶端)會(huì)進(jìn)入恢復(fù)模式,從而還原私鑰,這個(gè)私鑰可以直接進(jìn)行交易簽名進(jìn)行資產(chǎn)轉(zhuǎn)移,也可以把這個(gè)私鑰導(dǎo)入到其他的錢包。
細(xì)節(jié)可閱讀參考文章4和5, 以下是一個(gè)恢復(fù)模式的示意圖:
ZenGo 開(kāi)源與懸賞
ZenGo 可謂業(yè)界良心,不單提供了解決方案還開(kāi)源了代碼Github[6] 同時(shí)為了提高安全性,ZenGo 開(kāi)啟了懸賞計(jì)劃[7],如果你發(fā)現(xiàn)什么漏洞,1個(gè)BTC在等著你。