唐夢菲, 蔣 芃, 張芷璇, 李彥霖, 祝烈煌
北京理工大學(xué) 網(wǎng)絡(luò)空間安全學(xué)院, 北京 100081
云計(jì)算因其便利訪問、彈性服務(wù)和按需付費(fèi)等特點(diǎn), 受到了廣泛關(guān)注, 數(shù)據(jù)存儲(chǔ)形式大多從本地存儲(chǔ)轉(zhuǎn)變?yōu)橥獍鎯?chǔ), 來降低本地的存儲(chǔ)和計(jì)算代價(jià). 用戶在將數(shù)據(jù)外包給第三方云服務(wù)器后, 失去了對這些存儲(chǔ)數(shù)據(jù)的直接控制, 導(dǎo)致數(shù)據(jù)極大程度上面臨各種威脅, 比如數(shù)據(jù)可能會(huì)被竊取和篡改等. 因此數(shù)據(jù)安全是外包存儲(chǔ)必須面臨的一個(gè)重要問題. 隨著《中華人民共和國數(shù)據(jù)安全法(草案)》的發(fā)布, 數(shù)據(jù)安全已然成為了國家網(wǎng)絡(luò)安全保障中的重要一環(huán). 為了保護(hù)數(shù)據(jù)的機(jī)密性, 傳統(tǒng)的方法是采用先加密再存儲(chǔ)的方式, 這給數(shù)據(jù)的有效查詢和利用造成了一定的困難. 當(dāng)用戶想要使用某個(gè)特定數(shù)據(jù)時(shí), 若把服務(wù)器上所有密文下載到本地, 解密之后再進(jìn)行搜索, 會(huì)造成巨大的時(shí)間與空間開銷; 若把密鑰給服務(wù)器, 讓服務(wù)器解密后再進(jìn)行查詢, 數(shù)據(jù)的機(jī)密性無法得到保障.
可搜索加密機(jī)制(Searchable Encryption, SE) 應(yīng)運(yùn)而生[1]. 用戶首先使用SE 機(jī)制對數(shù)據(jù)進(jìn)行加密并將密文存儲(chǔ)在服務(wù)器中, 當(dāng)用戶需要搜索某個(gè)關(guān)鍵字時(shí), 便將該關(guān)鍵字的搜索口令發(fā)送給云服務(wù)器, 云服務(wù)器將接收到的搜索口令與各個(gè)密文進(jìn)行匹配, 若匹配成功則說明該密文中包含此關(guān)鍵字, 遍歷后云服務(wù)器將匹配成功的密文返回給用戶. 根據(jù)所使用的密碼學(xué)機(jī)制的不同, 現(xiàn)有的可搜索加密機(jī)制分為公鑰可搜索加密(Public key Encryption with Keyword Search, PEKS)[2]和對稱密鑰可搜索加密(Symmetrickey Searchable Encryption, SSE)[3]. 相比SSE 而言, PEKS 因無需復(fù)雜的密鑰管理且能實(shí)現(xiàn)數(shù)據(jù)共享,成為了國內(nèi)外研究的熱點(diǎn). 在PEKS 機(jī)制中, 數(shù)據(jù)以密文的形式存儲(chǔ)在服務(wù)器中, 用戶通過提供關(guān)鍵字陷門給服務(wù)器, 讓服務(wù)器能夠在對關(guān)鍵字相關(guān)信息一無所知的情況下檢索出相應(yīng)的密文, 這種密文檢索方式可以有效進(jìn)行密文形式的查詢, 同時(shí)保障了用戶的關(guān)鍵字隱私. 公平性和可靠性是用戶判斷數(shù)據(jù)查詢服務(wù)的重要標(biāo)準(zhǔn). 本文中, 公平性指的是各個(gè)參與者能夠獲得自己應(yīng)該獲得的酬勞, 并且酬勞分配結(jié)果能得到廣泛支持; 可靠性是指系統(tǒng)能夠在規(guī)定時(shí)間內(nèi)正確地完成檢索任務(wù). 通常的可搜索加密機(jī)制會(huì)默認(rèn)服務(wù)器能夠誠實(shí)且嚴(yán)格地執(zhí)行搜索協(xié)議, 然而, 各種利益訴求和軟件入侵都會(huì)引起服務(wù)器的惡意轉(zhuǎn)變, 導(dǎo)致其偏離搜索協(xié)議, 只返回部分檢索結(jié)果甚至是不正確的檢索結(jié)果, 而用戶所支付的費(fèi)用不會(huì)被返還. 這種惡意服務(wù)器嚴(yán)重破壞了檢索過程中的公平性和可靠性. 如何面向惡意服務(wù)器實(shí)現(xiàn)公平可靠的密文檢索方案成為必須解決的問題.
2008 年, 中本聰[4]首次提出了區(qū)塊鏈的概念. 區(qū)塊鏈?zhǔn)且苑植际綍r(shí)間戳服務(wù)器以及P2P 數(shù)據(jù)傳輸網(wǎng)絡(luò)為基礎(chǔ)構(gòu)建的完全無需第三方的分布式賬本, 它的目標(biāo)是實(shí)現(xiàn)一個(gè)只允許添加、不允許刪除的去中心化分布式賬本. 區(qū)塊鏈由全網(wǎng)節(jié)點(diǎn)共同維護(hù), 共識(shí)機(jī)制無需可信的第三方, 分布式的網(wǎng)絡(luò)架構(gòu)可以避免中心節(jié)點(diǎn)受到攻擊或破壞, 系統(tǒng)穩(wěn)定性較高, 這些優(yōu)勢能夠較好地用于解決數(shù)據(jù)可靠性的問題. Szabo[5]在1994 年提出了智能合約的概念, 智能合約是相互不信任的參與者之間的協(xié)議. Clack[6]提出區(qū)塊鏈可以作為底層技術(shù)用來支持智能合約, 可以讓智能合約在沒有第三方干涉的情況下進(jìn)行可信交易. 智能合約內(nèi)置了豐富的轉(zhuǎn)賬功能, 它的這些機(jī)制可以較好地判斷合約參與方的誠信并根據(jù)他們做出的行為分配相應(yīng)的激勵(lì), 從而可以較好地保障公平性.
為了解決目前PEKS 方案中出現(xiàn)的公平性和可靠性的問題, 本文將區(qū)塊鏈技術(shù)與公鑰可搜索加密技術(shù)相結(jié)合, 通過編寫智能合約來控制檢索各方的參與. 我們使用區(qū)塊鏈來管理和代替第三方服務(wù)器, 可以保障存儲(chǔ)的數(shù)據(jù)是可信的、不可篡改的, 可以解決原有的PEKS 方案及其優(yōu)化版本的安全性需要依賴誠實(shí)服務(wù)器的問題. 此類基于區(qū)塊鏈的密文檢索系統(tǒng)可以應(yīng)用在一些對可靠性要求較高的場景中, 如醫(yī)療檔案管理、學(xué)歷檔案管理和犯罪記錄等. 在一次搜索中, 把搜索數(shù)據(jù)過程中的交易記錄在區(qū)塊鏈中, 鏈中數(shù)據(jù)不可篡改并且所有節(jié)點(diǎn)都可驗(yàn)證該交易, 而區(qū)塊鏈的共識(shí)機(jī)制保障了每個(gè)以太坊節(jié)點(diǎn)的一致性. 這種情形下, 交易的結(jié)果具有可靠性. 區(qū)塊鏈可以保障智能合約各個(gè)參與方的激勵(lì)發(fā)放是準(zhǔn)確和可靠的, 那么搜索的公平性也就得到了保障. 現(xiàn)有的區(qū)塊鏈與可搜索加密方案結(jié)合的案例都是將區(qū)塊鏈與對稱密鑰可搜索加密機(jī)制相結(jié)合, 由于對稱密鑰可搜索加密機(jī)制的密鑰不可公開, 所以數(shù)據(jù)擁有者面臨著大量密鑰管理工作, 并且不支持加密數(shù)據(jù)的共享, 而區(qū)塊鏈由于共識(shí)機(jī)制的存在是面向共享的, 所以兩者的結(jié)合會(huì)喪失區(qū)塊鏈原有的共享性. 本文將區(qū)塊鏈與公鑰可搜索加密機(jī)制進(jìn)行結(jié)合, 既可以利用區(qū)塊鏈的去中心化與不可篡改性保障數(shù)據(jù)的可靠與安全, 也可以在方案中繼續(xù)延續(xù)區(qū)塊鏈的共享性, 從而實(shí)現(xiàn)加密數(shù)據(jù)的可靠與共享之間的平衡.
本文旨在設(shè)計(jì)和實(shí)現(xiàn)一個(gè)基于區(qū)塊鏈公鑰可搜索加密系統(tǒng)(Blockchain-based PEKS), 此系統(tǒng)具有關(guān)鍵字隱私性、公平性和可靠性, 可以解決惡意服務(wù)器帶來的安全問題. 本文的貢獻(xiàn)主要有以下三點(diǎn).
(1) 本文在PEKS 方案的基礎(chǔ)上, 結(jié)合區(qū)塊鏈技術(shù), 提出了一個(gè)基于區(qū)塊鏈的公鑰加密可搜索方案通用架構(gòu).
(2) 本文采用了分層的形式, 利用智能合約構(gòu)造了一個(gè)四層級(jí)化的基于區(qū)塊鏈公鑰可搜索加密系統(tǒng).在系統(tǒng)設(shè)計(jì)中, 不同層具有不同的功能與角色, 每層之間的交互保證整個(gè)系統(tǒng)穩(wěn)定運(yùn)行, 從而實(shí)例化一個(gè)安全可靠的基于區(qū)塊鏈公鑰可搜索加密方案.
(3) 基于上述所提出的具體方案, 本文實(shí)現(xiàn)了基于區(qū)塊鏈公鑰加密可搜索的原型系統(tǒng), 并對原型系統(tǒng)進(jìn)行了性能測試與分析, 證明了本文構(gòu)造的可行性與實(shí)用性.
本節(jié)介紹公鑰可搜索加密PEKS、區(qū)塊鏈和智能合約等技術(shù)的研究現(xiàn)狀, 以支撐基于區(qū)塊鏈的公鑰可搜索加密系統(tǒng)的設(shè)計(jì).
PEKS 是在大型數(shù)據(jù)庫中檢索加密數(shù)據(jù)的方法之一. 為了解決加密數(shù)據(jù)上信息如何有效查詢利用的問題, Boneh 等人在2004 年提出了PEKS 模型來減少對稱可搜索加密面臨的復(fù)雜的密鑰問題[2]. 在PEKS 體系中, 發(fā)送方在進(jìn)行數(shù)據(jù)加密時(shí), 使用所發(fā)信息的關(guān)鍵字和接收方的公鑰來生成搜索密文; 而接收方解密時(shí), 利用自己的私鑰以及關(guān)鍵字生成關(guān)鍵字陷門(Trapdoor) 以匹配搜索密文, 當(dāng)Trapdoor 與密文匹配成功后, 服務(wù)器將相應(yīng)的數(shù)據(jù)密文返回給接收方.
近年來, 各類學(xué)者就查詢方式和安全性兩個(gè)重要方面, 對PEKS 展開了研究. 查詢方式方面, Park[7]等人在2004 年提出了連接關(guān)鍵詞公鑰加密可搜索方案; Boneh 和Waters[8]在2007 年提出了在加密數(shù)據(jù)上的連接、交集、和范圍查詢; Yang 和Ma[9]在2016 年提出了增強(qiáng)查詢表達(dá)能力和支持多關(guān)鍵字組合密文檢索的方法; 而Zheng[10]等人和Jiang[11]等人提出了通過用戶屬性或指定關(guān)鍵字的方式來控制檢索的方法. 安全性方面, Byun[12]等人和Yau[13]等人指出基本PEKS 方案不能抵抗關(guān)鍵詞猜測攻擊(Keyword Guessing Attack, KGA). Rhee 等人[14,15]提出了指定測試器的PEKS 模型, 從而抵抗外部KGA; Jiang 等人[16]通過在可搜索密文中引入發(fā)送方身份驗(yàn)證的方式, 實(shí)現(xiàn)了公鑰可搜索在外部攻擊下的安全性.
2008 年中本聰在比特幣論壇首次提出區(qū)塊鏈的概念[4]. 區(qū)塊鏈?zhǔn)且苑植际綍r(shí)間戳服務(wù)器以及P2P數(shù)據(jù)傳輸網(wǎng)絡(luò)為基礎(chǔ)構(gòu)建的完全無需第三方的電子現(xiàn)金系統(tǒng), 它的目標(biāo)是實(shí)現(xiàn)一個(gè)只允許添加、不允許刪除的去中心化分布式賬本. 這個(gè)“賬本” 以一個(gè)線性鏈表作為基層結(jié)構(gòu), 該鏈表由若干區(qū)塊串聯(lián)組成, 每個(gè)區(qū)塊中記錄了本區(qū)塊的編號(hào)、簽名、時(shí)間戳、交易信息以及前一個(gè)區(qū)塊的哈希值. 網(wǎng)絡(luò)中的任何節(jié)點(diǎn)都能通過共識(shí)機(jī)制的確認(rèn)向區(qū)塊鏈中申請?zhí)砑右粋€(gè)新的區(qū)塊, 同時(shí)可用計(jì)算哈希值的方式驗(yàn)證某區(qū)塊是否合法. 區(qū)塊鏈的結(jié)構(gòu)如圖1 所示.
圖1 區(qū)塊鏈的基層結(jié)構(gòu)Figure 1 Basic structure of blockchain
區(qū)塊鏈技術(shù)因其去中心化、高自治性等特點(diǎn)得以迅猛發(fā)展, 它的構(gòu)造糅合了密碼學(xué)、計(jì)算機(jī)科學(xué)、數(shù)學(xué)等諸多領(lǐng)域的知識(shí).
交易(Transaction): 交易是導(dǎo)致賬本狀態(tài)改變的一次操作, 由輸入、輸出和數(shù)字簽名三部分組成,一段時(shí)間內(nèi)所有有效交易以某種結(jié)構(gòu)(譬如Merkle 樹) 連接到一起, 由礦工填充入?yún)^(qū)塊.
區(qū)塊(Block): 區(qū)塊是對當(dāng)前賬本狀態(tài)的一次共識(shí), 記錄著某段時(shí)間發(fā)生的全部交易信息.
鏈(Chain): 區(qū)塊按照順序線性連接形成鏈, 記錄著整個(gè)賬本的所有交易和狀態(tài)變化.
共識(shí)協(xié)議(Consensus protocol): 區(qū)塊鏈因其去中心化的性質(zhì)并沒有中央權(quán)威機(jī)構(gòu), 因此它依靠共識(shí)協(xié)議做出決策. 共識(shí)協(xié)議決定了記錄下一個(gè)區(qū)塊的礦工人選, 礦工們可以通過工作量證明(PoW) 或股權(quán)證明(PoS) 等方式來獲取新區(qū)快的寫入資格.
P2P 網(wǎng)絡(luò)(P2P network): 區(qū)塊鏈?zhǔn)褂玫腜2P 網(wǎng)絡(luò)是一種分布式應(yīng)用程序體系結(jié)構(gòu), 其網(wǎng)絡(luò)上的節(jié)點(diǎn)擁有相同的權(quán)力, 共同構(gòu)成和維護(hù)整個(gè)網(wǎng)絡(luò)的服務(wù)與數(shù)據(jù)的傳輸和寫入. 這種去中心化的存儲(chǔ)和傳輸方式天生具有不可篡改的特點(diǎn), 部分節(jié)點(diǎn)遭受攻擊也不會(huì)對整個(gè)系統(tǒng)造成大的影響.
哈希算法(Hash): 哈希算法是將變長輸入映射為定長輸出的二進(jìn)制串的過程, 在加密和查找算法中應(yīng)用廣泛. 在區(qū)塊鏈中, 數(shù)據(jù)的存儲(chǔ)依靠哈希算法產(chǎn)生哈希值, 譬如, 使用SHA256 算法產(chǎn)生Merkle 樹的結(jié)點(diǎn)信息, 使用Keccak-256 算法產(chǎn)生以太坊賬戶地址, 等等. 一個(gè)安全的哈希函數(shù)的輸出與隨機(jī)數(shù)串別無二致.
區(qū)塊鏈范式(Blockchain paradigm): 將區(qū)塊鏈看作一個(gè)基于交易的狀態(tài)機(jī)[4], 每個(gè)狀態(tài)包含了現(xiàn)實(shí)世界信息的數(shù)據(jù), 譬如賬戶余額、隨機(jī)數(shù)等. 每次記錄交易之后, 狀態(tài)機(jī)將從創(chuàng)始狀態(tài)更新為最終狀態(tài).假設(shè)區(qū)塊鏈當(dāng)前狀態(tài)為a, 在記錄了事務(wù)Tx之后, 區(qū)塊鏈狀態(tài)變?yōu)閍t+1, 使用F表示區(qū)塊鏈執(zhí)行的任意計(jì)算, 則事務(wù)Tx記錄前后的有效狀態(tài)轉(zhuǎn)換可以表示為:at+1=F(at,Tx).
1994 年, Szabo 提出了智能合約的概念[5], Clack[6]討論了如何利用區(qū)塊鏈技術(shù)實(shí)現(xiàn)智能合約. 抽象地說, 智能合約是相互不信任的參與者之間的協(xié)議, 可以由區(qū)塊鏈的共識(shí)機(jī)制自動(dòng)執(zhí)行從而可以不再依賴于中心化的權(quán)威機(jī)構(gòu). Buterin[17]指出, 目前最適合實(shí)現(xiàn)智能合約的區(qū)塊鏈框架為以太坊. 以太坊[18]是基于P2P 網(wǎng)絡(luò)與密碼學(xué)建立起來的區(qū)塊鏈機(jī)制, 在以太坊中智能合約可以通過圖靈完備的編程語言來實(shí)現(xiàn).
以太坊智能合約的正確執(zhí)行是其有效性的必要條件, 否則敵手可能會(huì)通過篡改執(zhí)行來從一個(gè)合法參與者中獲取非法利潤. 但是僅憑智能合約的正確執(zhí)行還不足以確保合約的安全, Delmolino[19]和Luu[20]通過實(shí)際開發(fā)經(jīng)驗(yàn)和對以太坊智能合約的靜態(tài)分析發(fā)現(xiàn)了以太坊智能合約的幾個(gè)漏洞. 其中的一些漏洞在現(xiàn)實(shí)生活中被黑客利用來攻擊以太坊智能合約竊取利潤.
以太坊漏洞主要來自三個(gè)層面: Solidity 編程語言、EVM 以太坊虛擬機(jī)[18]和區(qū)塊鏈. Solidity 編程語言是以太坊上支持智能合約編寫的編程語言, 編程人員的理解與Solidity 的實(shí)際語義的不一致產(chǎn)生了許多漏洞, 針對這些漏洞的攻擊有: DAO 攻擊[21]、“King of the Ether Throne”攻擊[22,23]和GovernMental攻擊[24,25]等. 智能合約漏洞的另一來源為EVM 以太坊虛擬機(jī), 針對以太坊虛擬機(jī)安全漏洞的攻擊主要有: Rubixi[26,27]攻擊和GovernMental 攻擊[24,25]. 還有針對區(qū)塊鏈級(jí)別的攻擊: GovernMental 攻擊[24,25].
盡管Eyal[28]和Luu[20]還指出了區(qū)塊鏈的一致性協(xié)議的效率中存在一些安全漏洞, 但Garay[29]和Sompolinsky[30]的研究理論表明, 只要誠實(shí)的節(jié)點(diǎn)控制了區(qū)塊鏈網(wǎng)絡(luò)中大部分的計(jì)算資源, 那么區(qū)塊鏈的安全性還是可以得到保障.
傳統(tǒng)的可搜索加密機(jī)制(SE) 存在重大缺陷, 需要依靠誠實(shí)的服務(wù)器來保證檢索過程的安全. 而區(qū)塊鏈作為一個(gè)新興技術(shù), 具有不可篡改性和去中心化的性質(zhì), 能夠和SE 結(jié)合解決上述的缺陷.
迄今為止的相關(guān)研究中, 區(qū)塊鏈技術(shù)都是與對稱密鑰可搜索機(jī)制(SSE) 相結(jié)合. 在這個(gè)基礎(chǔ)之上, 相關(guān)工作主要被分為兩類: 一類是采用智能合約作為執(zhí)行搜索匹配的實(shí)體, 借助智能合約的內(nèi)在公平性避免傳統(tǒng)服務(wù)器的惡意行為, 從而保證搜索可靠性[31]; 另一類在原有的SSE 框架下增加區(qū)塊鏈系統(tǒng)作為一個(gè)額外的實(shí)體[32], 服務(wù)器仍然保留原有的搜索功能, 通過與區(qū)塊鏈的交易來保證服務(wù)器和用戶之間的利益公平.
SSE 在理論上對于數(shù)據(jù)的共享有一定的限制, 而區(qū)塊鏈的設(shè)計(jì)就是面向數(shù)據(jù)共享的, 所以兩者結(jié)合過程中會(huì)有一定沖突. 若把存儲(chǔ)與檢索都放在區(qū)塊鏈上, 智能合約承受不了如此大的計(jì)算量, 會(huì)變得緩慢和昂貴. 比如在上述提到的Hu 等人[31]在2018 年實(shí)現(xiàn)的基于區(qū)塊鏈的對稱密鑰可搜索系統(tǒng), 在10 萬條數(shù)據(jù)中檢索一次平均耗時(shí)為24 分鐘.
為了避免SSE 理論上限制共享與區(qū)塊鏈面向共享的沖突, 本文把區(qū)塊鏈技術(shù)與公鑰可搜索加密(PEKS) 相結(jié)合, 并通過設(shè)計(jì)分層化的模型來避開前人工作中出現(xiàn)的檢索速度慢與開銷大的問題, 從而實(shí)現(xiàn)一個(gè)具有實(shí)用價(jià)值的公平可靠的基于區(qū)塊鏈公鑰可搜索加密系統(tǒng).
符號(hào)標(biāo)記如表1 所示.
表1 符號(hào)描述Table 1 Symbol description
PEKS 方案由四個(gè)概率多項(xiàng)式時(shí)間算法構(gòu)成, 分別為KeyGen(s)、PEKS(pk,W)、Trapdoor(sk,W)、Test(pk,s,TW). 具體算法構(gòu)造如下:
? KeyGen(s). 輸入安全參數(shù)s. 隨機(jī)選取α ∈Z?p以及生成元g和構(gòu)造群G1, 輸出公鑰pk =(g,h=gα), 私鑰sk=α.
? PEKS(pk,W). 輸入公鑰pk 和關(guān)鍵字W. 隨機(jī)選取r ∈Z?p, 計(jì)算t=e(H1(W),hr)∈G2, 輸出搜索密文PEKS(pk,W)=[gr,H2(t)].
? Trapdoor(sk,W). 輸入關(guān)鍵字W和私鑰sk. 輸出關(guān)鍵字的搜索口令TW=H1(W)α ∈G1.
? Test(pk,s,TW). 輸入公鑰pk、搜索密文CW和搜索口令TW, 其中CW= PEKS(pk,W) =[gr,H2(t)]. 令CW=[A,B], 判斷H2(e(TW,A))=B是否成立, 若成立, 則輸出1, 否則輸出0.
以太坊智能合約[17]架構(gòu)如圖2 所示. 以太坊在每個(gè)運(yùn)作的節(jié)點(diǎn)上都運(yùn)行著一個(gè)以太坊虛擬機(jī)(EVM), 可以用來執(zhí)行完整的程序. 這些程序在以太坊中稱為智能合約(smart contract). 智能合約可以用來處理數(shù)據(jù), 也內(nèi)置了轉(zhuǎn)賬功能, 可以交易加密貨幣. 智能合約部署后放在以太坊公鏈上, 部署時(shí)會(huì)花費(fèi)費(fèi)用給礦工, 每次通過智能合約寫入或讀取計(jì)算結(jié)果需要提供交易費(fèi)用, 計(jì)算能力由所有以太坊節(jié)點(diǎn)提供. 提供計(jì)算能力的任何節(jié)點(diǎn)都將以Ether 數(shù)字貨幣作為資源支付. 智能合約是在每個(gè)以太坊節(jié)點(diǎn)上執(zhí)行并驗(yàn)證的, 所以計(jì)算結(jié)果是可信任的.
圖2 以太坊智能合約架構(gòu)Figure 2 Structure of Ethereum smart contracts
以太坊開發(fā)出了web3.js 和web3.py, 讓開發(fā)者可以用網(wǎng)頁技術(shù)來撰寫智能合約的操作界面. 這種網(wǎng)頁操作界面又被稱為分布式應(yīng)用程序(DAPP). 以太坊提供了便于交易的加密貨幣—以太幣, 可通過智能合約解決交易上的信任問題, 同時(shí)也可撰寫DAPP 來提供友善的信息匯總與操作界面, 所以以太坊成為了一個(gè)非常理想的區(qū)塊鏈底層技術(shù). 開發(fā)者通過開發(fā)的去中心應(yīng)用DAPP 來和智能合約進(jìn)行交互, 通過DAPP 瀏覽器調(diào)用智能合約, 從而達(dá)到和以太坊交互的目的.
而燃料系統(tǒng)(gas system) 是智能合約特有的交易政策. 執(zhí)行智能合約需要消耗與執(zhí)行指令數(shù)量相當(dāng)?shù)囊蕴珟? 在智能合約中, 這些拿來消耗的以太幣被稱為燃料(gas). 當(dāng)合約部署到以太坊上時(shí), 需要附加一定數(shù)量的燃料. 當(dāng)發(fā)送方調(diào)用智能合約發(fā)起交易時(shí), 智能合約估算此交易需要花費(fèi)的最大燃料, 只有當(dāng)發(fā)送方的賬戶余額大于最大燃料時(shí), 此交易才能被包含到區(qū)塊鏈中執(zhí)行.
以太坊智能合約如今也存在著一定的局限性, 以太坊區(qū)塊鏈的速度和電腦執(zhí)行的速度無法相比, 不適合快速交易; 無法滿足需要存儲(chǔ)較大數(shù)據(jù)的情境, 因?yàn)槠渖系拇鎯?chǔ)成本昂貴.
在本方案中我們把以太坊智能合約與密文檢索技術(shù)相結(jié)合, 把部分較大文件轉(zhuǎn)移到服務(wù)器上存儲(chǔ)來避開上述局限性.
本文旨在設(shè)計(jì)一個(gè)基于區(qū)塊鏈的公鑰可搜索加密系統(tǒng), 此系統(tǒng)具有關(guān)鍵字隱私性、公平性和可靠性,可以避免不可信云服務(wù)器帶來的安全問題, 提高加密數(shù)據(jù)的安全性.
系統(tǒng)模型如圖3 所示, 主要的組成部分有: 數(shù)據(jù)擁有者, 智能合約, 用戶和服務(wù)器.
圖3 系統(tǒng)模型Figure 3 System model
?數(shù)據(jù)擁有者(Data Owner, DO). 數(shù)據(jù)擁有者上傳搜索密文與編號(hào)至智能合約, 上傳數(shù)據(jù)密文至服務(wù)器. 接收自身數(shù)據(jù)被檢索帶來的收益.
?智能合約(Smart Contract, SC). 智能合約通過交易存儲(chǔ)數(shù)據(jù)擁有者上傳的搜索密文和編號(hào).根據(jù)用戶的關(guān)鍵詞陷門檢索相應(yīng)的密文, 并驗(yàn)證密文的完整性與正確性, 并通過交易將檢索結(jié)果下發(fā)給用戶. 管理檢索過程中的費(fèi)用的分配與發(fā)放.
?服務(wù)器(Server, S). 服務(wù)器接收數(shù)據(jù)擁有者存儲(chǔ)的數(shù)據(jù)密文與編號(hào), 接收以太坊智能合約下發(fā)的密文編號(hào), 檢索相應(yīng)的密文, 并將結(jié)果上傳至智能合約等待驗(yàn)證.
?用戶(User, U). 用戶設(shè)置搜索口令, 并將傭金上傳至智能合約中. 接收來自智能合約的驗(yàn)證過的檢索結(jié)果.
在一次完整的存儲(chǔ)與檢索流程中, 首先數(shù)據(jù)擁有者先把搜索密文與搜索密文編號(hào)上傳至智能合約, 同時(shí)將數(shù)據(jù)密文與編號(hào)上傳至服務(wù)器中. 擁有權(quán)限的用戶就可以檢索到此文件, 用戶檢索文件時(shí)設(shè)置搜索口令, 并將傭金上傳至智能合約中. 智能合約根據(jù)搜索口令在搜索密文中進(jìn)行檢索, 檢索到之后使用編號(hào)向服務(wù)器請求密文, 然后驗(yàn)證服務(wù)器返回的密文的完整性, 根據(jù)驗(yàn)證結(jié)果來分發(fā)傭金.
關(guān)鍵字隱私性.服務(wù)器在僅提供密文的情況下不能知道任何明文相關(guān)的內(nèi)容. 在數(shù)據(jù)擁有者未授權(quán)的情況下, 其他用戶不能查詢到此數(shù)據(jù)擁有者的數(shù)據(jù); 數(shù)據(jù)檢索方除了查詢結(jié)果之外不能得知檢索關(guān)鍵詞的相關(guān)信息. 本方案基于PEKS 密文檢索方案保障關(guān)鍵字的隱私性. 用戶提供關(guān)鍵字陷門, 數(shù)據(jù)檢索方可通過陷門檢索出對應(yīng)的密文, 此時(shí)盡管檢索方正確地檢索出了相應(yīng)的結(jié)果, 但是對關(guān)鍵詞相關(guān)信息一無所知.
公平性.公平性是本文在密文檢索中引入的重要性質(zhì). 本文公平性保障靈感主要來源于現(xiàn)實(shí)世界中的交易財(cái)政政策. 我們的公平性主要保證以下兩點(diǎn): 數(shù)據(jù)擁有者只要付費(fèi)給檢索方就可以取得自己正確的檢索結(jié)果, 檢索方只要誠實(shí)地檢索數(shù)據(jù)并且返回正確的結(jié)果就可以掙得報(bào)酬. 當(dāng)數(shù)據(jù)需要共享時(shí), 用戶只要付費(fèi)給檢索方和數(shù)據(jù)擁有者, 就可以取得自己正確的檢索結(jié)果, 數(shù)據(jù)擁有者如果想要共享自己的數(shù)據(jù)來獲取報(bào)酬的話, 只要公開令牌即可. 總的來說, 我們的公平性政策保證了各方能夠被激勵(lì)從而去做誠實(shí)并且正確的工作, 如果某方違背了協(xié)議, 他將得不到報(bào)酬.
可靠性.本文可靠性保障主要來源于區(qū)塊鏈的不可篡改機(jī)制. 篡改存儲(chǔ)在區(qū)塊鏈上的數(shù)據(jù), 需要篡改此數(shù)據(jù)位置之后所有區(qū)塊的哈希和相關(guān)記錄, 理論上若要篡改數(shù)據(jù)需要控制51% 的節(jié)點(diǎn), 此操作難度極高, 所以區(qū)塊鏈擁有不可篡改性. 密文保存在區(qū)塊鏈中使得其不能被篡改, 也就保障了數(shù)據(jù)是正確的和可靠的.
本小節(jié)采用安全游戲的方式, 定義了基于區(qū)塊鏈PEKS 系統(tǒng)的安全模型.
(1) 關(guān)鍵字隱私性
關(guān)鍵字隱私性主要考慮抵抗選擇關(guān)鍵字攻擊的語義安全(semantic security against chosen keyword attack), 即敵手不會(huì)從密文中獲得關(guān)鍵字的任何信息. 若系統(tǒng)擁有關(guān)鍵字隱私性, 那么敵手A不會(huì)從密文中獲得關(guān)鍵字的任何信息. 其可以通過挑戰(zhàn)者C與敵手A之間的安全游戲進(jìn)行定義. 在這個(gè)安全游戲中,A不是授權(quán)用戶, 所以A無法獲得某個(gè)密文的關(guān)鍵字. 在這個(gè)安全游戲中, 現(xiàn)允許A進(jìn)行CKA, 并嘗試區(qū)分一個(gè)可檢索密文對應(yīng)的關(guān)鍵字W0和W1. 敵手A與挑戰(zhàn)者C的安全游戲定義如下.
初始化階段: 挑戰(zhàn)者C運(yùn)行KeyGen(s), 生成公鑰pk 和私鑰sk, 挑戰(zhàn)者C將公鑰pk 發(fā)送給敵手A.
詢問階段1: 敵手A向C詢問一系列關(guān)鍵字Wi ∈{0,1}i的陷門, 挑戰(zhàn)者C運(yùn)行Trapdoor(sk,W)生成關(guān)鍵字陷門, 并將陷門告訴敵手A. 然后敵手A向挑戰(zhàn)者C詢問一系列與Wi對應(yīng)的搜索密文, 挑戰(zhàn)者C執(zhí)行PEKS(pk,W) 生成關(guān)鍵字密文, 并將其發(fā)送給攻擊者A.
挑戰(zhàn)階段: 敵手A隨機(jī)選取兩個(gè)不同的關(guān)鍵字W0、W1發(fā)送給挑戰(zhàn)者C,W0、W1要求是不能在詢問階段1 詢問過的關(guān)鍵字. 挑戰(zhàn)者隨機(jī)選取一個(gè)b ∈{0,1}生成挑戰(zhàn)密文C=PEKS(pk,Wb), 并將改挑戰(zhàn)密文發(fā)送給敵手A.
詢問階段2: 與詢問階段1 方式類似, 敵手A繼續(xù)向挑戰(zhàn)者C請求關(guān)鍵字陷門, 但是不允許詢問關(guān)鍵字W0、W1的陷門信息.
猜測階段: 敵手輸出一個(gè)b′∈{0,1}, 如果b=b′, 那么敵手A在安全游戲中獲勝, 否則失敗. 我們將敵手A贏得上述安全游戲的優(yōu)勢定義為如下形式:
定義1基于區(qū)塊鏈的公鑰可搜索加密系統(tǒng)具有關(guān)鍵字隱私性, 如果對于任意概率多項(xiàng)式時(shí)間(Probabilistic Polynomial Time, PPT) 的敵手A, 其贏得上述安全游戲的優(yōu)勢?是可忽略的, 即AdvCKAA (2) 公平性 我們采用基于模擬的安全來定義系統(tǒng)的公平性. 系統(tǒng)的公平性分析是通過比較現(xiàn)實(shí)世界與理想世界中的交易執(zhí)行情況來定義的. 在現(xiàn)實(shí)世界中, 用戶U通過我們系統(tǒng)中的智能合約來獲得服務(wù), 而在理想世界中, 用戶通過一個(gè)理想的受信任的第三方來保證服務(wù)的準(zhǔn)確性. 無論是現(xiàn)實(shí)世界還是理想世界, 都有一個(gè)特殊的環(huán)境Z, 它的作用是協(xié)調(diào)各個(gè)參與方的輸入與輸出. ?在理想世界中, 我們設(shè)置一個(gè)理想的受信任的第三方L.U可以被L所驗(yàn)證, 也就是說L可以驗(yàn)證出不誠實(shí)的參與者來保障整個(gè)交易的公平性. 我們將理想世界中交易輸出定義為IdealU,S(T,f,v(iu)), 其中T是由U發(fā)起的交易,f是服務(wù)費(fèi),v(iu) 是驗(yàn)證函數(shù), 其中iu 是U提供的輸入. ?在真實(shí)世界中,U可以被智能合約所驗(yàn)證. 交互的公平性被我們系統(tǒng)中的一系列機(jī)制所保障. 我們將真實(shí)世界中交易的輸出定義為RealU,S(T,f,v(iu,is)).U執(zhí)行sendRawTransaction() 來發(fā)起交易, 如果U發(fā)起交易失敗, 則交易被系統(tǒng)終止, 費(fèi)用被返回給U. 如果U是一個(gè)誠實(shí)的用戶, 那么Verify() 將輸出“True”, 整個(gè)交易結(jié)束; 否則Verify() 輸出“False”, 同時(shí),U的費(fèi)用被退回. 我們假定不誠實(shí)的用戶U′的目的是為了從服務(wù)方獲得免費(fèi)的服務(wù), 而不是惡意地消耗服務(wù)方的計(jì)算能力. 定義2基于區(qū)塊鏈的公鑰可搜索加密系統(tǒng)是公平的, 如果任意現(xiàn)實(shí)世界中的不誠實(shí)的用戶U?運(yùn)行了時(shí)間t, 在理想世界中都存在一個(gè)用戶U?′運(yùn)行了時(shí)間t′, 它們在任意的交易T, 驗(yàn)證函數(shù)v(iu) 和服務(wù)費(fèi)f, 在所有PPT 環(huán)境Z中都有: 為了讓智能合約與PEKS 密文檢索方案更好地交互, 本方案采用分層的形式構(gòu)造了一個(gè)基于區(qū)塊鏈的公鑰可搜索加密系統(tǒng). 在本方案的分層構(gòu)造中, 不同層具有不同的功能與角色, 每層之間通過約定好的接口交互以保障整個(gè)系統(tǒng)穩(wěn)定地運(yùn)行, 從而實(shí)現(xiàn)一個(gè)安全可靠的設(shè)計(jì)方案. 系統(tǒng)整體設(shè)計(jì)如圖4 所描述, 主要分為四層: 客戶端、檢索層、智能合約層和服務(wù)器. 圖4 基于區(qū)塊鏈的公鑰可搜索加密系統(tǒng)設(shè)計(jì)圖Figure 4 Blockchain-based public key encryption with keyword search system scheme ?客戶端(Client, C): 當(dāng)數(shù)據(jù)擁有者存儲(chǔ)明文時(shí), 客戶端接收數(shù)據(jù)擁有者的明文并傳入檢索層. 當(dāng)用戶想要檢索明文時(shí), 客戶端接收用戶的關(guān)鍵字與傭金并傳入檢索層. 接收來自檢索層傳入的明文, 將結(jié)果下發(fā)給用戶. 總的來說客戶端的作用是提供一個(gè)與用戶交互的平臺(tái). ?檢索層(Retrieval, R): 接收客戶端傳入的明文并執(zhí)行加密, 將數(shù)據(jù)密文與編號(hào)傳入服務(wù)器, 將搜索密文與編號(hào)傳入智能合約層, 將編號(hào)集合存為索引存儲(chǔ)在本層. 接收客戶端傳入的傭金與關(guān)鍵字, 生成搜索口令并把傭金傳入智能合約層. 接收來自智能合約層的搜索密文, 并用搜索口令檢索,將檢索結(jié)果傳入智能合約層. 接收來自智能合約層的數(shù)據(jù)密文, 解密并將明文傳入客戶端. 總的來說檢索層執(zhí)行與密文檢索相關(guān)的算法. ?智能合約層(Smart content, SC): 存儲(chǔ)來自檢索層傳入的搜索密文與編號(hào). 接收來自檢索層的傭金, 并作為押金暫時(shí)存放在智能合約, 再將搜索密文傳入檢索層. 接收來自檢索層的檢索結(jié)果,并且將對應(yīng)的編號(hào)傳入服務(wù)器. 接收來自服務(wù)器的數(shù)據(jù)密文并且驗(yàn)證此數(shù)據(jù)密文是否正確, 若正確則將傭金付給數(shù)據(jù)擁有者, 并將數(shù)據(jù)密文傳給檢索層. 總的來說智能合約層執(zhí)行傭金的管理與發(fā)方. ?服務(wù)器層(Sever, S): 接收來自檢索層傳入的數(shù)據(jù)密文和編號(hào)并存儲(chǔ). 接收來自智能合約的編號(hào),并返回相應(yīng)的數(shù)據(jù)密文傳入給智能合約層. 總的來說, 服務(wù)器負(fù)責(zé)存儲(chǔ)密文并誠實(shí)地返回密文. 基于區(qū)塊鏈的公鑰可搜索加密方案包含以下7 個(gè)階段, 該方案基于PEKS[2]的構(gòu)造來實(shí)現(xiàn)搜索口令的生成和密文檢索, 結(jié)合智能合約技術(shù)來處理各個(gè)賬戶之間的交易以保障方案的安全性和可靠性. (1) 初始化階段 KeyGen(s)→(pk,sk), 系統(tǒng)初始化. 選擇一個(gè)安全參數(shù)s作為輸入, 隨機(jī)選取α ∈Z?p以及群G1和生成元g, 輸出公鑰pk 和私鑰sk 如下 智能合約初始化, 數(shù)據(jù)擁有者注冊得到賬戶$Bowner并設(shè)置檢索單價(jià)$offer, 用戶注冊得到賬戶$Buser, 用戶需向$Buser中存款, 智能合約設(shè)置押金賬戶$deposit. 智能合約交易相關(guān)的賬戶如表2 所示. 表2 交易涉及的各個(gè)賬戶及其含義Table 2 Accounts involved in the transaction (2) 密文生成階段 Enc(m,W,pk)→(Cm,PEKS(pk,W)). 該算法由檢索層進(jìn)行計(jì)算, 輸入為明文m、關(guān)鍵字W和公鑰pk, 輸出為數(shù)據(jù)密文Cm和搜索密文PEKS(pk,W). 計(jì)算密文, 明文m通過RSA 非對稱加密算法得到數(shù)據(jù)密文Cm. 計(jì)算搜索密文, 隨機(jī)選取r ∈Z?p, 首先計(jì)算t=e(H1(W),hr)∈G2, 得到搜索密文, 記為 數(shù)據(jù)擁有者將Cm與PEKS(pk,W) 進(jìn)行編號(hào), 得到對應(yīng)的編號(hào)N. 將數(shù)據(jù)密文Cm與編號(hào)N進(jìn)行哈希得到Hm. 將N添加至檢索層的檢索索引I中, 將數(shù)據(jù)密文Cm與編號(hào)N上傳至服務(wù)器進(jìn)行存儲(chǔ), 將PEKS(pk,W)、N與Hm上傳至智能合約等待查詢. (3) 搜索口令生成階段 Trapdoor(sk,W′)→TW′. 該算法由檢索層進(jìn)行計(jì)算, 把私鑰sk 與用戶想要檢索的關(guān)鍵字W′作為輸入, 輸出搜索口令如下 用戶將搜索口令上傳至檢索層,并用自身賬戶$Buser向智能合約的賬戶$deposit 存款$Buser→$deposit. (4) 交易發(fā)布階段 sendRawTransaction($Buser,I)→txHash. 該算法由智能合約進(jìn)行計(jì)算, $Buser為用戶的賬戶,I為檢索索引, 包含了所有搜索密文PEKS(pk,W) 對應(yīng)的編號(hào), 作為此交易的參數(shù)傳入. 首先檢查$Buser是否合法. 然后智能合約估算此次交易需要的費(fèi)用$cost←$offer +Glimit×$gasprice, 并檢查押金賬戶$deposit 中用戶預(yù)存的押金是否滿足依次此次交易所需費(fèi)用$cost, 若滿足則繼續(xù)發(fā)布交易, 過程如下. 首先使用$Buser對應(yīng)的公鑰與secp256k1 橢圓曲線對傳入的參數(shù)I簽名. 然后使用RLP(Recursive Length Prefix), 遞歸長度前綴編碼對簽名數(shù)據(jù)進(jìn)行編碼. 將此交易的指針指向其前一個(gè)區(qū)塊, 驗(yàn)證該交易并將其廣播到P2P 網(wǎng)絡(luò)中. 最后的產(chǎn)生txHash 為交易ID. 若交易發(fā)布成功, 則將I中對應(yīng)的搜索密文PEKS(pk,W) 集合上傳至檢索層. 若用戶預(yù)存的押金$deposit 不滿足此次交易所需費(fèi)用$cost, 則終止交易, 并將$deposit 中預(yù)存的押金返回給用戶的賬戶$Buser. (5) 檢索階段 Search(TW′,I)→N. 該算法由檢索層進(jìn)行計(jì)算,I為檢索索引,TW′為搜索口令. 首先對于I, 向智能合約請求對應(yīng)的搜索密文PEKS(pk,W) 集合. 對于每個(gè)PEKS(pk,W), 執(zhí)行Test(pk,CW,TW′), 其中CW= [A,B] = PEKS(pk,W). 判斷H2(e(TW′,A))=B是否成立, 若成立輸出1, 否則輸出0. 若Test(pk,CW,TW′) 輸出為1, 則表明檢索成功, 將對應(yīng)的N下發(fā)給智能合約. 若不存在能使Test(pk,CW,TW′) 為1 的PEKS(pk,W), 則表明數(shù)據(jù)擁有者存儲(chǔ)的密文未包含用戶想要檢索的文檔. 此時(shí)將N置為?1, 并下發(fā)給智能合約. (6) 驗(yàn)證階段 Verify(Cm,N)→0|1. 該算法由智能合約進(jìn)行計(jì)算. 當(dāng)智能合約接收到來自檢索層的編號(hào)N時(shí), 智能合約首先判斷N是否為?1, 若為?1, 則直接輸出0. 若N不為?1, 智能合約將N告訴服務(wù)器, 服務(wù)器中存儲(chǔ)了N與密文Cm的對應(yīng)關(guān)系, 此時(shí)服務(wù)器可以直接返回對應(yīng)的Cm. 此時(shí)智能合約需要驗(yàn)證服務(wù)器是否返回了錯(cuò)誤的密文或者數(shù)據(jù)是否被惡意破壞和篡改. 首先智能合約通過N得到存在本層的對應(yīng)的Hm, 然后將Cm與N進(jìn)行哈希運(yùn)算得到Hm′, 若Hm′=Hm, 表明驗(yàn)證成功, 輸出1, 否則輸出0. (7) 賬戶更新階段 該流程由智能合約執(zhí)行. 若Verify(Cm,N) 為1, 則計(jì)算$cost←$offer+G×$gasprice, 將$cost轉(zhuǎn)入至數(shù)據(jù)擁有者的賬戶$Bowner中, 此時(shí)$deposit←$deposit?$cost, 將$deposit 退回到用戶的賬戶$Buser中. 并將數(shù)據(jù)密文Cm傳入檢索層, 由檢索層解密后將明文m傳入客戶端. 若Verify(Cm,N) 為0, 則直接將$deposit 退回到用戶的賬戶$Buser中. 定理1如果底層的基于雙線性對的加密機(jī)制在PPT 時(shí)間內(nèi)不能被攻破, 那么基于區(qū)塊鏈的公鑰可搜索加密系統(tǒng)在隨機(jī)預(yù)言機(jī)模型下具有關(guān)鍵字隱私性. 證明:在CKA 中, 現(xiàn)假設(shè)存在一個(gè)PPT 的敵手A, 它能以優(yōu)勢?成功地攻破系統(tǒng). 再構(gòu)造一個(gè)模擬器B, 將系統(tǒng)的公鑰pk 告訴B. 初始化階段:B運(yùn)行KeyGen() 獲得公鑰pk 與私鑰sk, 將公鑰pk 發(fā)送給敵手A. ?H-詢問階段:B得到一個(gè)初始為空的哈希列表L(wi,hi). 每當(dāng)收到一個(gè)對應(yīng)于wi的 ?H-詢問并通過訪問簽名預(yù)言機(jī)獲得一個(gè)δ(wi), 如果δ(wi) 已經(jīng)在列表L中,B就返回對應(yīng)的hi來作為敵手A的預(yù)處理關(guān)鍵字, 否則B將hi設(shè)置成如下形式. 然后B將(δ(wi),hi) 添加到L中, 并將ai返回給A. 詢問階段1:A發(fā)起一系列的詢問. 如果A詢問的是一個(gè)關(guān)鍵字wi對應(yīng)的關(guān)鍵字密文或者陷門,B通過訪問簽名預(yù)言機(jī)獲得一個(gè)預(yù)處理的關(guān)鍵字hi, 然后B通過使用密鑰對(pk,sk) 得到關(guān)鍵字密文Cwi或者陷門Twi, 并將其發(fā)送給A. 挑戰(zhàn)階段: 一旦接收到來自A的挑戰(zhàn)關(guān)鍵字w0和w1,B隨機(jī)選取一個(gè)b ∈{0,1}, 并生成wb的關(guān)鍵字密文Cwb, 并將其返回給A. 詢問階段2:A繼續(xù)向B詢問關(guān)鍵字的密文或者陷門,B的響應(yīng)行為類似于詢問階段1. 限制條件是A不能詢問有關(guān)w0或w1的信息. 猜測階段:A輸出一個(gè)猜測值b′∈{0,1}. 定理2如果區(qū)塊鏈不能在PPT 時(shí)間內(nèi)攻破, 那么基于區(qū)塊鏈的公鑰可搜索加密系統(tǒng)是具有公平性的. 證明:我們考慮了在系統(tǒng)中存在不誠實(shí)用戶的情形. 對于在現(xiàn)實(shí)世界中的每一個(gè)不誠實(shí)的用戶 ?U,在理想世界中都存在著一個(gè)不誠實(shí)的用戶U, 它們兩個(gè)的輸出在計(jì)算上是不可區(qū)分的. 我們假定?U被給定了一個(gè)合法的區(qū)塊鏈賬戶, 但是它只想要通過不誠實(shí)的手段獲得免費(fèi)的服務(wù).U在理想世界中執(zhí)行如下所示的算法1. 算法1 理想世界中交易的詳細(xì)流程理想世界中, 服務(wù)提供方S 與用戶U 和信任的第三方L 之間的交互流程.sendRawTransaction()? U 發(fā)起一個(gè)交易T, 交易金額是d, 由可信任第三方L 執(zhí)行v(iu).? L 檢查T, 如果其是一個(gè)有效的交易, 受信任的第三方L 將T 執(zhí)行, 如果T 是個(gè)無效的交易, 那么L 將會(huì)終止T,并且輸出False.Search()? 系統(tǒng)執(zhí)行來自L 的交易T.? 服務(wù)執(zhí)行完畢, 創(chuàng)建交易T′ 并將其回執(zhí)給L.Verify()? L 使用驗(yàn)證函數(shù)v(iu), 如果通過, L 接受交易T′, 否則L 拒絕交易T′.? 如果L 接受了交易T′, U 則從L 接收交易T′, U 獲得相應(yīng)的服務(wù), 并且輸出“True”.? 如果L 拒接了交易T′, U 將獲得其被退回的費(fèi)用, L 終止整個(gè)交易, 并輸出“False”. 我們通過構(gòu)造兩種混合的游戲可以得出模擬器和現(xiàn)實(shí)世界的輸出在計(jì)算上非常接近. 游戲H0由理想世界模擬器執(zhí)行. 游戲H1為混合游戲, 其中沒有受信任的第三方, 而是讓U與區(qū)塊鏈系統(tǒng)進(jìn)行交互. 我們將證明H0和H1在計(jì)算上是不可區(qū)分的. 因?yàn)楣ぷ髯C明算法在區(qū)塊鏈系統(tǒng)中穩(wěn)定運(yùn)行, 區(qū)塊鏈系統(tǒng)在交易中被視為是誠實(shí)的, 并且在區(qū)塊鏈系統(tǒng)中運(yùn)行的所有交易都不能被篡改, 所以H0和H1是計(jì)算上不可區(qū)分的. 因此現(xiàn)實(shí)世界系統(tǒng)的輸出和理想世界中系統(tǒng)的輸出是計(jì)算上不可區(qū)分的, 并且不誠實(shí)的用戶?U不可能成功地偽造一個(gè)有效的交易. 因此, 系統(tǒng)的公平性得以保障. 定理3如果以太坊環(huán)境的安全性得到保障, 那么我們的方案是可靠的. 證明:假設(shè)以太坊環(huán)境是安全的, 那么交易發(fā)布之后, 交易相關(guān)信息會(huì)被記錄在區(qū)塊鏈中, 通過共識(shí)機(jī)制所有區(qū)塊鏈節(jié)點(diǎn)都能與相同的區(qū)塊鏈進(jìn)行交互, 而惡意參與者無法控制以太坊區(qū)塊鏈上超過51% 的節(jié)點(diǎn), 所以交易一旦發(fā)布就不能被篡改. 如果智能合約能夠在以太坊環(huán)境中得到正確執(zhí)行, 那么檢索結(jié)果將會(huì)以區(qū)塊的形式存儲(chǔ)在區(qū)塊鏈中. 區(qū)塊鏈上的區(qū)塊是公開的且是不可篡改的, 所有以太坊節(jié)點(diǎn)都可以驗(yàn)證該數(shù)據(jù). 以太坊各個(gè)節(jié)點(diǎn)的一致性保證了在檢索過程中每個(gè)步驟執(zhí)行的正確性和可靠性. 可靠性的另一方面由公平性支撐, 通過智能合約我們能保障交易各方能夠得到應(yīng)得的激勵(lì), 交易各方都承認(rèn)檢索結(jié)果的公平性, 那么本方案的可靠性也得到了保障. 由于可靠性主要由以太坊環(huán)境和智能合約來實(shí)現(xiàn), 其證明無法采用定理1 和定理2 的規(guī)約范式. 受文獻(xiàn)[31] 的啟發(fā), 本文也采用了類似于文獻(xiàn)[31] 的方式來分析基于區(qū)塊鏈PEKS 系統(tǒng)的可靠性. 根據(jù)5.1 節(jié)系統(tǒng)設(shè)計(jì)的4 層架構(gòu), 我們使用了5000 多行代碼來實(shí)現(xiàn)系統(tǒng)的原型. 本方案原型基于以太坊平臺(tái)搭建, 使用的操作系統(tǒng)為Ubuntu 18.04. 客戶端使用了Django 框架與html5、Javascript 技術(shù)來保證其與后端的交互, 檢索層采用Python 3.0 編寫以實(shí)現(xiàn)加解密與搜索口令的生成, 主要使用pypbc庫、hashlib 庫和rsa 庫來實(shí)現(xiàn)PEKS 方案, 智能合約使用了Solidity 語言編寫, 為了實(shí)驗(yàn)結(jié)果的準(zhǔn)確并減少其它因素的干擾, 智能合約部署在以太坊私鏈中. 對于PEKS 算法實(shí)現(xiàn), 本方案采取一個(gè)固定的參數(shù), 使雙線性映射固定下來, 便于后續(xù)操作能夠在同一參數(shù)的基礎(chǔ)上運(yùn)行. 表3 為使用到的密碼學(xué)參數(shù)說明. 在密鑰生成函數(shù)KeyGen() 中, 輸入安全參數(shù)qbits 和rbits. 本方案選取的值為qbits = 512, rbits = 160, 這樣就將群G1和G2以及返回的params固定下來. 在實(shí)例化雙線性對對象時(shí), 直接利用pypbc 庫中的Pairing() 函數(shù), 將params 參數(shù)輸入, 生成雙線性對對象pairing. 同時(shí), 對于群G1生成元的選取, 也直接調(diào)用pypbc 庫中的Element.random() 函數(shù), 輸入之前生成的雙線性對對象pairing 以及群G2, 隨機(jī)生成. 本方案的哈希函數(shù)H1和H2直接引用hashlib 的庫hashlib.sha256 生成. 表3 PEKS 使用到的密碼學(xué)參數(shù)說明Table 3 Cryptography parameter description for PEKS 對于RSA 的實(shí)現(xiàn), 本方案使用到了Python 中的rsa 庫. 對明文進(jìn)行加密, 對密文進(jìn)行解密. 對于密鑰對的生成, 調(diào)用函數(shù)rsa.newkeys(512) 隨機(jī)生成, 其中參數(shù)選擇512, 表示用來加密的數(shù)據(jù)長度為512 bits. 生成之后將文件以pem 格式保存下來. 對明文用RSA 加密函數(shù)之前先將明文進(jìn)行utf-8 編碼. 對應(yīng)的, 解密之后用utf-8 解碼. 對于智能合約的實(shí)現(xiàn), 本方案的主要環(huán)境為以太坊. 本方案中的智能合約主要用來驗(yàn)證檢索結(jié)果與費(fèi)用分發(fā). 對于搜索密文與編號(hào)的存儲(chǔ), 智能合約主要采用了映射(mapping) 的數(shù)據(jù)結(jié)構(gòu), 把編號(hào)存為映射的鍵(key), 搜索密文存為映射的值(value). 同樣地, 智能合約通過mapping 將數(shù)據(jù)密文的哈希進(jìn)行存儲(chǔ), mapping 的key 位編號(hào), value 為對應(yīng)的數(shù)據(jù)密文哈希值. 當(dāng)智能合約收到來自服務(wù)器返回的數(shù)據(jù)密文時(shí), 智能合約首先在自己存儲(chǔ)的mapping 中找到對應(yīng)的哈希值, 再將數(shù)據(jù)密文計(jì)算得出一個(gè)新的哈希,對比兩個(gè)哈希即可驗(yàn)證服務(wù)器返回的結(jié)果是否正確. 通過調(diào)用各個(gè)參與方的轉(zhuǎn)賬函數(shù)即可實(shí)現(xiàn)費(fèi)用的發(fā)放與收取. 本節(jié)分別在私鏈和公鏈環(huán)境中對系統(tǒng)的性能作出測試, 將從實(shí)驗(yàn)部署、仿真過程和數(shù)據(jù)結(jié)果三個(gè)方面分別進(jìn)行介紹. 6.2.1 實(shí)驗(yàn)部署 本小節(jié)主要介紹私鏈以及公鏈上智能合約的部署. (1) 私鏈上的部署 首先, 在以太坊環(huán)境中搭建了一條私鏈作為智能合約的運(yùn)行環(huán)境, 此條私鏈的chainId 為528, 創(chuàng)世區(qū)塊的timestamp 為0x5ddf8f3e, difficulty 為0x002, 私鏈的端口為3333, rpc 端口為4444. 接著我們在此私鏈中部署了我們的智能合約, 部署后得到智能合約的地址為0xc4ca68caa8ecc4a46b475161e3161eb228b 0e01a. 關(guān)鍵參數(shù)如表4 所示. 表4 智能合約部署關(guān)鍵參數(shù)表Table 4 Smart contract deployment key parameter table (2) 公鏈上的部署 實(shí)驗(yàn)選擇了以太坊官方提供的公有測試鏈Ropsten 來進(jìn)行智能合約的部署. 我們使用infura 作為代理節(jié)點(diǎn), 使用remix 加metamask 進(jìn)行了部署. 部署好后, 用戶地址和合約地址如下所示. ? 0x87E08e9E27D6c1645b773A37Ac4BD09773B3dd94 ? 0x03fc28689d09d461d3b60dd75463ad457d5a67b5 6.2.2 仿真過程 實(shí)驗(yàn)在具有4 個(gè)Intel i7-7500 內(nèi)核的PC 上執(zhí)行, 操作系統(tǒng)為Ubuntu 18.04, 內(nèi)存為5.8 G. 在私鏈上的實(shí)驗(yàn)過程中, 啟動(dòng)服務(wù)器, 保持合約啟動(dòng)狀態(tài)并持續(xù)地進(jìn)行挖礦; 在公鏈上只需要啟動(dòng)服務(wù)器, 保持infura 賬號(hào)登錄狀態(tài). 然后分別使用Apache Bench 進(jìn)行壓力測試. 主要測試點(diǎn)為本方案中存儲(chǔ)明文與密文檢索兩個(gè)關(guān)鍵功能模塊的功能完整性、可用性及性能. 在對每個(gè)功能模塊的測試實(shí)驗(yàn)中, 將請求總數(shù)固定為600, 并固定傳輸數(shù)據(jù)長度, 改變系統(tǒng)面對的并發(fā)請求數(shù)量, 對用戶平均等待時(shí)間、服務(wù)器平均請求處理時(shí)間等指標(biāo)進(jìn)行統(tǒng)計(jì)與分析, 從而驗(yàn)證本文方案的可行性. 實(shí)驗(yàn)中涉及的參數(shù)如表5 所示. 表5 實(shí)驗(yàn)相關(guān)參數(shù)Table 5 Experiment related parameters 公私鏈上實(shí)驗(yàn)參數(shù)設(shè)置完全相同, 對應(yīng)情況下的每次實(shí)驗(yàn)都分為兩大組進(jìn)行, 每組根據(jù)VU 的不同又分為15 組參數(shù), 每組參數(shù)重復(fù)測試3 次取平均值, 總共進(jìn)行了90 次測試. 在對消息發(fā)送模塊進(jìn)行測試時(shí),保持請求總數(shù)為600, 消息長度為4640 bytes, 改變VU 數(shù)量使其在10 到600 的范圍內(nèi)遞增, 記錄每組數(shù)據(jù)下用戶平均等待時(shí)間、服務(wù)器平均請求處理時(shí)間、TPS 以及DTR 的值. 同樣地, 在對密文檢索模塊進(jìn)行測試時(shí), 保持請求總數(shù)為600, 消息長度為3247 bytes, 改變改變VU 數(shù)量使其在10 到600 的范圍內(nèi)遞增, 并記錄上述性能參數(shù)數(shù)值. 6.2.3 實(shí)驗(yàn)結(jié)果分析 (1) 私鏈實(shí)驗(yàn)結(jié)果分析 圖5 和圖6 顯示了在其他條件不變的情況下, VU 數(shù)量從10 增加到600 時(shí), 消息發(fā)送模塊用戶平均請求等待時(shí)間、服務(wù)器平均請求處理時(shí)間以及RPS 和DTR 的變化情況. 經(jīng)測試, 整個(gè)實(shí)驗(yàn)過程模擬用戶失敗的請求個(gè)數(shù)都是0, 也就是說, 正常情況下, 服務(wù)器對用戶請求的響應(yīng)能力維持著較高的水平. 各個(gè)功能也能完整而穩(wěn)定地運(yùn)行. 圖5、圖6 可以直觀地展示出用戶等待時(shí)間與系統(tǒng)響應(yīng)時(shí)間同時(shí)與DTR 有關(guān). DTR 越高, TPS 越大, 用戶的請求等待時(shí)間越短. 另一方面, 當(dāng)VU 在10 到600 范圍內(nèi)變化時(shí), 信息發(fā)送模塊用戶請求等待時(shí)間和服務(wù)器請求處理時(shí)間也隨VU 線性地增加, 相應(yīng)的TPS 逐漸下降. 可以推測, 在并發(fā)數(shù)600 之內(nèi), 系統(tǒng)可以正常且完整地完成信息發(fā)送, 但是并發(fā)數(shù)增大時(shí), 系統(tǒng)的響應(yīng)時(shí)間會(huì)有一定延長. 圖5 私鏈信息發(fā)送模塊用戶等待和服務(wù)器處理時(shí)間Figure 5 Variation of user’s waiting time and server’s processing time with VU in information sending module on private chain 圖6 私鏈信息發(fā)送模塊TPS 和DTRFigure 6 Variation of TPS and DTR with VU in information sending module on private chain 圖7 和圖8 是當(dāng)其他條件不變、VU 在10 到600 范圍內(nèi)變化的情況下, 密文檢索模塊各性能參數(shù)的變化情況. 圖7 私鏈密文檢索模塊用戶等待和服務(wù)器處理時(shí)間Figure 7 Variation of user’s waiting time and server’s processing time with VU in ciphertext retrieval module on private chain 圖8 私鏈密文檢索模塊TPS 和DTRFigure 8 Variation of TPS and DTR with VU in ciphertext retrieval module on private chain 密文檢索模塊各參數(shù)隨VU 的變化與信息發(fā)送模塊的變化趨勢大同小異, 從圖7 和圖8 中可以看到,用戶的請求等待時(shí)間依然與DTR 呈負(fù)相關(guān), 而TPS 與DTR 呈正相關(guān). 當(dāng)其他條件不變、VU 在10 到600 之內(nèi)增加時(shí), 用戶平均等待時(shí)間和服務(wù)器請求處理時(shí)間都隨之延長, 而DTR 隨之下降, TPS 也降低.需要說明的是, 服務(wù)器響應(yīng)時(shí)間與用戶等待時(shí)間在很大程度上依賴于網(wǎng)絡(luò)上的數(shù)據(jù)傳輸速率, 因此在不同時(shí)刻、不同網(wǎng)段中使用同一套參數(shù)重復(fù)驗(yàn)證時(shí), 盡管數(shù)據(jù)由于網(wǎng)速的變化而大不相同, 但是各參數(shù)之間的依賴關(guān)系和變化趨勢依然不會(huì)改變. (3) 公鏈實(shí)驗(yàn)結(jié)果分析 在公鏈上, 控制其他條件不變并讓VU 從10 到600 變化, 分別對發(fā)送模塊和檢索模塊進(jìn)行測試. 可以得到用戶平均請求等待時(shí)間、服務(wù)器平均請求處理時(shí)間以及RPS 和DTR 的變化情況. 其中, 圖9 和圖10 表示的是發(fā)送模塊的數(shù)據(jù)折線圖, 圖11 和圖12 記錄的則是檢索模塊的數(shù)據(jù)折線圖. 圖9 公鏈信息發(fā)送模塊用戶等待和服務(wù)器處理時(shí)間Figure 9 Variation of user’s waiting time and server’s processing time with VU in information sending module on public chain 圖10 公鏈信息發(fā)送模塊TPS 和DTRFigure 10 Variation of TPS and DTR with VU in information sending module on public chain 圖11 公鏈密文檢索模塊用戶等待和服務(wù)器處理時(shí)間Figure 11 Variation of user’s waiting time and server’s processing time with VU in ciphertext retrieval module on public chain 圖12 公鏈密文檢索模塊TPS 和DTRFigure 12 Variation of TPS and DTR with VU in ciphertext retrieval module on public chain 從圖中可以看到, 各指標(biāo)隨并發(fā)數(shù)的變化趨勢并沒有受公私鏈改變的影響, 用戶等待時(shí)間與服務(wù)器響應(yīng)時(shí)間也維持在相同的量級(jí). 由此可以看出, 本文方案在公鏈上推行有一定的可行性. 在網(wǎng)絡(luò)狀況良好的情況下, 系統(tǒng)能夠穩(wěn)定地完成數(shù)據(jù)的傳輸、加密和檢索, 但是隨著并發(fā)數(shù)增大, 系統(tǒng)依然面臨性能上的挑戰(zhàn), 不過這依然無法掩蓋基于區(qū)塊鏈的密文檢索方案在大數(shù)據(jù)時(shí)代諸多領(lǐng)域的廣闊應(yīng)用前景和無限的可能性. 通過以上的測試可以得出, 系統(tǒng)在網(wǎng)絡(luò)狀況良好的情況下能夠穩(wěn)定地完成數(shù)據(jù)的傳輸、加密和檢索.并且系統(tǒng)使用區(qū)塊鏈來管理第三方服務(wù)器, 具有公平性和可靠性, 同時(shí)本身的PEKS 方案具有關(guān)鍵字隱私性, 在網(wǎng)絡(luò)安全形勢愈發(fā)嚴(yán)峻的今天是非常值得推廣的. 但是, 由于區(qū)塊鏈?zhǔn)撬泄?jié)點(diǎn)可驗(yàn)證并且需要礦工挖礦來上傳數(shù)據(jù)的, 所以系統(tǒng)的存儲(chǔ)成本似乎看起來比較昂貴, 但是該系統(tǒng)仍然可以應(yīng)用到許多的真實(shí)場景中. 例如, 個(gè)人的醫(yī)療檔案是非常重要的, 現(xiàn)實(shí)生活中醫(yī)生只有獲取到了病人的真實(shí)健康狀況才能夠做出正確的判斷; 個(gè)人學(xué)歷檔案或者是犯罪檔案也是不可被隨意篡改的, 并且需要很高的隱私性. 在這些場景中, 由于對數(shù)據(jù)的安全可靠要求異??量? 所以為了檢索高可靠的密文, 高花費(fèi)是值得的. 如圖13 所展示的, 基于區(qū)塊鏈的公鑰可搜索加密系統(tǒng)在個(gè)人學(xué)歷檔案場景中的應(yīng)用. 圖13 系統(tǒng)在個(gè)人學(xué)歷檔案場景中的應(yīng)用Figure 13 Application in personal education record system 系統(tǒng)中存儲(chǔ)公民的個(gè)人學(xué)歷, 個(gè)人學(xué)歷信息只有具有權(quán)限的校方才能夠修改, 并且修改頻率有一定的限制, 例如高中學(xué)歷校方每三年才能修改一次, 大學(xué)學(xué)歷校方每四年修改一次. 而在這種場景中每個(gè)人無法修改自己的學(xué)歷, 他們只能查看自己的學(xué)歷, 或者截圖以向外證明自己的學(xué)歷. 所以在個(gè)人學(xué)歷檔案場景中, 政府為每個(gè)公民憑借身份證號(hào)創(chuàng)建一個(gè)唯一的檔案賬戶, 檔案賬戶的私鑰分發(fā)給權(quán)威的校方機(jī)構(gòu),校方憑借私鑰可以修改公民的學(xué)歷檔案, 由于區(qū)塊鏈的不可篡改性, 除了有私鑰的校方可以修改檔案, 檔案不會(huì)被任何其他方篡改; 檔案賬戶的公鑰分發(fā)給公民本人, 公民使用此公鑰可以查看自己的學(xué)歷檔案,但不能作任何的修改. 為了解決目前PEKS 方案針對惡意服務(wù)器的搜索可靠性問題, 本文在PEKS 方案的基礎(chǔ)上, 結(jié)合區(qū)塊鏈技術(shù), 提出了一個(gè)基于區(qū)塊鏈的公鑰加密可搜索系統(tǒng). 具體而言, 采用分層的思想, 利用智能合約構(gòu)造了一個(gè)四層級(jí)化的基于區(qū)塊鏈公鑰可搜索加密方案, 并對其進(jìn)行了安全性分析, 證明了所提出的方案可以有效抵抗惡意服務(wù)器帶來的不良影響, 從而保障系統(tǒng)的關(guān)鍵字隱私性、公平性和可靠性. 基于上述方案,本文實(shí)現(xiàn)了基于區(qū)塊鏈公鑰加密可搜索的原型系統(tǒng), 并對原型系統(tǒng)進(jìn)行了性能測試與分析, 證明了本文構(gòu)造的可行性與實(shí)用性.5 基于區(qū)塊鏈的公鑰可搜索加密系統(tǒng)設(shè)計(jì)
5.1 系統(tǒng)概述
5.2 方案構(gòu)造
5.3 安全性分析
6 原型系統(tǒng)實(shí)現(xiàn)與性能評(píng)估
6.1 原型系統(tǒng)實(shí)現(xiàn)細(xì)節(jié)
6.2 性能測試與分析
6.3 實(shí)際應(yīng)用場景
7 結(jié)束語