劉雙印,雷墨鹥兮,王 璐,孫傳恒,徐龍琴,曹 亮,馮大春,鄭建華,李景彬
1.廣州市農(nóng)產(chǎn)品質(zhì)量安全溯源信息技術(shù)重點實驗室,廣州 510225
2.石河子大學(xué) 機械電氣工程學(xué)院,新疆 石河子 832000
3.仲愷農(nóng)業(yè)工程學(xué)院 智慧農(nóng)業(yè)創(chuàng)新研究院,廣州 510225
4.廣東省高校智慧農(nóng)業(yè)工程技術(shù)研究中心,廣州 510225
5.國家農(nóng)業(yè)信息化工程技術(shù)研究中心,北京 100097
6.廣東省農(nóng)產(chǎn)品安全大數(shù)據(jù)工程技術(shù)研究中心,廣州 510225
在當(dāng)今信息大爆炸的時代,時刻產(chǎn)生海量數(shù)據(jù)難以安全可靠傳輸,數(shù)據(jù)安全已嚴(yán)重影響人們的生活,如何有效保證系統(tǒng)數(shù)據(jù)安全成了如今迫在眉睫的問題之一[1]。每個人都是數(shù)據(jù)的生產(chǎn)者和使用者,但企業(yè)往往為保護隱私導(dǎo)致數(shù)據(jù)共享性差,甚至出現(xiàn)數(shù)據(jù)孤島等問題。雖然數(shù)據(jù)共享技術(shù)不僅可解決信息的封閉性和單一性問題,也有效實現(xiàn)數(shù)據(jù)增值,但同時存在上述數(shù)據(jù)安全和隱私泄漏的缺陷。2018年Facebook遭黑客攻擊,8 000余萬條用戶信息被泄漏;2019年多個公司大量用戶數(shù)據(jù)被盜,黑客私下交易8.7億條個人數(shù)據(jù);2020年萬豪國際集團520萬客人信息被泄漏等,這些被泄漏的身份信息常被不法分子用于非法活動。因此,研究新一代技術(shù)防止黑客攻擊,確保數(shù)據(jù)安全具有重要的現(xiàn)實意義。
區(qū)塊鏈?zhǔn)且环N在密碼學(xué)、統(tǒng)計學(xué)、經(jīng)濟學(xué)和計算機科學(xué)等多學(xué)科交叉基礎(chǔ)上發(fā)展起來的新技術(shù),以其去中分布式存儲、匿名性高、數(shù)據(jù)一致性等優(yōu)點被廣泛應(yīng)用于信息安全、金融、證券、數(shù)字確權(quán)、溯源等領(lǐng)域,實現(xiàn)數(shù)據(jù)的分布式存儲和有效利用。區(qū)塊鏈與隱私保護的結(jié)合可以降低第三方監(jiān)管不嚴(yán)的風(fēng)險,在一定程度上保證數(shù)據(jù)安全有效,具有更廣闊的應(yīng)用價值。區(qū)塊鏈系統(tǒng)的安全性對系統(tǒng)本身意義重大,為了避免惡意節(jié)點的攻擊,使交易有序進行,區(qū)塊鏈工作者改進共識機制、優(yōu)化智能合約,對網(wǎng)絡(luò)監(jiān)管進行加強,讓區(qū)塊鏈能應(yīng)用到各個領(lǐng)域。但由于區(qū)塊鏈技術(shù)還處在發(fā)展階段,其在核心技術(shù)領(lǐng)域并不完善,導(dǎo)致區(qū)塊鏈系統(tǒng)本身存在一些缺陷,甚至在改善的過程中產(chǎn)生了一些新的技術(shù)漏洞,因此本文在分析區(qū)塊鏈關(guān)鍵技術(shù)的基礎(chǔ)上,主要針對區(qū)塊鏈現(xiàn)存的一些問題進行分析總結(jié),概括了目前區(qū)塊鏈的幾項關(guān)鍵技術(shù),旨在總結(jié)出區(qū)塊鏈系統(tǒng)現(xiàn)階段存在的問題,并給出了基于這些關(guān)鍵技術(shù)存在的安全問題。通過詳細(xì)闡述區(qū)塊鏈系統(tǒng)現(xiàn)存問題:(1)可以作為區(qū)塊鏈系統(tǒng)開發(fā)者的參考,了解和避免常見的陷阱;(2)可以作為研究人員的指導(dǎo),以促進區(qū)塊鏈技術(shù)的分析和驗證技術(shù)的發(fā)展。以期為未來的區(qū)塊鏈發(fā)展提供更強有力的理論和現(xiàn)實支撐,為能更快地發(fā)現(xiàn)問題解決問題。因此,本文對區(qū)塊鏈系統(tǒng)現(xiàn)存問題和安全漏洞的分析對區(qū)塊鏈技術(shù)的發(fā)展具有極為重要的意義。
“區(qū)塊鏈”概念于2008年在《比特幣:一種點對點電子現(xiàn)金系統(tǒng)》中被首次提出[2],并在比特幣系統(tǒng)的數(shù)據(jù)加密貨幣體系成功應(yīng)用,已成為政府、企業(yè)和學(xué)者等重點關(guān)注和研究熱點。英國政府于2016年1月發(fā)布了《分布式賬本技術(shù):超越區(qū)塊鏈》報告[3],指出英國政府正積極地評估區(qū)塊鏈技術(shù)潛力,并旨在更好地用來處理領(lǐng)導(dǎo)、協(xié)作和治理之間的關(guān)系;同年11月,微軟發(fā)布Azure區(qū)塊鏈。我國于2016年10月發(fā)布了《中國區(qū)塊鏈技術(shù)和應(yīng)用發(fā)展白皮書(2016)》[4],預(yù)示著我國正式進入了前所未有的區(qū)塊鏈高速發(fā)展時代;同年2月IBM公司正式推出區(qū)塊鏈應(yīng)用平臺;2019年10月,習(xí)近平總書記指出區(qū)塊鏈作為自主創(chuàng)新的新興技術(shù),將成為國家級戰(zhàn)略部署關(guān)鍵技術(shù)之一。截止到2019年底,我國已經(jīng)發(fā)布了25項與密碼模塊相關(guān)的國家標(biāo)準(zhǔn),阿里、騰訊、京東及百度等大型互聯(lián)網(wǎng)公司陸續(xù)推出自己的區(qū)塊鏈服務(wù)平臺;Facebook公司成立Libra協(xié)會,美國已有28個州推出區(qū)塊鏈的相關(guān)政策,且其政府部門共提出了22項區(qū)塊鏈相關(guān)法案[5]。2020年我國成立區(qū)塊鏈專委會,招商銀行、農(nóng)業(yè)銀行和工商銀行等國內(nèi)金融機構(gòu)紛紛推出區(qū)塊鏈金融項目,為促進區(qū)塊鏈快速發(fā)展奠定堅實基礎(chǔ)。
區(qū)塊鏈技術(shù)具有去中心化存儲、隱私保護、防篡改等特點,提供了開放、分散和容錯的事務(wù)機制,成為新一代匿名在線支付、匯款和數(shù)字資產(chǎn)交易的核心,被廣泛應(yīng)用于各大交易平臺[6]。同時也給金融、監(jiān)管機構(gòu)、科技創(chuàng)新、農(nóng)業(yè)以及政治等領(lǐng)域都帶來了深刻的變革[7-9]。以可編程社會為目標(biāo),區(qū)塊鏈技術(shù)將同20世紀(jì)互聯(lián)網(wǎng)技術(shù)一樣,創(chuàng)造21世紀(jì)技術(shù)革新的新紀(jì)元[10-12]。
據(jù)國家信息安全漏洞共享平臺[13]統(tǒng)計,自2016年到2020年的低危、中危和高危漏洞分布對比,如圖1所示。中危漏洞發(fā)生頻率最高,雖然在2018年有所減少,但是總體處于增長狀態(tài);高危漏洞的發(fā)生頻率僅次于中危漏洞,2017年下降明顯,但隨后幾年又呈快速增長趨勢;低危漏洞發(fā)生率最低,但逐年不斷增長。總體來看,漏洞總量仍然處于不斷上升的勢態(tài),應(yīng)用程序、操作系統(tǒng)及數(shù)據(jù)庫的安全性依然存在極大威脅。
圖1 近五年漏洞分布對比Fig.1 Comparison of vulnerability distribution in past five years
同時漏洞嚴(yán)重危害著區(qū)塊鏈系統(tǒng)的安全,為了進一步分析區(qū)塊鏈漏洞危害,文獻[14]從區(qū)塊鏈系統(tǒng)角度進行分類,總結(jié)概括分為以下6類漏洞。
由表1可以看出,第一類漏洞主要由語義設(shè)置造成,由于開發(fā)人員對程序的不透徹理解導(dǎo)致引入錯誤語義,且語義錯誤一般特定于應(yīng)用程序,即使后續(xù)使用智能檢測工具也很難自動檢測出來。具體的可以分為執(zhí)行錯誤、異常處理錯誤、特征缺失以及輸入輸出錯誤。例如cpp-ethereum系統(tǒng)中回退功能不屬于外部合約估算;go-ethereum系統(tǒng)中,在函數(shù)中GET&POST延長截止日期請求陷入超時會導(dǎo)致最后期限延長。第二類為環(huán)境和配置漏洞,由于區(qū)塊鏈系統(tǒng)應(yīng)用環(huán)境較為寬泛,且不同的環(huán)境駐留在不同的硬件或操作系統(tǒng)上,安裝許多不同版本的庫會影響依賴庫的功能;即便安裝相同版本的庫,由于用戶的各種自定義操作,也會使庫的配置信息與環(huán)境不匹配,導(dǎo)致底層操作系統(tǒng)執(zhí)行錯誤。第三類是GUI漏洞,主要表現(xiàn)為用戶圖形界面的設(shè)置不規(guī)范。例如在Windows下,比特幣系統(tǒng)的界面會因為主機自身設(shè)置的原因顯得過大;在dogecoin系統(tǒng)中,客戶端啟動畫面時,徽標(biāo)與文字重疊;ethereum系統(tǒng)中,點擊新的窗口加載器屏幕不顯示框架等諸如此類情況的發(fā)生。第四類是并發(fā)漏洞,在大型系統(tǒng)中,高線程或進程并發(fā)極易出現(xiàn)錯誤從而造成系統(tǒng)錯誤。在cpp-ethereum系統(tǒng)中,如果多個客戶同時創(chuàng)建交易,以太坊默認(rèn)設(shè)置無法可靠使用,因為任何客戶端都可以隨時更改它,因此以太坊交易在創(chuàng)建合同時返回的地址不能保證是否是合同實際目標(biāo)地址。第五類為安全漏洞,由于系統(tǒng)脆弱性導(dǎo)致軟件上的信息和軟件提供的服務(wù)被破壞,極易遭受各種漏洞攻擊的危害。第六類為性能漏洞,主要體現(xiàn)在系統(tǒng)不能高效執(zhí)行系統(tǒng)任務(wù)而造成事務(wù)延遲,致使進程死鎖等現(xiàn)象。例如go-ethereum系統(tǒng)中高速讀取磁盤時進程死鎖導(dǎo)致任務(wù)中斷甚至數(shù)據(jù)丟失等的情況發(fā)生。
表1 漏洞分類Table 1 Classification of bugs
自中本聰[2]提出區(qū)塊鏈之后,國內(nèi)外學(xué)者從不同的角度對區(qū)塊鏈概念提出了自己的見解。如Sookhak提到區(qū)塊鏈?zhǔn)且粋€分散的、無信任的、防干擾的、分布式的賬本[15]。Daniel認(rèn)為區(qū)塊鏈?zhǔn)且环N新型的軟件開發(fā)架構(gòu),以一種僅附加的形式使用獨特的數(shù)據(jù)結(jié)構(gòu)將數(shù)據(jù)連接成鏈,并將哈希函數(shù)作為映射數(shù)據(jù)的工具以保證數(shù)據(jù)的安全[16]。王芳將區(qū)塊鏈定義為利用加密鏈?zhǔn)絽^(qū)塊結(jié)構(gòu)來驗證與存儲數(shù)據(jù)、使用分布式節(jié)點共識機制(Consensus Mechanism)來生成和更新數(shù)據(jù),并通過智能合約(Smart Contracts)來編程和操作數(shù)據(jù)的一種去中心化的基礎(chǔ)架構(gòu)與分布式計算范式[17]。袁勇、張奧將區(qū)塊鏈理解為是一個隨著時間序列不斷增長的去中心化的分布式數(shù)據(jù)庫,其本質(zhì)是基于非對稱加密算法的分布式賬本技術(shù)[6,18]。Yu認(rèn)為區(qū)塊鏈?zhǔn)请娮迂泿艓げ鞠到y(tǒng)的一種點對點技術(shù)實現(xiàn),它是由參與者來維護的,可以在網(wǎng)絡(luò)系統(tǒng)中沒有中心服務(wù)器的情況下記錄每個比特幣交易記錄[19]。Halamka解釋區(qū)塊鏈?zhǔn)怯梢唤M不可變的分布式數(shù)字賬本組成,它們負(fù)責(zé)跟蹤交易并將其記錄在數(shù)字塊上,區(qū)塊鏈架構(gòu)中所有節(jié)點相對應(yīng)地服務(wù)且不依賴中心網(wǎng)絡(luò)服務(wù)器,因此區(qū)塊鏈中心故障點無懈可擊[20]。Yang、魏曉旭認(rèn)為區(qū)塊鏈?zhǔn)遣捎妹艽a學(xué)的方法將數(shù)據(jù)塊連接在一起并可以進行可行性交易的分布式數(shù)據(jù)庫技術(shù),具有防篡改、可追溯、多方維護的功能,它為了實現(xiàn)不同各方之間的信息共享和信息監(jiān)督,任何一方必須按照約定事先得到其他各方的同意[21-22]。
綜上所述,區(qū)塊鏈概念可以理解為以非對稱加密算法為基礎(chǔ),以改進的默克爾樹(MerkleTree)[23]為數(shù)據(jù)結(jié)構(gòu),使用共識機制、點對點網(wǎng)絡(luò)、智能合約等技術(shù)結(jié)合而成的一種分布式存儲數(shù)據(jù)庫技術(shù)。
區(qū)塊鏈分為公有鏈(Public Blockchain)、聯(lián)盟鏈(Consortium Blockchain)、私有鏈(Private Blockchain)和混合鏈(Hybrid Blcokchain)[24]四大類。
(1)公有鏈?zhǔn)蔷W(wǎng)絡(luò)中任何人都可以隨時訪問的區(qū)塊鏈系統(tǒng),通常被認(rèn)為是完全去中心化、匿名性高和數(shù)據(jù)不可篡改的區(qū)塊鏈。
(2)聯(lián)盟鏈為若干企業(yè)或機構(gòu)共同管理的區(qū)塊鏈,參與者要事先進行注冊認(rèn)證,因此相對于公有鏈來說,聯(lián)盟鏈的參與節(jié)點較少。數(shù)據(jù)由認(rèn)證后的參與者共同記錄和維護,這類節(jié)點擁有讀取數(shù)據(jù)的權(quán)限。
(3)私有鏈?zhǔn)且环N由某個組織或某個用戶控制的區(qū)塊鏈,控制參與節(jié)點個數(shù)規(guī)則嚴(yán)格,因此交易速度極快,隱私等級更高,不容易遭受攻擊,相比于公有鏈系統(tǒng)有更高的安全性,但去中心化程度被極大削弱。從接入類型來看,區(qū)塊鏈分為非許可鏈和許可鏈[14]。非許可鏈不需要獲得允許即可接入?yún)^(qū)塊鏈系統(tǒng),公有鏈就是一種典型的非許可鏈,所有節(jié)點都可以自由參與鏈上的交易。許可鏈包括聯(lián)盟鏈和私有鏈,對于接入節(jié)點有嚴(yán)格的標(biāo)準(zhǔn)和控制,系統(tǒng)內(nèi)的數(shù)據(jù)訪問權(quán)只授權(quán)給經(jīng)過認(rèn)證的節(jié)點。相對于非許可鏈來說,許可鏈犧牲了一定的去中心化特性[25],以換取鏈上數(shù)據(jù)更高的安全性保護。混合鏈?zhǔn)枪墟満退接墟湹幕旌象w,結(jié)合了共有鏈和私有鏈的特性。
(4)混合鏈允許用戶決定區(qū)塊鏈的參與成員,以及交易是否可以被公開,因此混合區(qū)塊鏈?zhǔn)强啥ㄖ频?,所以它的混合架?gòu)通過利用私有區(qū)塊鏈的限制訪問來確保隱私,同時保持了公共區(qū)塊鏈的完整性、透明度和安全性。
區(qū)塊鏈技術(shù)包括密碼學(xué)、默克爾樹(MerkleTree)、對等節(jié)點(peer-to-peer,P2P)、共識機制以及智能合約[26],其區(qū)塊鏈關(guān)鍵技術(shù)棧如圖2所示。
圖2 區(qū)塊鏈關(guān)鍵技術(shù)棧Fig.2 Stack of Blockchain key echnology
區(qū)塊鏈中密碼學(xué)原理主要涉及到加密和簽名,其中加密是由發(fā)送方利用接收方的公鑰加密,接收方收到信息后用自己的私鑰解密即可得到信息內(nèi)容;簽名是由發(fā)送方用自己的私鑰簽名,接收方用發(fā)送方的公鑰驗證其信息發(fā)送者的身份;兩種方式皆采用非對稱加密算法。默克爾樹利用哈希指針構(gòu)成樹形數(shù)據(jù)結(jié)構(gòu),將處理后的數(shù)據(jù)連接匯總為一串哈希值,節(jié)點間的算法一致性保證了哈希指針的準(zhǔn)確性。對等節(jié)點(P2P)組網(wǎng)運行在區(qū)塊鏈系統(tǒng)的網(wǎng)絡(luò)層,用于控制消息和數(shù)據(jù)之間的傳輸可以直接在節(jié)點之間完成,有利于各個節(jié)點監(jiān)聽網(wǎng)絡(luò)發(fā)布區(qū)塊以及驗證信息發(fā)布交易的合法性,允許數(shù)據(jù)以快速和安全的方式存儲、維護和分發(fā)[27]。共識機制則保證了區(qū)塊鏈中所有用戶的共同參與,是實現(xiàn)去中心化管理的重要協(xié)議,從公知機制提出至今已有一系列的公式算法投入使用。智能合約在區(qū)塊鏈基礎(chǔ)上得到進一步的完善,由開始的單一堆棧腳本語言到如今可自動控制交易完成度的合約協(xié)議。
從結(jié)構(gòu)來看,區(qū)塊包含區(qū)塊頭(BlockHeader)和區(qū)塊體(BlockBody)兩部分,區(qū)塊頭中的關(guān)鍵信息包括當(dāng)前版本號(Version)、前區(qū)塊哈希值(PreviewsHash)、時間戳(Timestamp)、隨機數(shù)(Nonce)以及默克爾樹(MerkleTree)的哈希值(MerkleHash)等信息[28]。前一個區(qū)塊存儲后一個區(qū)塊的哈希值,并按生成的時間順序進行連接,物理上是塊與塊之間的連接,邏輯上是鏈上信息的關(guān)聯(lián),構(gòu)成了一個外表為鏈內(nèi)在是數(shù)據(jù)關(guān)聯(lián)的賬本形式,如圖3所示。區(qū)塊鏈的關(guān)鍵技術(shù)加密算法、默克爾樹、共識機制、智能合約詳細(xì)分析如下。
圖3 區(qū)塊鏈內(nèi)部結(jié)構(gòu)圖Fig.3 Structure of Blockchain internal diagram
哈希函數(shù)是一種將可變長度數(shù)據(jù)映射到固定長度摘要的函數(shù),對輸入數(shù)據(jù)的任何更改都會導(dǎo)致哈希列中發(fā)生不可預(yù)測的變化。區(qū)塊鏈中使用SHA-256(secure Hash algorithm 256)哈希函數(shù)對任意長度的交易數(shù)據(jù)進行哈希運算,即將源數(shù)據(jù)加工得到一串256位的字符,便于數(shù)據(jù)統(tǒng)一管理和存儲,再將統(tǒng)一格式的字符打包存進區(qū)塊,在減少存儲空間的同時最大程度保證數(shù)據(jù)安全性。哈希函數(shù)具有三大經(jīng)典特性:單向性(Hiding)、抗碰撞性(Collision resistance)、結(jié)果不可預(yù)測性(Puzzle friendly)。
單向性:已知輸入可以得到輸出,但是已知輸出無法逆推出輸入。
抗碰撞性:由于哈希函數(shù)擁有2256個輸入空間,計算量趨于無限大,想要構(gòu)造一個輸入使其結(jié)果為當(dāng)前值幾乎不可能。
結(jié)果不可預(yù)測性:對于已經(jīng)公布的交易或是隨機值,要推測得到特定特征的輸出也是不可能的。
在區(qū)塊鏈的交易過程中為了保證數(shù)據(jù)的安全,如圖4交易簽名過程,首先對所有產(chǎn)生的交易數(shù)據(jù)都取哈希值Hash(M);其次將得到的哈希值與交易明文拼接得到最終發(fā)送內(nèi)容S;然后將S用發(fā)送方自己的私鑰進行數(shù)字簽名,最終將數(shù)字簽名寫入?yún)^(qū)塊。該數(shù)字簽名利用非對稱算法的計算安全性,保證了信息的完整性和不可抵賴性,例如A給B發(fā)起交易,A聲稱自己是A,但B無法確定消息的正確性以及A的身份,因為B的公鑰是公開的,任何人都可以使用B的公鑰向其發(fā)送消息,而數(shù)字簽名不僅能夠確保A的身份和數(shù)據(jù)的完整性,還能夠防范雙花攻擊[29],減少分叉的可能。
圖4 交易簽名Fig.4 Signature of transaction
從廣義上來看,區(qū)塊鏈?zhǔn)窃诿艽a學(xué)的基礎(chǔ)上,對數(shù)據(jù)的一種分布式存儲技術(shù)。首先對數(shù)據(jù)進行預(yù)處理:區(qū)塊鏈對數(shù)據(jù)進行加密取哈希、摘要處理,得到符合區(qū)塊要求的數(shù)據(jù)格式,在減少存儲空間的同時最大程度地保證了數(shù)據(jù)的安全性。存儲:即將得到的不同數(shù)據(jù)哈希值打包放進區(qū)塊。在計算機領(lǐng)域中,MerkleTree[30]是一種樹形數(shù)據(jù)結(jié)構(gòu),如圖3所示。區(qū)塊分為區(qū)塊頭和區(qū)塊體,兩部分使用MerkleTree的數(shù)據(jù)結(jié)構(gòu)進行存儲連接,葉子節(jié)點的交易(transaction,TX)兩兩得到的哈希值是上一層的葉子節(jié)點,這樣逐層往上遞進,將區(qū)塊體中全部交易迭代得到的根哈希值打包存儲在區(qū)塊頭中。在打包交易時再添加交易時間戳、隨機數(shù)等關(guān)鍵值。MerkleTree可以實現(xiàn)大量數(shù)據(jù)的快速存儲和讀取,有利于數(shù)據(jù)的高效驗證。
作為區(qū)塊鏈數(shù)據(jù)存儲的關(guān)鍵結(jié)構(gòu),MerkleTree主要用于完整交易的存在性檢查[31]。MerkleTree中將網(wǎng)絡(luò)節(jié)點分為全節(jié)點和輕節(jié)點。全節(jié)點中保存著鏈上交易中所有的信息,而輕節(jié)點則負(fù)責(zé)驗證交易合法性,如比特幣錢包。其主要步驟為:
(1)輕節(jié)點計算出TX B的Hash B,并向鏈中全節(jié)點發(fā)送請求,請求一個能夠證明藍色交易TX B被包含在MerkleTree里面的默克爾樹根哈希值(Merkle proof)。
(2)全節(jié)點收到請求,將上一層綠色的Hash A發(fā)送給輕節(jié)點進行計算驗證。
(3)輕節(jié)點得到Hash A,與自己的Hash B進行哈希運算得到Hash AB值,全節(jié)點再將另一個分支上綠色的Hash CD傳給輕節(jié)點。
(4)輕節(jié)點將自己的Hash AB與得到的Hash CD進行哈希運算最終得到Hash ABCD。
(5)最后將(4)的結(jié)果與本地存儲的根哈希值進行比較,驗證該交易的存在性。
共識機制是指在動態(tài)交易的過程中使節(jié)點對分布式數(shù)據(jù)庫中的內(nèi)容達成一致的過程,區(qū)塊鏈?zhǔn)褂霉沧R機制令節(jié)點對交易達成一致性共識,從而弱化中心化監(jiān)管體系的功能。從最開始的工作量證明(proof of work,PoW)、實用拜占庭容錯算法(practical Byzantine fault tolerance,PBFT)、權(quán)益證明(proof of stake,PoS)到后來的授權(quán)權(quán)益證明(delegated proof of stake,DPoS)、權(quán)威證明(proof of authority,PoA)和Kafka等一系列共識機制[32-34]。共識機制一直在不斷完善,對應(yīng)著領(lǐng)域要求的不同向不同的方向演進。作為區(qū)塊鏈的核心技術(shù),共識機制能有效對區(qū)塊鏈中各節(jié)點的數(shù)據(jù)達成共識,快速完成交易數(shù)據(jù)處理,保證了數(shù)據(jù)的一致性和可靠性。其典型的共識機制詳細(xì)分析如下。
工作量證明(PoW):Dwork于1993年首次提出用工作量證明思想,通過計算出某個數(shù)學(xué)難題來提高垃圾郵件發(fā)送者成本[35]。1999年首次在論文中引出PoW共識機制,這也為后世中本聰提出在比特幣中使用的共識機制奠定了基礎(chǔ)[36]。工作量證明是區(qū)塊鏈共識機制中最典型的算法之一,如比特幣中的挖礦過程?!暗V工”通過不斷嘗試計算出符合挖礦難度(Difficulty)的隨機數(shù)N,來獲得一定的比特幣獎勵,如公式(1)所示:
H(BlockHeader)≤target(1)
難度值屬于2256個輸入空間中極小的一部分目標(biāo)值域(Target),如公式(2)所示:
在區(qū)塊鏈系統(tǒng)中區(qū)塊會在某個周期內(nèi)(每2 016個區(qū)塊,約兩周時間)動態(tài)調(diào)整閾值的難度,如公式(3)所示:
當(dāng)系統(tǒng)挖礦難度(target)不變時,實際挖礦的難度大于預(yù)期挖礦的難度,等號右邊大于1,目標(biāo)閾值增大,同時挖礦難度減小,挖礦難度與目標(biāo)閾值難度成正比。當(dāng)挖礦人數(shù)增多導(dǎo)致區(qū)塊產(chǎn)生速度明顯加快時,系統(tǒng)就會提升挖礦的難度,使區(qū)塊產(chǎn)生的速度趨于平衡(一般情況下每10 min產(chǎn)生一個區(qū)塊)。1999年Castro等提出使用拜占庭容錯算法(practical Byzantine fault tolerance,PBFT),應(yīng)用于吞吐量不大但要處理大量事件的數(shù)字資產(chǎn)平臺,在原始拜占庭算法的基礎(chǔ)上提高了效率[37]。PBFT算法規(guī)定全網(wǎng)至少需要部署3f+1個節(jié)點,最多可容忍f個惡意節(jié)點,若出現(xiàn)拜占庭故障,整個系統(tǒng)的狀態(tài)由2f+1個節(jié)點決定,即在保證系統(tǒng)活性和安全性前提下,在全網(wǎng)惡意節(jié)點數(shù)少于1/3時達成共識。但著名科學(xué)家Eric教授在報告中提出分布式系統(tǒng)在一致性、安全性、分區(qū)容錯性三者中最多只能同時滿足兩種,PBFT算法亦不能滿足當(dāng)時的生態(tài)系統(tǒng)。2012年,權(quán)益證明(PoS)首次在點點幣(Peercoin)中出現(xiàn),其使用“幣齡”的概念將礦工手中的貨幣量加以控制,并規(guī)定持幣者必須有一定時間期限,時間越久幣齡越長,如公式(4)所示[38-39]:
幣齡=貨幣量×持有時間 (4)
為了保證系統(tǒng)的公平性,礦工的幣齡越高則挖礦的難度越低,在一定程度上可以削減用戶被攻擊的可能性。PoS的出現(xiàn)改善了PoW中算力消耗過大的現(xiàn)象,并在一定程度上緩解了之前由于出塊時間過慢造成效率低下的情況,增加了吞吐量的同時加快了處理速度,但若系統(tǒng)中首富現(xiàn)象突出,會造成中心化集中問題[40]。
公式(1)~(3)中,actualtime和expectedtime分別為實際挖礦難度和期望挖礦難度;target和Difficulty分別為系統(tǒng)的目標(biāo)閾值難度和挖礦難度;Difficulty||Target為系統(tǒng)設(shè)置實際挖礦難度值,最小為1,Target為目標(biāo)閾值。
授權(quán)權(quán)益證明(DPoS)[41]:DPoS基于民主投票的形式,由節(jié)點選舉出N個成員成為系統(tǒng)中的“代表團”,擁有代幣數(shù)量越多的節(jié)點成為“代表”的概率越大。團中的“代表”節(jié)點負(fù)責(zé)收集信息、打包交易以及驗證交易和新生產(chǎn)的區(qū)塊,如下授權(quán)權(quán)益證明工作流程圖。由時間片輪流分配時間給“代表”節(jié)點處理事物,若出現(xiàn)惡意“代表”,該節(jié)點將會被撤銷出塊權(quán)利并取消“代表”資格,再推選出新的“代表”。DPoS的出現(xiàn)減少了算力和電力的浪費,也提升了交易處理速度和區(qū)塊吞吐量,但同時不可避免地削弱了去中心化工作模式的能力。
權(quán)威證明(PoA):以太坊創(chuàng)始人Gavin于2017年首次提出權(quán)威證明共識機制。PoA共識機制主要用于聲譽積累,驗證者需要驗證用戶的身份,而不是用戶所持有的貨幣[42]。想要驗證交易的用戶要首先確認(rèn)其身份,將身份鏈接到所執(zhí)行的驗證,并存儲在區(qū)塊鏈上。當(dāng)交易被驗證時,驗證者的身份將通過某種協(xié)議在鏈上得到確認(rèn)。該身份只有由一小群驗證者來確定,從而提高了共識協(xié)議的效率和安全性。PoA不需要高計算成本,也不需要積累大量代幣,但它僅適用于私有區(qū)塊鏈和聯(lián)盟區(qū)塊鏈網(wǎng)絡(luò)。同年7月,Hyperledger社區(qū)正式發(fā)布Fabric 1.0,其中出現(xiàn)的共識機制打破了以往以證明為主的共識機制印象,形成了以背書節(jié)點(endorsing peer)、排序節(jié)點(orderers)和提交節(jié)點(committing peer)三類節(jié)點為主的Fabric共識機制[43]。超級賬本共識流程如圖5所示,其主要步驟如下:
圖5 超級賬本共識流程Fig.5 Process of hyperledger fabric consensus
步驟1客戶端(client SDK)創(chuàng)建提案,根據(jù)所選擇的背書策略(endorsement policy)將提案發(fā)送給相應(yīng)的背書節(jié)點。提案中包含了用戶編號(ClientID)和所調(diào)用的鏈碼函數(shù)(BlockchainCoin function)及其參數(shù)、時間戳(Timestamp)和客戶端簽名(ClientSig)等信息[44]。
步驟2背書節(jié)點會驗證客戶端簽名,確保提案是由已認(rèn)證的客戶端發(fā)出。背書節(jié)點所模擬的交易請求是根據(jù)提案中鏈碼執(zhí)行的,背書節(jié)點的簽名(sign TXendorsed)附加在生成的執(zhí)行結(jié)果中,即背書過程。模擬執(zhí)行的結(jié)果是一組基于當(dāng)前世界狀態(tài)(state database)的讀寫集(readset and writeset set),背書后將背書簽名和讀寫集發(fā)送給客戶端。
步驟3客戶端驗證背書結(jié)果的簽名,確保其來自合法的背書節(jié)點,客戶端可以檢查背書節(jié)點簽名的有效性以及從不同背書節(jié)點接收到的讀寫集之間的一致性,如果一致則根據(jù)背書結(jié)果生成交易并廣播給排序節(jié)點。在驗證階段后期客戶端可以施行強制檢查,目的是可以幫助在事務(wù)流程早期階段檢測事務(wù)故障,以降低開銷。
步驟4在Hyperledger Fabric中使用Kafka模式對交易進行排序。排序節(jié)點將收到的交易交給Kafka集群排序,同時會按照一定的規(guī)則從Kafka集群中讀取一定數(shù)量的有序交易并打包成塊。排序服務(wù)對區(qū)塊簽名后,將區(qū)塊分發(fā)給提交節(jié)點。
步驟5提交節(jié)點收到區(qū)塊后,即可對區(qū)塊進行驗證,其中主要是驗證交易中的讀寫數(shù)據(jù)集是否與世界狀態(tài)的數(shù)據(jù)版本一致。提交節(jié)點使用讀寫集合的讀集部分來檢查交易的有效性,然后將所有驗證通過的交易中讀寫集中寫部分寫入世界狀態(tài),同時提交節(jié)點會使用寫集更新狀態(tài)數(shù)據(jù)庫即賬本。若驗證失敗,已中止和已提交事務(wù)的驗證塊將附加到分類帳中,將記錄每個事務(wù)的提交或中止?fàn)顟B(tài)。
除了以上介紹的六類主流共識機制,還存在一些應(yīng)用于各大區(qū)塊鏈平臺的共識算法,文章對它們的特征、優(yōu)缺點、參與系統(tǒng)以及在自身基礎(chǔ)上所提出的改進算法整理如表2所示。
表2 共識機制分類Table 2 Classification of consensus
智能合約(smart contract)[45]由Szabo在1994年首次提出,它是一段可以自動執(zhí)行的計算機程序,在區(qū)塊鏈中應(yīng)用復(fù)雜的可編程語言和工程操作對區(qū)塊鏈的執(zhí)行步驟做約束,當(dāng)賬戶觸發(fā)特定條件時合約自動執(zhí)行。其目的是為了保證合約雙方不能惡意篡改合約內(nèi)容,并能夠在沒有中心管理者的監(jiān)管下確保合同有效實施,其代碼具有自動執(zhí)行和跟蹤協(xié)議條款和條件的能力,因此,智能合約是自我驗證、自我執(zhí)行和不可逆的,智能合約被認(rèn)為是區(qū)塊鏈革命的第三代產(chǎn)品[46]。
智能合約的雛形是基于比特幣系統(tǒng)的堆棧腳本語言(stack-base scripting)[47-48],該語言不支持內(nèi)部循環(huán),缺乏圖靈完備性(turing completeness)。比特幣中的智能合約只能支持有限的計算邏輯,是基于交易的賬本模式(transaction-based ledger),故通常只能用于識別用戶身份。以太坊使用圖靈完備的智能合約對交易進行識別、處理和驗證,調(diào)用函數(shù)對以上過程進行操作。超級賬本(Hyperledger)旗下的Fabric子項目采用多種通用語言編寫“鏈碼(chaincode)”,F(xiàn)abric更偏向于企業(yè)級應(yīng)用開發(fā),功能強大,共識機制可插拔,基于復(fù)雜的業(yè)務(wù)邏輯觸發(fā)執(zhí)行,開發(fā)過程快速便利。
智能合約的執(zhí)行流程[49]如圖6所示,智能合同通常由一個可以識別的執(zhí)行代碼和狀態(tài)集合的特定地址組成。兩方發(fā)起交易,合約由開發(fā)人員(developer)進行開發(fā),通過使用不同編程語言(如Python或Solidity[50])中的特定條件語句進行編譯,將編譯得到的字節(jié)碼(bytecode)在以太坊虛擬機(EVM)里執(zhí)行,并由礦工共識(miners consensus)強制執(zhí)行智能合約,不同的交易觸發(fā)各自對應(yīng)的合約條款。提交包括智能合約功能所需參數(shù)的交易給區(qū)塊鏈,同時礦工們要負(fù)責(zé)核實該交易的合法性并將事務(wù)存儲到區(qū)塊中,目的是創(chuàng)建一個用來調(diào)用智能合約的唯一地址。之后,區(qū)塊鏈用戶可以通過將事務(wù)傳輸?shù)胶霞s來調(diào)用合約代碼觸發(fā)事件(event),合約將由狀態(tài)變量和外部可信數(shù)據(jù)集進行檢查。交易事件觸發(fā)成功合約自動執(zhí)行支付(payment)操作,最后廣播全網(wǎng)由礦工們進行驗證(verification)。
圖6 智能合約執(zhí)行流程Fig.6 Working of smart contract
智能合約的調(diào)用只能由外部用戶發(fā)起,合約用戶不能主動發(fā)起交易。以以太坊為例,創(chuàng)建交易時,接收地址為要調(diào)用的智能合約地址,調(diào)用的函數(shù)及其函數(shù)的編碼填寫在合約的DATA域中。
代碼1:構(gòu)造函數(shù)
構(gòu)造函數(shù)僅在合約創(chuàng)建時調(diào)用一次,并準(zhǔn)備好新合約的唯一地址:
1.Constructor(time,address)
2. Public{
3. Address=address;//地址=當(dāng)前合約地址
4. endtime=time; //事件終止時間=實際時間
5. bytes solution;
6.}
代碼2:合約函數(shù)
在智能合約中,使用event定義一個事件,emit調(diào)用該事件。外部函數(shù)調(diào)用合約函數(shù),此處假設(shè)外部賬戶已觸發(fā)合約:
1.contract X{
2. event A(string str)
3. Function foo(string str)return(uint){
4. emit A(str);
5. return 123;
6. }
7.}
8.contract Y{
9. uint z;//z為x.foo(“call foo directly”)的返回值。
10. Function callXFooDirectly(address adr)public{//調(diào)用X合約,該函數(shù)的參數(shù)是合約X的地址
11. X x=X(adr);
12. z=x.foo(“call foo directly”)
13. }
14.}
用戶交易由外部賬戶W發(fā)起,首先調(diào)用合約Y,再由Y調(diào)用合約X繼續(xù)執(zhí)行。若用戶交易調(diào)用的合約發(fā)生錯誤,會導(dǎo)致發(fā)起調(diào)用的合約立即回滾,即若合約X執(zhí)行過程中出現(xiàn)異常,合約Y調(diào)用失敗。
為了確保采礦網(wǎng)絡(luò)計算消耗工作的公平,以太坊需向礦工支付與所需計算成比例的交易費。即以太坊字節(jié)碼中的每個指令都具有預(yù)先指定數(shù)量的gas,當(dāng)用戶發(fā)送交易調(diào)用合同時,用戶須首先指定自身愿意為此次合約執(zhí)行提供多少gas以及每個gas單元的價格(gasprice),區(qū)塊中的礦工隨后會收到交易費[49],如公式(5):
如果某些執(zhí)行需要的氣體超過gas限額(gaslimit),則執(zhí)行終止,區(qū)塊狀態(tài)將恢復(fù)到初始狀態(tài),但作為保護機制,發(fā)送方仍必須向礦工支付所有的gaslimit,這是對抗資源耗盡攻擊的一種有效措施。
表3將智能合約分為三類并分別列出優(yōu)缺點。
表3 智能合約分類及優(yōu)缺點Table 3 Classification of smart contract
與傳統(tǒng)的智能合約相比,前者具有公開透明、內(nèi)容不可篡改以及永久運行的能力,還具有去中心化和高效的特點。但由于其不可篡改性致使合約一旦部署便再無更改的可能性。同時由于匿名性,在目前網(wǎng)絡(luò)法律立法還不完善的情況下,若任一方違約都將造成極大損失。最后,智能合約仍存在許多安全上的隱患亟待解決。
區(qū)塊鏈順應(yīng)潮流發(fā)展,同時也存在很多問題制約和阻礙其推進。為了更好地分析區(qū)塊鏈技術(shù)發(fā)展存在問題,本章將從區(qū)塊鏈的數(shù)據(jù)存儲與交互、隱私保護、資源分配、漏洞攻擊四個方面進行概括總結(jié)。
區(qū)塊鏈作為分布式數(shù)據(jù)庫在數(shù)據(jù)存儲和讀取方面有一定的優(yōu)勢,但是隨著數(shù)據(jù)的增多,大部分節(jié)點無法高效存儲數(shù)據(jù),出現(xiàn)多形式數(shù)據(jù)存儲、數(shù)據(jù)更新以及跨鏈時延等問題。多形式數(shù)據(jù)存儲:區(qū)塊鏈最大的優(yōu)勢之一是對非關(guān)系型數(shù)據(jù)的一次存儲多次讀取,在密集的點對點網(wǎng)絡(luò)(P2P)體系中隨機部署節(jié)點進行數(shù)據(jù)Hash存儲。對于合法用戶而言,他們可以查詢到自己或他人的交易額、內(nèi)部系統(tǒng)信息或黑名單信息,但所有的數(shù)據(jù)都是以字符串的形式呈現(xiàn),若交易數(shù)據(jù)是視頻、音頻或者圖片,隨著網(wǎng)絡(luò)需求的增加,網(wǎng)絡(luò)時延使數(shù)據(jù)傳輸失幀,分布式賬本無法保證分布式一致特性。數(shù)據(jù)更新:由于區(qū)塊鏈的序列化特性上鏈的每一條數(shù)據(jù)都需要進行排序連接,因此區(qū)塊交易極其緩慢。比特幣交易時長平均10 min一個區(qū)塊,每秒約3到4筆交易,以太坊出塊時間約為15 s,每秒約20筆交易。相比之下,Visa支付平臺每秒可處理6.5萬筆交易,支付寶每秒處理8.9萬筆交易,它們的交易速率是比特幣和以太坊的近千倍。緩慢的交易速率極不利于數(shù)據(jù)快速存取和交互,若縮短出塊時間則能最大化減少分叉產(chǎn)生帶來的數(shù)據(jù)更新后的不一致。跨鏈時延:區(qū)塊鏈結(jié)合了去中心和匿名等特點,在此基礎(chǔ)上的加密數(shù)字貨幣可以在全世界范圍內(nèi)流通。作為一種點對點支付系統(tǒng),對于跨國交易的操作比傳統(tǒng)的支票和匯款更加方便快捷,除去人工的奔波耗時,降低了人為操作帶來的失誤率,同時提高了不同國家之間匯率的透明度。但隨之而來的是手續(xù)費的增加,由于各個國家之間地域的跨度,造成數(shù)據(jù)傳輸時延大,在傳輸過程中更容易遭受惡意攻擊,且交易確認(rèn)等待時間長,因此區(qū)塊鏈交易賬本的分布式存儲還需要考慮數(shù)據(jù)傳輸?shù)陌踩院涂蓴U展性。
隱私保護指的是通過技術(shù)手段對個人或企業(yè)的隱私信息進行維護和保護的過程。以下主要將隱私保護分為用戶隱私保護和企業(yè)隱私保護兩大類別。(1)用戶隱私保護:對用戶來說,隱私保護就是保護用戶不愿意被公開的數(shù)據(jù)信息。匿名化使區(qū)塊鏈與現(xiàn)實世界相隔絕,用戶在使用區(qū)塊鏈時很難做到使自己的身份、IP地址、聯(lián)系方式、公私鑰以及姓名之間沒有關(guān)聯(lián),攻擊者對大量的用戶交易地址使用流量分析等方式進行網(wǎng)絡(luò)攻擊。倘若所使用的賬戶地址沒有高安全等級防護,私鑰一旦泄漏,區(qū)塊鏈沒有任何更改機制,交易賬戶只能會遺棄。(2)企業(yè)隱私保護:區(qū)塊鏈上交易的每一個流程都是開放且透明的,但對企業(yè)而言,數(shù)據(jù)完全透明并不意味全是優(yōu)勢。例如股票交易所,每一筆交易都要求實時的數(shù)據(jù)操作,所有的用戶都能看見其他節(jié)點的交易數(shù)據(jù),易造成不法分子盜用用戶隱私導(dǎo)致財產(chǎn)損失,使得企業(yè)失去廣大用戶的信任。
區(qū)塊鏈具有去中心化和防篡改的特性,因此賬本上的數(shù)據(jù)對于系統(tǒng)來說容易存在事務(wù)排序依賴、數(shù)據(jù)高冗余、不可持續(xù)發(fā)展和算力浪費等問題。事務(wù)排序依賴:以太坊中,支付以太幣越多,事務(wù)排序優(yōu)先級越高,處理速度越快。即當(dāng)兩個節(jié)點同時提交事務(wù),花費以太幣較多的節(jié)點事務(wù)優(yōu)先得到處理,致使花費較少的節(jié)點一直排序等待,并且后續(xù)支付較多的節(jié)點無需等待就可加入隊列優(yōu)先執(zhí)行事務(wù),造成進程堵塞,進度拖欠,導(dǎo)致資源分配極度不均。數(shù)據(jù)高冗余:區(qū)塊鏈依賴分布式賬本這一優(yōu)勢,對數(shù)據(jù)進行分布式存儲。但隨著要記錄的數(shù)據(jù)越來越多,信息呈現(xiàn)爆炸式增長,每個節(jié)點為保證賬本高度一致,實時復(fù)制、同步、更新造成數(shù)據(jù)高度冗余,且每個節(jié)點存儲容量有限,這可能在未來面臨著如何處置這些數(shù)據(jù)的困境。不可持續(xù)發(fā)展:紙幣之所以流通是因為它具有重復(fù)使用、可交換及市場調(diào)節(jié)等功能。但是對于虛擬貨幣而言,幣的數(shù)量是有限的,不能隨著市場經(jīng)濟的變化而調(diào)控,由于幣的固定性,其本身無法作為貨幣流通。其次,每次交易過程中都會收取交易費,隨著剩下區(qū)塊的數(shù)量越來越少,對應(yīng)的區(qū)塊獎勵也隨之不斷減少,未來交易費將成為區(qū)塊產(chǎn)生的驅(qū)動力,無論是對經(jīng)濟發(fā)展還是科技進步都是不利的。算力浪費:工作量證明是一種基于計算機算力爭奪記賬權(quán)的共識機制,在比特幣中表現(xiàn)為“挖礦”的方式,這是一個天然的“賞金漏洞”——參與的人越多越民主,數(shù)據(jù)越安全,公眾參與度增高,問題在于減少成本的同時被攻擊的可能性也隨之增加。這極大地暴露了代幣機制的弊端,即記賬權(quán)完全由算力決定,挖礦設(shè)備專業(yè)化驅(qū)使人們花重金購買性能更高的ASIC芯片進行算力爭奪,導(dǎo)致芯片的算力越高獲得記賬權(quán)的機率越大,最后爭奪記賬權(quán)和芯片高算力成正比。使用ASIC芯片進行大量哈希計算造成巨大能源消耗,據(jù)統(tǒng)計,區(qū)塊鏈高速發(fā)展時期,每年用來挖礦的電力相當(dāng)于幾個核電站的總電力輸出。
黑客利用系統(tǒng)漏洞對其進行監(jiān)聽、攔截、重放甚至破壞的行為被稱為漏洞攻擊,因此,由于區(qū)塊鏈系統(tǒng)自身漏洞造成的黑客攻擊防不勝防,本節(jié)將其漏洞攻擊類型分為分叉攻擊、基于密碼學(xué)攻擊、基于共識機制攻擊、基于智能合約攻擊以及其他攻擊。
4.4.1 分叉攻擊
分叉攻擊在區(qū)塊鏈系統(tǒng)中較為普遍,且危害極大,分叉攻擊又主要分為系統(tǒng)自身產(chǎn)生分叉導(dǎo)致被攻擊和攻擊者主動制造分叉進行攻擊兩大類。系統(tǒng)自身產(chǎn)生分叉導(dǎo)致的分叉:首先,區(qū)塊鏈在弱共識的前提下,因系統(tǒng)時間順序產(chǎn)生區(qū)塊的特性,會同時產(chǎn)生多個區(qū)塊(state fork),因而極易成為攻擊者的攻擊目標(biāo);其次,由于區(qū)塊鏈系統(tǒng)內(nèi)部協(xié)議的更新,例如軟件升級,弱共識無法要求整個系統(tǒng)中所有節(jié)點同時更新,就有可能產(chǎn)生硬分叉或軟分叉[52]。硬分叉中舊節(jié)點不承認(rèn)新節(jié)點,只要舊節(jié)點不更新系統(tǒng)分叉就不會消失。軟分叉則相反,只要一直沿著新節(jié)點增加區(qū)塊即可消除分叉威脅。
攻擊者主動制造分叉進行攻擊:其一是女巫攻擊(sybil attack),它是一種基于P2P網(wǎng)絡(luò)的一種攻擊類型,會由攻擊服務(wù)器生成超過系統(tǒng)51%的傀儡賬戶參與投票選舉造成,它可以擊敗分布式存儲系統(tǒng)的冗余機制,還會對傳感器網(wǎng)絡(luò)中的路由機制構(gòu)成威脅[53]。其二是雙花攻擊(double spending)[54],它利用了比特幣數(shù)字加密貨幣的傳輸特性,使一筆錢“花費兩次”,除非接受方在交易發(fā)起時就立即驗證每一筆代筆的來源,否則就將造成巨大損失,在比特幣中使用交易簽名的方式防范雙花攻擊,許多區(qū)塊鏈硬件也會使用防篡改的模式。其三,以太坊為了防止雙花攻擊,對區(qū)塊使用多數(shù)據(jù)集生成Hash值,但是由于網(wǎng)絡(luò)延遲,會產(chǎn)生重播攻擊(replay attack)[55],即以太坊系統(tǒng)中重復(fù)使用同一請求,一筆錢“收兩次”,與“雙花攻擊”恰好相反。其四是私自挖礦攻擊[56-57],主要指的是惡意礦池挖出區(qū)塊隱瞞不發(fā),而是繼續(xù)在隱藏鏈上挖礦,當(dāng)惡意礦池挖出的隱藏鏈比誠實節(jié)點所維護的合法鏈更長時,惡意礦池發(fā)布分叉鏈,由于誠實礦工都會選擇最長鏈為合法鏈,因此分叉攻擊實施成功。
4.4.2 基于密碼學(xué)攻擊
區(qū)塊鏈中對于數(shù)據(jù)的安全保護基于密碼學(xué)純數(shù)學(xué)計算方式。所使用的密碼學(xué)算法有MAC函數(shù)、HASH函數(shù)以及RSA公鑰加密體制和ECC橢圓曲線加密體制等[58-60]。這些算法在目前理論上是安全的,且密鑰的產(chǎn)生需要特殊的隨機元,一個好的隨機元生成的密鑰對的安全系數(shù)相比于較差的隨機元的安全系數(shù)更高,能直接避免和其他賬戶生成重復(fù)的密鑰對。針對密鑰對的破解,最通用的密碼爆破方式為字典攻擊:通過構(gòu)造常用的密碼組合模式的腳本來自動執(zhí)行匹配賬戶密碼的步驟,但這樣的腳本所構(gòu)造的密碼組合較為單一,對于復(fù)雜的賬戶密碼無從下手。被動攻擊[61]是基于攻擊者對截取到的數(shù)據(jù)PDU進行的流量分析,數(shù)據(jù)包累計回應(yīng),攻擊者可得到數(shù)據(jù)的長度、頻度、特性甚至破解信息內(nèi)容。由于區(qū)塊鏈系統(tǒng)節(jié)點眾多,對于認(rèn)證的參與者無法完全確定其是否誠實,同樣的,側(cè)信道攻擊[62-65]普遍存在于任何區(qū)塊鏈系統(tǒng),服務(wù)器硬件存儲密鑰信息,若私鑰被盜,即可鎖定私鑰對應(yīng)的賬戶,系統(tǒng)中私鑰被盜將無法找回,重新生成同一私鑰在計算上不能成立,若有報道稱某加密貨幣被偷則意味著私鑰被盜,由于區(qū)塊鏈數(shù)據(jù)無法更改,一旦罪犯偷了一把私鑰并將相關(guān)資金公開轉(zhuǎn)移到另一個賬戶,這筆交易通常無法撤銷。目前主流的SHA-256算法的輸入空間2256≈1077,雖是普通計算機晝夜不停兩年的計算量,但若使用量子計算機,計算速率將成指數(shù)倍增長,因此,隨著量子計算機[64-65]的興起,現(xiàn)有密碼體制將直接面臨被攻破的威脅。
4.4.3 基于共識算法攻擊
基于共識算法的攻擊有51%算力攻擊、長程攻擊、DDOS攻擊、區(qū)塊截留攻擊以及滲透博弈攻擊。其中51%算力攻擊指的是PoW通過算力比拼以競爭區(qū)塊記賬權(quán),若惡意節(jié)點擁有51%的哈希算力,便可以發(fā)動攻擊[66]。長程攻擊是指從創(chuàng)世區(qū)塊就開始創(chuàng)造另一條與主鏈完全不同的鏈,試圖替換原主鏈,其中的交易和用戶也不完全一致,由于節(jié)點的弱主觀性,長程攻擊成了PoS最大的威脅[67]。DDOS攻擊是指攻擊者旨在利用龐大的IP群體對目標(biāo)主機發(fā)送大量無效請求,導(dǎo)致目標(biāo)主機接收不到真實請求,有時甚至造成系統(tǒng)癱瘓,致使共識效率極低,如在Hyperledger Fabric中極少數(shù)的背書節(jié)點就容易成為攻擊目標(biāo)[68]。區(qū)塊截留攻擊則指的是惡意礦工通過丟棄所有成功答案,而只向礦池管理員提交部分答案,造成礦池虧損。雖然區(qū)塊截留不會對區(qū)塊鏈造成很大的傷害,但是會降低礦池和誠實節(jié)點的收益,且以極低的代價讓礦池不再受誠實節(jié)點的信任。滲透博弈[69]的原理源自博弈樹,即攻擊者選擇對區(qū)塊節(jié)點進行滲透,一般出現(xiàn)在礦池間的惡性競爭,于是在受攻擊的節(jié)點上形成博弈狀態(tài),各方都為了自己的利益最大化[66]。
4.4.4 基于智能合約攻擊
雖然智能合約是一段自動執(zhí)行的程序代碼,但它只是一套固定的規(guī)則邏輯在經(jīng)過編寫和審計之后得到多方用戶簽署再部署到分布式系統(tǒng)中,實際開放平臺中還是存在合約構(gòu)造不合理、代碼不嚴(yán)謹(jǐn)、確認(rèn)時間長以及事件調(diào)用依賴情況嚴(yán)重等不足,極易隱含漏洞成為被攻擊的對象。
DAO[51]:區(qū)塊鏈?zhǔn)飞媳娝苤暮诳凸羰录?,因為系統(tǒng)代碼漏洞,攻擊者可間接遞歸調(diào)用漏洞函數(shù),旨在系統(tǒng)中強行創(chuàng)建分支,并在每個分支上都獲取以太幣,the DAO攻擊造成了6 000萬美元的金額損失。
時間戳依賴攻擊[71]:在以太坊中設(shè)定節(jié)點之間需保持時間“大致相同”而并非完全保持一致,前驅(qū)區(qū)塊的哈希值和區(qū)塊數(shù)是已知的其他的合約變量,如導(dǎo)致產(chǎn)生隨機數(shù)的原因也是已知的。因此,礦工就可以預(yù)先計算和選擇時間戳,礦工可以隨機產(chǎn)生一個有利于他的結(jié)果,而攻擊者利用這偏差來左右時間戳的設(shè)置并發(fā)動攻擊。
調(diào)用堆棧深度攻擊:智能合約中規(guī)定,當(dāng)外部用戶調(diào)用合約用戶時,合約堆棧自動增加一位,當(dāng)棧滿時會有溢出異常。在以太坊中,智能合約規(guī)定棧最大為1 024位,攻擊者在發(fā)動攻擊之前,事先生成一個將滿的堆棧,當(dāng)再次調(diào)用目標(biāo)合約時堆棧溢出就會拋出異常,導(dǎo)致系統(tǒng)崩潰輕。
交易順序依賴攻擊[72]:一個區(qū)塊中包含的兩個交易同時調(diào)用了一個合約導(dǎo)致用戶不知道他們單獨調(diào)用時合同處于哪種狀態(tài),因此用戶打算調(diào)用的合約狀態(tài)與執(zhí)行時發(fā)生的實際狀態(tài)存在差異,所以只有負(fù)責(zé)開采的礦工能決定合約的最終狀態(tài)即交易的執(zhí)行順序。惡意用戶可以利用合約的交易排序依賴來獲得更多的利潤,甚至可以竊取用戶的錢。
代碼漏洞:在運算過程中當(dāng)計算結(jié)果無法放置在整型數(shù)據(jù)類型中時,會產(chǎn)生整數(shù)溢出(integer overflow)[72]。例如以太坊使用的solidity語言就具有該嚴(yán)重漏洞,會導(dǎo)致攻擊者獲得未經(jīng)授權(quán)的數(shù)字資產(chǎn),且solidity語言無法支持小數(shù)點,這可能使得一個區(qū)塊鏈項目因數(shù)據(jù)格式不一致或精度不匹配而半途夭折。
路由更改攻擊,即攻擊者利用BGP動態(tài)變化的路由更改自己的網(wǎng)絡(luò)前綴偽裝成其他節(jié)點,并對目標(biāo)節(jié)點進行定向流量攔截,引導(dǎo)數(shù)據(jù)流向原本錯誤的路線。
4.4.5 其他攻擊
除了以上四類基于區(qū)塊鏈系統(tǒng)的漏洞攻擊,還存在一些基于網(wǎng)絡(luò)、社工或物理設(shè)備的漏洞攻擊,攻擊者可以利用它們從系統(tǒng)之外對數(shù)據(jù)進行竊取或破壞。分布式系統(tǒng)使物理上分隔的用戶得以網(wǎng)絡(luò)交互,而日蝕攻擊可以阻止目標(biāo)用戶與外界進行數(shù)據(jù)通信。
病毒攻擊:現(xiàn)階段區(qū)塊鏈平臺的廣泛應(yīng)用,沒有統(tǒng)一的標(biāo)準(zhǔn)進行規(guī)范化約束,攻擊者想要植入病毒或木馬很容易,這會嚴(yán)重威脅到用戶的財務(wù)狀況[73]。
供應(yīng)鏈攻擊:大多數(shù)的企業(yè)會把自家的大型業(yè)務(wù)外包給其他的技術(shù)公司或者是多家企業(yè)聯(lián)合業(yè)務(wù),但很多時候這種潛在的危險就是合作方,他可能是流氓企業(yè),也可能有流氓雇員,在系統(tǒng)的產(chǎn)生過程中就已經(jīng)存在漏洞。
中間人攻擊:攻擊者對網(wǎng)絡(luò)中傳輸?shù)男畔⑦M行截取、偷聽甚至篡改,但不會驚動通信雙方的攻擊方式。
重放攻擊:即將上一次傳輸?shù)男畔⑴c當(dāng)前傳輸?shù)男畔⑦M行合并再發(fā)送,以達到欺騙系統(tǒng)和阻礙認(rèn)證的目的。
社會工程學(xué)分析[74-75]:對某些賬戶的交易數(shù)據(jù)進行流量分析,聯(lián)系他在現(xiàn)實中的生活軌跡得到用戶的真實身份。
惡意軟件攻擊:攻擊者通過向用戶發(fā)送惡意軟件騙取用戶登陸信息,以盜取賬戶信息和節(jié)點私鑰等。
側(cè)信道攻擊:攻擊者對鏈下支持區(qū)塊鏈運行的物理設(shè)備進行的攻擊甚至破壞,導(dǎo)致服務(wù)器硬盤損壞數(shù)據(jù)丟失等。雖然攻擊者達到了破壞區(qū)塊鏈分布式賬本的完整性,但對于攻擊者本身并沒有多大益處。除以上所列出的各類攻擊,還有各種各樣的攻擊類型。
綜上所述,導(dǎo)致全球區(qū)塊鏈安全事件的原因包括兩個方面:一方面是其共識機制、私鑰管理、智能合約等存在的技術(shù)局限性所面臨的安全問題;另一方面是區(qū)塊鏈去中心、自治化的特點給現(xiàn)有數(shù)據(jù)存儲、隱私保護、資源分配等技術(shù)手段帶來了新的挑戰(zhàn)。文章從目前區(qū)塊鏈現(xiàn)存問題入手,其一從系統(tǒng)內(nèi)部結(jié)構(gòu)和邏輯意義兩方面總結(jié)了技術(shù)局限所面臨挑戰(zhàn)的可能解決方案,其二提出檢測技術(shù)、身份管理和法律法規(guī)三方面提出合理建議,共同維護區(qū)塊鏈系統(tǒng)的安全性。
存在于區(qū)塊鏈系統(tǒng)內(nèi)部結(jié)構(gòu)的兩類攻擊類型是基于分叉機制攻擊和基于密碼學(xué)攻擊。在區(qū)塊鏈系統(tǒng)中,分叉尤為常見,它易導(dǎo)致最長合法鏈不一致、系統(tǒng)無法同時更新軟件、偽造節(jié)點投票和發(fā)動雙花和重播攻擊,或者私自屯塊覆蓋最長合法鏈等操作。因此為了有效緩解區(qū)塊鏈遭到以上分叉攻擊造成的影響,對應(yīng)的解決方案如下:需要提升共識效率,增加出塊速率;更新?lián)Q代時定期查看日志,提醒用戶及時更新;參與工作量證明機制,同時對每個節(jié)點身份進行驗證;增加采礦過程的復(fù)雜性,每個用戶增設(shè)UTXO集合,對于新產(chǎn)生的塊延遲確認(rèn),在6個區(qū)塊產(chǎn)出(約1 h)之后,被篡改概率指數(shù)下降;使用隨機數(shù)和時間戳同時對數(shù)據(jù)包進行實時標(biāo)記,對每一筆交易都有簽名;定時查看CPU占用率高的進程,查看內(nèi)部網(wǎng)絡(luò)和主機的安全防護設(shè)備告警和日志信息,查找異常?;诿艽a學(xué)的攻擊主要分為四類:較簡單的字典攻擊、由鏈外產(chǎn)生的被動攻擊、基于物理邏輯的側(cè)信道攻擊以及復(fù)雜的量子密碼攻擊。字典攻擊使用數(shù)學(xué)公式的排列組合或弱口令即可破解,世紀(jì)中葉非對稱密碼問世之后字典攻擊只能對付對稱密碼。被動攻擊主要是通過分析大量數(shù)據(jù)包得到信息來破壞數(shù)據(jù)的保密性和完整性,因此使用HASH函數(shù)計算得到的固定值再MAC函數(shù)取摘要,HASH函數(shù)與MAC函數(shù)相結(jié)合可以得到對消息以及消息發(fā)送者的同時驗證。區(qū)塊鏈系統(tǒng)中密鑰管理的安全性允許節(jié)點自己生成密鑰對,以促進網(wǎng)絡(luò)中節(jié)點之間的安全通信,側(cè)信道攻擊主要針對存儲有密鑰的服務(wù)器或緩沖區(qū),現(xiàn)有文獻[76]提出了基于區(qū)塊鏈的邊緣計算密鑰管理方案,并且提出以公開審計的方式對密鑰進行保護。量子密碼是目前最復(fù)雜的密碼之一,量子計算機是一種利用物質(zhì)和能量的物理特性進行計算的新技術(shù),因此一個足夠強大的量子計算機將使許多種形式從密鑰交換到加密再到數(shù)字認(rèn)證都處于危險之中。針對數(shù)據(jù)和流量分析以破解交易地址的攻擊,Meiklejohn等[77]提出更完善的“找零地址”,以確保用戶賬戶的安全性。由密鑰管理技術(shù)發(fā)展而來的,為保證系統(tǒng)中私鑰管理的安全性,軟件錢包、硬件錢包、托管錢包和門限錢包技術(shù)相繼出現(xiàn)[78]。文獻[79]提出量子密鑰協(xié)議使遠(yuǎn)程參與者能夠根據(jù)他們的私人輸入公平地建立一個安全的共享密鑰。同時隨機密鑰預(yù)分配機制[80-81]也開始流行。
區(qū)塊鏈系統(tǒng)基于關(guān)鍵技術(shù)的邏輯意義,且可插拔的兩類攻擊類型是基于共識機制攻擊和基于智能合約攻擊,共識機制主要以分布式系統(tǒng)本身和所使用網(wǎng)絡(luò)兩方面改進,智能合約作為可插拔的自動執(zhí)行程序,具有極強的可塑性,因此解決方案主要從已有的攻擊類型和對應(yīng)的可能解決方案,如表4所示。
表4 基于共識機制和智能合約攻擊防護措施分類Table 4 Protection measures of attacks based on consensu mechanism and smart contracts
區(qū)塊鏈問世以來一直面臨著各種各樣的監(jiān)管問題,無論是自我監(jiān)管還是第三方協(xié)同管理都存在弊端,因此經(jīng)研究分析得以下三條建議:
檢測技術(shù):現(xiàn)存的機器學(xué)習(xí)和數(shù)據(jù)挖掘算法可能會側(cè)重于檢測基于區(qū)塊鏈交易中的欺詐和發(fā)現(xiàn)入侵者的新型應(yīng)用,通過對人們的交易歷史進行分析、監(jiān)控和檢測行為模式,監(jiān)督機器學(xué)習(xí)方法,如深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò),支持向量馬赫數(shù)網(wǎng)絡(luò)網(wǎng)絡(luò)和貝葉斯信念網(wǎng)絡(luò)可能有助于檢測離群值行為。
法律法規(guī):各機構(gòu)、立法者和立法機構(gòu)應(yīng)了解、調(diào)查和審查區(qū)塊鏈技術(shù)的機制和影響,并合作開發(fā)和實施法律、政策和法規(guī)管理程序,以管理區(qū)塊鏈技術(shù)的使用,這樣做可能會催生創(chuàng)新商業(yè)模式的新興點對點經(jīng)濟的安全性和運作。NIST網(wǎng)絡(luò)安全框架明確規(guī)定區(qū)塊鏈網(wǎng)絡(luò)環(huán)境安全,盡管該框架不是專門為區(qū)塊鏈技術(shù)設(shè)計的,但其標(biāo)準(zhǔn)足夠廣泛,足以涵蓋區(qū)塊鏈技術(shù),并幫助機構(gòu)開發(fā)識別和控制影響區(qū)塊鏈技術(shù)的風(fēng)險的管理系統(tǒng)和流程。
廣泛應(yīng)用:在此提出一種新的思想,除非得到大多數(shù)社會技術(shù)的廣泛接受和采用,否則該技術(shù)中固有的任何機制和保護都不能發(fā)揮作用。雖然只有一小部分交易發(fā)生并記錄在區(qū)塊鏈中,但攻擊者、惡意分子和罪犯仍然可以通過其他渠道獲得想要的信息。因此,將區(qū)塊鏈廣泛應(yīng)用于各大領(lǐng)域?qū)Τ晒Φ仡A(yù)防各類型的攻擊至關(guān)重要。
隨著區(qū)塊鏈技術(shù)快速發(fā)展,區(qū)塊鏈具有數(shù)據(jù)去中心化管理、不可篡改和安全性高等優(yōu)點,使區(qū)塊鏈引起了政府、企業(yè)和學(xué)者的廣泛關(guān)注,并在一些領(lǐng)域得到成功應(yīng)用。但是區(qū)塊鏈為去中心化平臺提供技術(shù)的同時,自身系統(tǒng)漏洞所帶來的安全問題也越演越烈。本文基于以上問題,從區(qū)塊鏈關(guān)鍵技術(shù)和漏洞分類分析入手,通過文獻分析和綜合研究得到以下結(jié)論:
總結(jié)了區(qū)塊鏈自發(fā)展以來的國內(nèi)外研究現(xiàn)狀以及漏洞演變趨勢,發(fā)現(xiàn)應(yīng)用程序、操作系統(tǒng)及數(shù)據(jù)庫的安全問題依然嚴(yán)重,通過分析研究文獻對目前區(qū)塊鏈系統(tǒng)存在漏洞的分類得出實例分析。接著歸納了區(qū)塊鏈的概念,同時對密碼學(xué)、默克爾樹、對等節(jié)點(P2P)、共識機制以及智能合約等區(qū)塊鏈關(guān)鍵技術(shù)進行深入分析,總結(jié)了各自的工作原理及其優(yōu)缺點。尤其是對目前眾多平臺主流的區(qū)塊鏈共識算法應(yīng)用效果進行對比分析,總結(jié)各種關(guān)鍵技術(shù)適宜的應(yīng)用場景,以方便用戶參考借鑒。
對區(qū)塊鏈的數(shù)據(jù)存儲與交互、隱私保護、資源分配、漏洞攻擊等四個方面進行分析總結(jié),歸納并指出了區(qū)塊鏈系統(tǒng)在安全方面存在的亟需解決的問題,對區(qū)塊鏈系統(tǒng)的漏洞攻擊進行歸納,指出分叉攻擊、基于密碼學(xué)攻擊、基于共識算法攻擊、基于智能合約攻擊以及從系統(tǒng)之外發(fā)起的攻擊等五類可被利用的漏洞攻擊,并對區(qū)塊鏈系統(tǒng)存在的安全漏洞攻擊進行分類,從大量文獻中歸納分析得出各個攻擊的類別定義以及可能有效的解決方案,為用戶提高區(qū)塊鏈安全性指明方向。以上存在的四個方面問題對區(qū)塊鏈系統(tǒng)存有極大的安全威脅,務(wù)必加以重視和防范。
結(jié)合以上問題,本文建議在未來系統(tǒng)設(shè)計的過程中需更加完善安全體系,從算法到系統(tǒng)整體提升區(qū)塊鏈系統(tǒng)的安全性,其中對于數(shù)據(jù)的存儲效率還需要進一步的提升,毫秒級的交易額數(shù)量直接影響著區(qū)塊鏈系統(tǒng)的性能,因此需要提供更高效的共識機制,對隱私數(shù)據(jù)的保護需要增加訪問控制的功能以防止第三方惡意入侵,以及系統(tǒng)對資源的分配可采用云端服務(wù)器或IPFS技術(shù),因此未來還需對區(qū)塊鏈內(nèi)部系統(tǒng)做進一步完善,為區(qū)塊鏈技術(shù)發(fā)展和平臺開發(fā)提供更加準(zhǔn)確、安全、標(biāo)準(zhǔn)的技術(shù),以防止各類漏洞對區(qū)塊鏈系統(tǒng)的攻擊,進而提升區(qū)塊鏈系統(tǒng)的工作效率。