胡鋒鳴,趙紅武,金 瑜
(1.武漢科技大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,湖北 武漢 430065;2.湖北省智能信息處理與實(shí)時(shí)工業(yè)系統(tǒng)重點(diǎn)實(shí)驗(yàn)室,湖北 武漢 430065)
2008年11月1日,中本聰(Satoshi Nakamoto)發(fā)布了比特幣白皮書,提出了比特幣概念[1]。而后2009年1月,中本聰創(chuàng)建了第一個(gè)區(qū)塊,被稱為“上帝區(qū)塊”,幾天后第二個(gè)區(qū)塊誕生,與創(chuàng)世區(qū)塊連接形成了鏈,標(biāo)志著區(qū)塊鏈誕生。區(qū)塊鏈作為一種具有去中心化、不可篡改、可追溯、可信特性的分布式數(shù)據(jù)庫,受到了廣泛關(guān)注[2]。經(jīng)過了十幾年時(shí)間,區(qū)塊鏈技術(shù)不斷發(fā)展革新,應(yīng)用廣泛,其所出現(xiàn)的隱私問題得到了許多研究者關(guān)注[3-5]。區(qū)塊鏈的可溯源、可驗(yàn)證等特性是基于系統(tǒng)中所有交易數(shù)據(jù)公開產(chǎn)生的,因此這導(dǎo)致惡意攻擊者可以通過分析數(shù)據(jù)窺探用戶隱私。
近年來,由于研究者對(duì)區(qū)塊鏈系統(tǒng)中隱私問題的關(guān)注,區(qū)塊鏈隱私保護(hù)技術(shù)不斷出現(xiàn)。其中,混幣機(jī)制在保證原有交易結(jié)果不變的前提下對(duì)交易過程進(jìn)行混淆,從而抵抗攻擊者對(duì)賬本進(jìn)行分析。其中,去中心化混幣機(jī)制是目前最為流行的隱私保護(hù)技術(shù)之一。在該方法中,多方混幣機(jī)制CoinParty通過構(gòu)建門限托管賬戶,將參與者輸入資產(chǎn)作為抵押,提高了攻擊者拒絕服務(wù)攻擊成本。另一方面,CoinParty洗牌階段要求最后一個(gè)洗牌節(jié)點(diǎn)以字典序排序,避免了最后一個(gè)用戶操縱結(jié)果。但CoinParty存在一些不足:(1)引入了第三方節(jié)點(diǎn)來進(jìn)行洗牌,降低了安全性;(2)由第三方節(jié)點(diǎn)用地址的校驗(yàn)和驗(yàn)證輸出地址列表,導(dǎo)致最后一個(gè)洗牌節(jié)點(diǎn)可以用校驗(yàn)和相同的地址列表替換原有地址列表,從而盜取資產(chǎn);(3)效率低,每一個(gè)節(jié)點(diǎn)都需要進(jìn)行多層加密解密,洗牌結(jié)束后需要進(jìn)行廣播校驗(yàn)和驗(yàn)證,時(shí)間復(fù)雜度高。
基于此,該文提出了一種新的隱私保護(hù)機(jī)制(ShuffleParty)。ShuffleParty在CoinParty的基礎(chǔ)上進(jìn)行改進(jìn),通過在混幣參與者內(nèi)部選出洗牌節(jié)點(diǎn),由洗牌節(jié)點(diǎn)進(jìn)行洗牌后,將輸出地址結(jié)果交給混幣參與者進(jìn)行驗(yàn)證,并生成最終置換。選出洗牌節(jié)點(diǎn)進(jìn)行洗牌,避免了第三方節(jié)點(diǎn)進(jìn)行校驗(yàn)和驗(yàn)證帶來的安全性問題,增強(qiáng)了對(duì)隱私的保護(hù),同時(shí)也減少了通信和洗牌所需時(shí)間,提高了混幣效率。
區(qū)塊鏈技術(shù)為了保證區(qū)塊鏈上記錄數(shù)據(jù)的可溯源、可驗(yàn)證等特性,在分散節(jié)點(diǎn)之間維持?jǐn)?shù)據(jù)同步并對(duì)交易達(dá)成共識(shí),區(qū)塊鏈上所有交易信息都存儲(chǔ)在公開的全局賬本中,攻擊者很容易獲取所有交易信息。攻擊者可以通過分析區(qū)塊鏈賬本中記錄的交易數(shù)據(jù),發(fā)掘其中規(guī)律,將用戶的不同地址、交易數(shù)據(jù)關(guān)聯(lián),并進(jìn)一步對(duì)應(yīng)到用戶的現(xiàn)實(shí)身份,嚴(yán)重威脅到用戶隱私。Reid和Harrigan[6]通過對(duì)公布的賬戶進(jìn)行數(shù)據(jù)分析,統(tǒng)計(jì)出了對(duì)應(yīng)地址的資金余額、資金來源、資金流向等信息,并對(duì)區(qū)塊鏈地址及IP地址對(duì)應(yīng)關(guān)系進(jìn)行分析,揭露了比特幣用戶與實(shí)際物理位置的對(duì)應(yīng)關(guān)系。Androulaki等人[7]提出了挖掘找零地址方法,如果一個(gè)交易擁有兩個(gè)輸出,其中一個(gè)為已出現(xiàn)過的地址,另一個(gè)為新地址,則將新地址視為找零地址。Ron和Shamir[8]獲取比特幣的交易數(shù)據(jù),通過研究用戶行為、比特幣輸入輸出情況,得到了一些交易規(guī)律,結(jié)果表明用戶無法通過資產(chǎn)轉(zhuǎn)移有效保護(hù)個(gè)人隱私。
為了解決區(qū)塊鏈隱私問題,研究者提出了一種交換資產(chǎn)、混淆地址的防御機(jī)制,即混幣機(jī)制?;鞄艡C(jī)制有著多種不同實(shí)現(xiàn)方式,根據(jù)混幣操作者不同,分為中心化混幣和去中心化混幣兩種技術(shù)。
中心化混幣技術(shù)需要第三方節(jié)點(diǎn)中心化混幣服務(wù)商參與,幫助希望進(jìn)行混幣交易的用戶與其他用戶匹配,構(gòu)造混幣交易,并從中收取一定額度的手續(xù)費(fèi)。各個(gè)混幣用戶與混幣服務(wù)商進(jìn)行交易,混幣服務(wù)商收到用戶的資產(chǎn)后隨機(jī)混淆,然后返回給用戶指定的輸出地址?;鞄欧?wù)商作為混幣交易的中間者,讓攻擊者難以發(fā)現(xiàn)用戶的資金流向,通過分析僅僅只能將混幣參與者的地址聚類,無法分析出輸入地址和輸出地址之間對(duì)應(yīng)關(guān)系。但混幣服務(wù)提供商作為混幣交易第三方,在交易中會(huì)獲取所有用戶資金以及交易信息,存在安全隱患。最早的中心化服務(wù)例如BitLaundry采用最基礎(chǔ)的中心化混幣協(xié)議,平臺(tái)固定配置手續(xù)費(fèi)等參數(shù),導(dǎo)致攻擊者可以分析混幣交易的平臺(tái)地址和固定手續(xù)費(fèi)特征將其關(guān)聯(lián)在一起,并且也存在混幣服務(wù)商內(nèi)部做惡風(fēng)險(xiǎn)[9]。Bonneau等人[10]提出了Mixcoin協(xié)議,通過基于電子簽名承諾機(jī)制增強(qiáng)資產(chǎn)安全性,在混幣過程中混幣服務(wù)商需要進(jìn)行簽名。若混幣服務(wù)商出現(xiàn)違規(guī)行為,用戶可以公布服務(wù)提供商的簽名舉報(bào)混幣服務(wù)商違規(guī),該混幣服務(wù)商將會(huì)失去信譽(yù)。但該方案保護(hù)用戶資產(chǎn)安全,無法保證用戶的信息不被服務(wù)提供商泄露。Valenta等人[11]提出了Blindcoin協(xié)議,在沿用Mixcoin協(xié)議的簽名機(jī)制的基礎(chǔ)上,用戶采用盲簽名技術(shù)進(jìn)行簽名交易,保證第三方混幣服務(wù)商無法獲取到用戶輸入輸出地址關(guān)聯(lián)關(guān)系,解決了混幣服務(wù)商泄露混幣用戶信息的問題。
中心化混幣技術(shù)因?yàn)橹行幕鞄欧?wù)商的參與,方便用戶匹配其他混幣用戶,便于用戶使用。但與此同時(shí)帶來了安全性問題,中心化混幣服務(wù)提供商作為第三方節(jié)點(diǎn),存在安全隱患,會(huì)帶來一些潛在風(fēng)險(xiǎn),例如遭受黑客攻擊進(jìn)而盜竊用戶資產(chǎn)。為提高安全性,研究者提出了去中心化混幣技術(shù)。
去中心化混幣技術(shù)不需要第三方節(jié)點(diǎn)參與,通過多方參與協(xié)議代替中心化混幣服務(wù)提供商,用戶在網(wǎng)絡(luò)中自行尋找其他需要混幣用戶,通過多方參與者運(yùn)行協(xié)議方式構(gòu)造混幣交易。從根本上解決了中心化混幣存在的安全問題,也替用戶節(jié)省了混幣服務(wù)提供商的手續(xù)費(fèi)。Gmaxwall[12]在2013年首先提出了第一個(gè)去中心化混幣方案CoinJoin,該協(xié)議通過將多個(gè)相同金額的輸入輸出放入同一交易中構(gòu)造混幣交易,將多筆相同金額的單出入-單輸出交易合并成一個(gè)輸入輸出都相同的多輸入-多輸出交易,使外部攻擊者無法通過分析該交易分辨不同的輸出,得到每個(gè)輸入和輸出地址之間的關(guān)聯(lián)關(guān)系,確保了外部隱私性。但由于沒有第三方節(jié)點(diǎn),混幣參與者需要自行進(jìn)行協(xié)商,在協(xié)商階段,參與用戶的輸入輸出地址關(guān)聯(lián)信息會(huì)被其他混幣用戶獲取,內(nèi)部隱私性不能得到保障[13]。
為了解決CoinJoin方案的內(nèi)部隱私性問題,Ruffing等人[14]提出了CoinShuffle協(xié)議。該方案延續(xù)了CoinJoin核心思想,多個(gè)混幣參與者構(gòu)造一個(gè)金額相同的多輸入-輸出交易,保證外部隱私性。在CoinJoin基礎(chǔ)上,CoinShuffle增加了輸出地址洗牌機(jī)制,讓參與者按照一定順序進(jìn)行排列,每個(gè)參與者按照順序使用后面參與者的公鑰進(jìn)行加密,從第一個(gè)參與者開始將加密信息發(fā)給后面的參與者,后面的參與者接受用自己的私鑰進(jìn)行解密,并加入自己加密好的輸出地址進(jìn)行混淆,再發(fā)給下一個(gè)參與者,直到最后一個(gè)參與者,得到最終的輸出地址明文。將輸出地址列表交給參與者驗(yàn)證簽名后,創(chuàng)建混幣交易。CoinShuffle通過多層加密,使得中間的參與者無法看到明文,而最后一個(gè)參與者無法知道輸入輸出地址之間的關(guān)聯(lián),解決了內(nèi)部隱私性問題。但也存在一定缺陷:最后一個(gè)參與者可以決定輸出地址列表順序而非隨機(jī),攻擊者可以控制順序;多層加密解密、洗牌導(dǎo)致了該方案的效率偏低,若攻擊者進(jìn)行拒絕服務(wù)攻擊,整個(gè)洗牌過程又需要重新進(jìn)行[15]。
Ziegeldorf等人[16]提出了去中心化混幣協(xié)議CoinParty,由多個(gè)第三方混合節(jié)點(diǎn)共同構(gòu)建托管賬戶,混幣參與者將混幣資產(chǎn)放入托管賬戶進(jìn)行抵押,從而提高拒絕服務(wù)攻擊的代價(jià),一定程度上抵御拒絕服務(wù)攻擊。多個(gè)混合節(jié)點(diǎn)對(duì)輸出地址進(jìn)行洗牌,采用校驗(yàn)和對(duì)比所有輸出地址哈希值的和對(duì)洗牌結(jié)果進(jìn)行校驗(yàn)。并且要求最后一個(gè)洗牌節(jié)點(diǎn)按字典序排序生成地址列表,再以校驗(yàn)和作為偽隨機(jī)數(shù)生成器的依據(jù)生成最終隨機(jī)置換,在地址列表上加以最終置換得到最終混淆結(jié)果,避免了輸出地址列表被最后一個(gè)洗牌節(jié)點(diǎn)操縱。該方案成功解決了CoinShuffle中無法預(yù)防拒絕服務(wù)攻擊、最后一個(gè)洗牌節(jié)點(diǎn)操縱洗牌結(jié)果的問題,獲得了更好的安全性。但同時(shí)也引入了新的問題:CoinParty采取了多個(gè)第三方節(jié)點(diǎn)來進(jìn)行洗牌以及創(chuàng)建交易,第三方節(jié)點(diǎn)的加入帶來了安全性的降低;使用校驗(yàn)和對(duì)比所有輸出地址哈希值的和對(duì)洗牌結(jié)果進(jìn)行校驗(yàn),導(dǎo)致最后一個(gè)洗牌節(jié)點(diǎn)可以用相同哈希值和的輸出地址替換原有的輸出地址,從而盜取資產(chǎn),同時(shí)也帶來了額外的效率問題。TTShuffle[17]在CoinShuffle的基礎(chǔ)上進(jìn)行改進(jìn),將混幣參與者進(jìn)行分組,由組內(nèi)洗牌和組間洗牌兩階段完成洗牌過程,分散了洗牌操作,提高了混幣效率。但TTShuffle是在CoinShuffle基礎(chǔ)上改進(jìn),和CoinShuffle一樣無法防止拒絕服務(wù)攻擊。
ShuffleParty機(jī)制是在CoinParty的基礎(chǔ)上進(jìn)行改進(jìn),設(shè)計(jì)了基于洗牌節(jié)點(diǎn)選取的洗牌機(jī)制。該方案主要部分可以分成五個(gè)階段,即協(xié)商階段、承諾階段、洗牌階段、交易階段,以及混幣失敗時(shí)進(jìn)入問責(zé)階段(2.2節(jié)詳述)。ShuffleParty機(jī)制流程見圖1。
圖1 ShuffleParty機(jī)制流程
為解決CoinParty方案所存在的問題,本方案在保留CoinParty方案托管地址的機(jī)制的同時(shí),去除了第三方節(jié)點(diǎn),由參與者內(nèi)部選出洗牌節(jié)點(diǎn)進(jìn)行洗牌,最后將洗牌結(jié)果交給其他參與者進(jìn)行驗(yàn)證,避免最后一個(gè)洗牌節(jié)點(diǎn)通過替換相同哈希值和的輸出地址盜取資金。
在混幣參與者開始混幣方案后,由參與者協(xié)商,隨機(jī)選出M個(gè)洗牌節(jié)點(diǎn),并協(xié)商洗牌節(jié)點(diǎn)的洗牌順序,參與者計(jì)算出一組托管地址,將自己的資金轉(zhuǎn)入托管地址。然后,每個(gè)洗牌節(jié)點(diǎn)廣播其生成的密鑰(ek,dk)中的公鑰ek,每個(gè)普通參與者按照確認(rèn)好的洗牌順序,使用洗牌節(jié)點(diǎn)的公鑰ek對(duì)自己的輸出地址進(jìn)行層層加密,而洗牌節(jié)點(diǎn)使用后面洗牌節(jié)點(diǎn)的公鑰ek對(duì)輸出地址進(jìn)行層層加密。完成加密后,普通參與者將加密好的輸出地址發(fā)送給第一個(gè)洗牌節(jié)點(diǎn),第一個(gè)洗牌節(jié)點(diǎn)將收到的信息用自己的私鑰dk進(jìn)行一層解密,并加入自己加密好的輸出地址形成輸出地址列表,隨機(jī)洗牌后發(fā)送給下一個(gè)洗牌節(jié)點(diǎn)。層層解密后,最后一個(gè)洗牌節(jié)點(diǎn)加入自己的輸出地址,對(duì)輸出地址進(jìn)行字典序排序后,廣播最后的輸出地址列表。參與者檢查自己的輸出地址是否在列表中,地址列表是否是字典序排序。若輸出地址丟失或列表不是字典序排序,則洗牌無效,進(jìn)入責(zé)備階段找出違規(guī)者,托管地址中的資金退回到參與者輸入地址。反之,參與者以所有輸出地址哈希值的和作為偽隨機(jī)數(shù)生成器的依據(jù)生成公共隨機(jī)置換,得到最終混淆結(jié)果,按照最終結(jié)果生成交易。
(1)協(xié)商階段:N個(gè)混幣用戶在開始混幣機(jī)制后,形成初始節(jié)點(diǎn)集合U,公布自己的輸入地址In(n∈{1,2,…,N}),共同協(xié)商混幣金額v,洗牌節(jié)點(diǎn)數(shù)量M(M 算法1:Shuffle nodes selection 輸入:Collection of initial nodesU Number of Shuffle nodesM 輸出:Collection of shuffle nodesS (1)S←null (2)foriin range (1,M) (3)node←random(U) (4)S.add(node) (5) returnS (2)承諾階段:混幣參與者共同生成一個(gè)托管賬戶T,為了防止托管資金被惡意的混幣參與者竊取,T由一個(gè)新的ECDSA密鑰對(duì)生成,T在混幣參與者的聯(lián)合控制下。參與者n將混幣金額v轉(zhuǎn)入對(duì)應(yīng)的托管賬戶T,{I1,I2,…,IM}→T,參與者可以互相驗(yàn)證是否將指定金額v轉(zhuǎn)入了托管賬戶T,確保每個(gè)參與者都完成承諾后進(jìn)入下一階段。托管地址T創(chuàng)建過程如下: (a)隨機(jī)生成一個(gè)值k作為托管地址T的私鑰,通過偽隨機(jī)秘密分享(Pseudo-Random Secret Sharing,PRSS)[18]使參與者i獲得私鑰d的份額[k]n。 (b)每個(gè)參與者計(jì)算他的公鑰份額[Q]n=[d]n·G,G為橢圓曲線的基點(diǎn)。 (c)每個(gè)參與者i將他的公鑰份額[Q]n廣播給其他參與者。 (e)使用公鑰Q創(chuàng)建托管地址T。 圖2 洗牌過程 圖3 加密結(jié)構(gòu) 算法2:Multilayered encryption 輸入:Collection of common nodesS Collection of shuffle nodesS (1) forPiinP (2)mi←Oi (3) forjin range(1,M) (4)mi←AES.encrypt(mi,dkj) (6) forSjinS (7)mj←Oj (8) fornin range(j+1,M) (9)mj←AES.encrypt(mj,dkn) 圖4 洗牌階段Message List結(jié)構(gòu) 算法3:Shuffle 輸入:Collection of common nodesS Collection of shuffle nodesS 輸出:mlistM (1) forPiinP (3) forS1 (5) mlist1.add(decryptedMsg) (7) mlist1←mlist1.random (8) send mlist1toS1 (9) forSjinS(1 (10)formnin mlistj-1 (11) decryptedMsg←AES.decrypt(mn,dkj) (12) mlistj.add(decryptedMsg) (14) mlistj+1←mlistj.random (15) send mlistj+1toSj+1 (16) forSM (17) mlistM-1={m1,m2,…,mN-1} (18)formM-1in mlistM-1 (19) decryptedMsg←AES.decrypt(mM-1,dkM) (20) mlistM.add(decryptedMsg) (21) mlistM.add(Oi) (22) mlistM←mlistM.lexorder() (23) broadcast(mlistM) (24) return mlistM 參與者收到輸出地址列表mlistM后,驗(yàn)證自己的輸出地址是否在輸出地址列表中,地址列表是否按字典序排序。若輸出地址不在或地址列表沒有按字典序排序,將托管地址Tn中的資金v轉(zhuǎn)移回輸入地址In,并進(jìn)入責(zé)備階段。反之,如果一切正常,將每個(gè)參與者計(jì)算輸出地址的哈希和,以此為偽隨機(jī)數(shù)生成器的依據(jù)生成公共隨機(jī)置換,在mlistM上增加公共隨機(jī)置換得到最終輸出地址列表AddressList。該過程如算法4所示: 算法4:final permutation 輸入:mlistM 輸出:AdressList //校驗(yàn)成功后進(jìn)行最終置換 (1) mlistM={m1,m2,…,mN} (2) formMin mlistM (3) hashsum←hashsum+hash(mM) (4) AdressList←mlistM.random.seed(hashsum) (4)交易階段:混幣參與者創(chuàng)建交易T→{O1,O2,…,OM},托管地址Ti的私鑰di由所有參與者共同生成,最終由混幣參與者合作簽署交易。由于參與者沒有自己對(duì)應(yīng)托管賬戶的私鑰,所以各參與者廣播出自己在承諾階段獲得的私鑰份額,重構(gòu)出托管地址T的私鑰k,然后生成有效的簽名,將交易廣播給區(qū)塊鏈。 (a)生成托管地址到最終輸出地址列表的交易T→{O1,O2,…,OM}。 (b)每個(gè)參與者驗(yàn)證交易的輸出地址列表是否與自己生成的最終輸出地址列表AddressList相同。若不同,交易取消,進(jìn)入責(zé)備階段。 (c)每個(gè)參與者廣播自己的私鑰份額[k]n。 (e)使用私鑰k生成對(duì)托管地址T的有效簽名。 (f)將交易提交給區(qū)塊鏈。 (5)問責(zé)階段:在整個(gè)混幣的流程中,每個(gè)參與者監(jiān)督著其他的參與者沒有進(jìn)行違規(guī)操作。一旦發(fā)現(xiàn)違規(guī)現(xiàn)象,誠信的參與者會(huì)通告這一現(xiàn)象,混幣流程將會(huì)停止并執(zhí)行該階段,識(shí)別出違規(guī)操作者并將其剔除,重新進(jìn)行混幣。這里分別討論每個(gè)階段的違規(guī)操作。 (a)承諾階段:承諾階段是使參與者將混幣金額放入托管賬戶作為押金機(jī)制,是保證后續(xù)階段安全的基礎(chǔ),參與者之間互相通過輸入地址,在區(qū)塊鏈上驗(yàn)證是否每個(gè)參與者都將混幣金額v轉(zhuǎn)入了托管地址,若超時(shí)后,仍有參與者未完成承諾,則將其剔除。 (b)洗牌階段:該階段會(huì)出現(xiàn)加密密鑰錯(cuò)誤、最后一個(gè)參與者不按字典符排序等錯(cuò)誤,若發(fā)現(xiàn)違規(guī)操作,洗牌節(jié)點(diǎn)可以廣播他們的解密密鑰,以及他們收到的消息,從而允許參與者對(duì)每個(gè)洗牌節(jié)點(diǎn)的操作進(jìn)行重放,找出其中的違規(guī)操作者。發(fā)現(xiàn)違規(guī)操作者后,將其剔除,然后將押金退回到輸入地址。 若其中一個(gè)洗牌節(jié)點(diǎn)Sj宕機(jī),下個(gè)洗牌節(jié)點(diǎn)Sj+1在限定時(shí)間內(nèi)沒有接受到Sj加密消息,Sj+1將超時(shí)信息廣播給其他參與者,然后剔除掉宕機(jī)的參與者,退回押金,剩余參與者重新進(jìn)行混幣。若最后一個(gè)洗牌節(jié)點(diǎn)SM宕機(jī),SM沒有在限定時(shí)間內(nèi)廣播輸出地址列表,其他參與者將會(huì)判定超時(shí),將其剔除,重新進(jìn)行混幣操作。 ShuffleParty通過采取隨機(jī)選擇洗牌節(jié)點(diǎn)的方式,在混幣參與者內(nèi)部選出洗牌節(jié)點(diǎn),且洗牌節(jié)點(diǎn)排列順序隨機(jī),參與者無法自行參與洗牌過程。并沿用了CoinParty機(jī)制中的托管機(jī)制,由多個(gè)第三方節(jié)點(diǎn)共同生成托管賬戶改為參與者共同生成托管賬戶,在提高拒絕服務(wù)攻擊成本的同時(shí),避免了第三方節(jié)點(diǎn)的參與,提高了安全性,解決了TTShuffle所存在的無法防止拒絕服務(wù)攻擊的問題,在安全性方面強(qiáng)于TTShuffle。 在洗牌階段,ShuffleParty機(jī)制中加密方案使用AES-CBC加密,通過多層加密解密,使每個(gè)參與者的輸出地址加入到輸出地址列表的過程中,輸出地址明文不會(huì)被其他用戶知道,而最后一個(gè)洗牌節(jié)點(diǎn)解密得到明文后無法得知其他用戶與輸出地址的對(duì)應(yīng)關(guān)系,保障了內(nèi)部隱私性。與CoinParty相同,使用托管賬戶,要求最后一個(gè)洗牌節(jié)點(diǎn)以字典序排序,避免攻擊者可以控制輸出地址列表的順序。CoinParty在洗牌開始前將輸出地址的哈希值秘密分享給每一個(gè)洗牌節(jié)點(diǎn),洗牌結(jié)束后洗牌節(jié)點(diǎn)廣播自己的哈希份額,然后每個(gè)洗牌節(jié)點(diǎn)重構(gòu)輸出地址的哈希和,與洗牌結(jié)果的輸出地址列表哈希和進(jìn)行對(duì)比,如果相同,則進(jìn)行下一步。第三方節(jié)點(diǎn)使用校驗(yàn)和進(jìn)行輸出地址列表的驗(yàn)證,帶來了一定安全性問題:由于輸出地址列表是由最后一個(gè)洗牌節(jié)點(diǎn)產(chǎn)生的,最后一個(gè)洗牌節(jié)點(diǎn)可以將正確的輸出地址列表替換為哈希和相同的地址列表,從而最后通過驗(yàn)證,將混幣用戶的資金轉(zhuǎn)入到錯(cuò)誤的輸出地址,竊取混幣用戶資金。而ShuffleParty沒有引入任何第三方節(jié)點(diǎn),驗(yàn)證環(huán)節(jié)由每一個(gè)混幣用戶進(jìn)行。最后一個(gè)洗牌節(jié)點(diǎn)將輸出地址列表廣播,每一個(gè)混幣用戶驗(yàn)證自己的輸出地址是否在輸出地址列表中,若不在,則進(jìn)入責(zé)備階段,反之則繼續(xù)進(jìn)行下一步。通過由每個(gè)混幣用戶參與驗(yàn)證,保證了輸出地址列表的正確性,避免了CoinParty中第三方節(jié)點(diǎn)帶來的安全性問題。 3.2.1 實(shí)驗(yàn)環(huán)境 操作系統(tǒng):64位Windows10;編程語言:Java;編程工具:Eclipse,jdk1.8.0_101;JXTA版本:2.4;JXTA CMS版本:2.4.1;加密API:bcprov-jdk14。 實(shí)驗(yàn)使用JXTA模擬區(qū)塊鏈底層的P2P(Peer-to-Peer)網(wǎng)絡(luò),建立多個(gè)節(jié)點(diǎn)加入同一個(gè)PeerGroup,模擬多人進(jìn)行混幣的過程。洗牌過程中的多層加密采用AES-CBC模式。 3.2.2 時(shí)間分析 該文在CoinParty基礎(chǔ)上進(jìn)行改進(jìn),為了對(duì)比ShuffleParty機(jī)制和CoinParty機(jī)制的性能情況,在同樣實(shí)驗(yàn)環(huán)境下對(duì)ShuffleParty和CoinParty進(jìn)行多次實(shí)驗(yàn),分別從參與者數(shù)量和洗牌節(jié)點(diǎn)數(shù)量控制變量(ShuffleParty洗牌節(jié)點(diǎn)為參與者選出的洗牌節(jié)點(diǎn),CoinParty洗牌節(jié)點(diǎn)為第三方節(jié)點(diǎn)),記錄實(shí)驗(yàn)結(jié)果。并在控制混幣參與者數(shù)量相同的情況下,將ShuffleParty和其他混幣方案進(jìn)行對(duì)比實(shí)驗(yàn)1 固定混幣參與者數(shù)量,增加洗牌節(jié)點(diǎn)數(shù)量。分別統(tǒng)計(jì)ShuffleParty和CoinParty在30個(gè)混幣參與者參加混幣,有3,4,5,6,7,8個(gè)洗牌節(jié)點(diǎn)進(jìn)行洗牌操作時(shí)兩個(gè)方案正常運(yùn)行所需要的時(shí)間,兩個(gè)方案的時(shí)間對(duì)比如圖5所示。 圖5 固定混幣參與者數(shù)量的運(yùn)行時(shí)間對(duì)比 在圖5中,當(dāng)混幣參與者人數(shù)固定時(shí),隨著洗牌節(jié)點(diǎn)的數(shù)量增多,ShuffleParty所需時(shí)間始終小于CoinParty,兩個(gè)方案的時(shí)間都在遞增,但ShuffleParty的遞增幅度不大。因?yàn)镾huffleParty和CoinParty增加一個(gè)洗牌節(jié)點(diǎn),就增加了一層加密解密洗牌的過程,CoinParty所有節(jié)點(diǎn)都需要加密洗牌節(jié)點(diǎn)數(shù)量的層數(shù),ShuffleParty只有普通節(jié)點(diǎn)需要加密全部層數(shù),而洗牌節(jié)點(diǎn)只需要進(jìn)行后續(xù)洗牌節(jié)點(diǎn)數(shù)量的多層加密。除此之外,CoinParty通過校驗(yàn)和驗(yàn)證輸出地址列表的機(jī)制,需要洗牌節(jié)點(diǎn)將所持有的校驗(yàn)和份額發(fā)送給其他洗牌節(jié)點(diǎn),每增加一個(gè)洗牌節(jié)點(diǎn),就增加了更多的時(shí)間消耗。 實(shí)驗(yàn)2固定洗牌節(jié)點(diǎn)數(shù)量,增加混幣參與者數(shù)量。分別統(tǒng)計(jì)ShuffleParty和CoinParty在5個(gè)洗牌節(jié)點(diǎn)進(jìn)行洗牌,有10,15,20,25,30,35個(gè)混幣參與者參加混幣時(shí)所需要花費(fèi)的時(shí)間,兩個(gè)方案消耗時(shí)間對(duì)比如圖6所示。 在圖6中,隨著混幣參與者人數(shù)的遞增,ShuffleParty和CoinParty兩個(gè)機(jī)制成功運(yùn)行時(shí)間沒有很大的波動(dòng),近乎平直,TTShuffle的運(yùn)行時(shí)間隨混幣參與者人數(shù)遞增而遞增。因?yàn)榛鞄艆⑴c者的增多并不會(huì)改變加密解密洗牌的層數(shù)變化,僅僅是在每一層洗牌增加了一個(gè)加密消息。而由于CoinParty多了一個(gè)洗牌節(jié)點(diǎn)發(fā)送校驗(yàn)和份額的過程,所需花費(fèi)的時(shí)間更多。TTShuffle隨著混幣參與者人數(shù)增加5人,分組會(huì)多出一個(gè),組間洗牌階段將會(huì)多進(jìn)行一輪傳遞,導(dǎo)致了時(shí)間的增加。 圖6 固定洗牌節(jié)點(diǎn)數(shù)的運(yùn)行時(shí)間對(duì)比 結(jié)合圖5和6可以看出,由于ShuffleParty直接將輸出地址列表發(fā)給混幣參與者驗(yàn)證,沒有CoinParty洗牌節(jié)點(diǎn)之間互相發(fā)送校驗(yàn)和份額的過程,ShuffleParty機(jī)制的時(shí)間開銷比CoinParty小很多,洗牌節(jié)點(diǎn)數(shù)量越多,前者的混幣時(shí)間優(yōu)勢(shì)越明顯。并且ShuffleParty和CoinParty一樣,即使在參與人數(shù)眾多的情況下,依舊能夠保持自身的效率。TTShuffle盡管在CoinShuffle的基礎(chǔ)上有了提升,但ShuffleParty在效率上還是具有優(yōu)勢(shì)。 為了解決CoinParty機(jī)制中的第三方節(jié)點(diǎn)以及校驗(yàn)和驗(yàn)證輸出列表導(dǎo)致的安全問題,提出了ShuffleParty機(jī)制。通過在混幣參與者中隨機(jī)選取洗牌節(jié)點(diǎn),由洗牌節(jié)點(diǎn)按隨機(jī)順序進(jìn)行多層洗牌,最后將輸出列表發(fā)送給參與者驗(yàn)證,避免了第三方節(jié)點(diǎn)的參與,保證了混幣過程中的隱私安全和資產(chǎn)安全。通過實(shí)驗(yàn)表明,提出的ShuffleParty機(jī)制相對(duì)于CoinParty機(jī)制,在提升安全性的同時(shí),也提高了混幣的效率,減少了所需要的時(shí)間。 雖然解決了CoinParty所存在的一些問題,提高了運(yùn)行效率,但還存在著一些缺陷。比如,被選出的洗牌節(jié)點(diǎn)相較于普通參與者進(jìn)行了更多的工作量,應(yīng)設(shè)立一定獎(jiǎng)勵(lì)機(jī)制對(duì)進(jìn)行洗牌操作的洗牌節(jié)點(diǎn)進(jìn)行獎(jiǎng)勵(lì)。文中洗牌節(jié)點(diǎn)由普通參與者隨機(jī)選出,若有信譽(yù)值機(jī)制來選取洗牌節(jié)點(diǎn),然后洗牌節(jié)點(diǎn)獲得獎(jiǎng)勵(lì),能夠更好地提高混幣機(jī)制的穩(wěn)定性及安全性。3 分 析
3.1 安全性分析
3.2 實(shí)驗(yàn)分析
4 結(jié)束語