牛淑芬,韓 松,于 斐,王彩芬,杜小妮
(1.西北師范大學 計算機科學與工程學院,蘭州 730070;2.深圳技術大學 大數據與互聯網學院,廣東 深圳 518118;3.西北師范大學 數學與統計學院,蘭州 730070)
病歷是醫務人員對病人患病經過和治療情況所作的文字記錄,是醫生診斷和治療疾病的依據。隨著醫院現代化建設的發展和計算機信息技術的普及,電子病歷(Electronic Medical Record,EMR)逐步取代紙質病歷,在病人信息的收集、儲存、分析、傳遞和利用中得到廣泛應用,解決了紙質病歷易丟失、易損壞等問題。對于疾病的研究[1],醫生或醫療機構需對大量相同或類似的EMR 進行系統分析對比以找出準確的病因和更好的醫療辦法[2-4]。隨著大量EMR 的生成,不僅占用醫院本地服務器資源,而且難以進行數據共享和計算[5-7],因此越來越多的醫院選擇存儲空間大、計算效率高和響應速度快的云服務器進行存儲[8-10]。但是,如果云服務器受到攻擊或缺乏監控,數據可能會被竊取、泄露或篡改,而且云服務器可能存在未經授權訪問等安全問題,所以云服務器不能被用戶完全信任,而去中心化分布式存儲的區塊鏈技術[11-13]為EMR 提供了安全不可修改的記錄,然而很多EMR 文件數據由于具有高度保密性和敏感性,因此不能直接存儲在區塊鏈中,以太坊[14]是一個具備圖靈完備性的開源區塊鏈平臺,為實現EMR 在區塊鏈上的存儲提供了技術支持[15]。
在文件上傳存儲前必須將數據文件進行加密,以保證數據的安全性和隱私性,但在搜索大量數據時,數據使用者需要將全部數據文件下載并解密,然后進行數據搜索,因此該方法的搜索效率極低。文獻[16]提出在密文上實現關鍵字搜索的可搜索加密(Searchable Encryption,SE)方案,該方案的搜索效率較高并保證了服務器執行搜索操作時的隱私性和保密性,但在存放加密數據時對不同文檔通常使用不同的密鑰,用戶持有的密鑰會隨文檔數量的增多而增加,因此用戶必須生成大量的陷門進行搜索,導致工作效率低下。文獻[17]提出一種可搜索的聚合密鑰加密方案,解決了用戶持有大量不同密鑰時的復雜困難搜索問題,但在用戶得到數據后一般需要在相關文檔集上進行驗證,當用戶完成對大量文檔集的搜索后也會擁有大量的可驗證令牌,因此文獻[18]提出一種可驗證的可搜索聚合密鑰加密方案,該方案實現了對通過密鑰聚合得到數據的簡單快速驗證。本文提出一種面向區塊鏈電子病歷的基于密鑰聚合的密文檢索方案。該方案利用密鑰聚合技術,當數據用戶請求多個文件數據時,僅需生成一個聚合陷門即可進行數據檢索,同時通過智能合約技術確保用戶進行數據驗證,從而得到正確完整的文件。
定義1令G1和G2為兩個階為素數p的乘法循環群,定義一個雙線性映射e:G1×G1→G2滿足如下性質:
1)雙線性:對任意的u,v∈G1,存在a,b∈?*p,使得e(ua,vb)=e(u,v)ab。
2)非退化性:存在u,v∈G1,使得e(u,v)≠1。
3)可計算性:對任意的u,v∈G1,存在有效算法計算e(u,v)。
定義2基于l階的雙線性Diffie-Hellman 指數假設(l-BDHE)問題給定包含(2l+1)個元素的向量作為輸入,輸出為。在本文中為便于描述,使用gi表示。
定義3設G是一個階為p的循環群,隨機選取公共參數g1,g2,…,gd∈G,則向量v=(v1,v2,…,vd)∈?p的哈希函數為:

向量哈希函數滿足以下性質:
1)同態性:對任意2 個向量m1、m2和2 個實數l1、l2,滿足。
2)免碰撞性:不存在一個多項式時間的攻擊者偽造一個向量m3,同時滿足m3≠l1m1+l2m2且。
定理1同態向量哈希函數在離散對數問題是困難問題假設下是安全的[19]。
為防止數據在上傳過程中的信息泄露,通常采用加密云存儲[20],具體方法為:在數據上傳至云端前數據擁有者將所有文件加密,加密數據只能被解密密鑰擁有者進行搜索和解密。假如文件擁有者希望通過云服務器安全共享敏感文件,同時擁有者希望向部分用戶授權,使得用戶可以在擁有者提供的子集中搜索文件。針對該關鍵字搜索問題,文獻[21-22]提出可搜索加密技術,保證了服務器執行搜索時的隱私性和保密性。
如圖1 所示,在傳統密文檢索方案中,Alice 對其不同的文檔集使用不同的密鑰加密并上傳至云服務器,當Bob 想獲取部分文檔S(|S|=m)的搜索時,Alice 需要將密鑰通過安全信道發送給Bob進行授權。為搜索S中的目標文檔,Bob 需要生成包含關鍵字w的大量陷門并提交給云服務器獲得文件進行結果驗證。當m足夠大時,對于Bob 而言,密鑰的分配和存儲以及陷門的生成會變得非常困難,這違背了使用云服務器存儲和計算的初衷。本文使用改進的聚合密鑰檢索方案,將大量計算和存儲轉移至云服務器且不會造成信息泄露。如圖2 所示,在聚合密鑰的密文檢索方案中,Alice 和Bob 只需發送一個聚合密鑰kagg和一個聚合陷門Tr,利用密鑰聚合技術將大量文件進行聚合并發送給用戶,用戶通過生成聚合陷門得到請求數據從而提高搜索效率。

圖1 傳統密文檢索方案Fig.1 Traditional ciphertext retrieval scheme

圖2 密鑰聚合的密文檢索方案Fig.2 Ciphertext retrieval scheme of key aggregation
智能合約由密碼學家尼克·薩博于1995 年提出[23],是一套以數字形式定義的承諾,承諾控制著數字資產并包含了合約參與者約定的權利和義務。智能合約的工作理論遲遲沒有實現,一個重要原因是因為缺乏能夠支持可編程合約的數字系統和技術,區塊鏈技術的出現解決了該問題。區塊鏈系統中的每個節點用戶可以通過發布一筆交易創建智能合約[24],并利用編程方式將智能合約設置為自己的所有權轉移規則、交易方式和狀態轉換函數。本文利用以太坊區塊鏈中的智能合約技術,并使用Solidity語言編寫智能合約,第三方數據用戶將結果提供給完成部署的智能合約以驗證醫療云服務器返回的檢索結果是否正確和完整,函數將正確的檢索結果返回給用戶,通過智能合約技術確保用戶獲得的文件數據未被云服務器惡意篡改或丟失信息。
算法形式化定義如下:
1)系統建立SetUp(1λ)→params:輸入安全參數λ和公開的雙線性映射B=(p,G1,G2,e(·,·)),醫療云服務器運行該算法輸出系統參數params=(B,Ppub,H)。
2)密鑰生成KeyGen(γ)→(pk,msk):輸入隨機數γ∈?*p,醫生執行該算法輸出密鑰對、公鑰pk 和主密鑰msk。
3)數據加密Encrypt(Dm,w,I,H)→(Cm,Cw,Δi,A,hi):輸入電子病歷文件Dm、關鍵字w和文件索引Im,醫生執行該算法輸出加密文件Cm、關鍵字密文Cw和輔助值Δi并上傳至云服務器,同時輸出文件地址Ai。醫生對每一個Cmi∈Cm計算hi=H(Cmi),并將每一個Cmi∈Cm對應的文件地址Ai與hi共同構建為新交易,同時將交易廣播至聯盟鏈。
4)聚合密鑰提取Extract(msk,S)→kagg:輸入主密鑰msk 和集合S,通過醫院授權后醫生執行該算法輸出聚合密鑰kagg。
5)陷門生成Trapdoor(kagg,wi)→Tr:輸入聚合密鑰kagg和待搜索關鍵字wi,數據用戶執行該算法輸出聚合陷門Tr。
6)搜索驗證Test(Tr,Δi,S)→(Ai,Cmi):輸入陷門Tr、輔助值Δi和集合S,醫療云服務器執行該算法進行搜索,當驗證結果為正確時則輸出密文文件Cmi和對應的文件地址Ai,否則檢索失敗。
7)數據驗證Verify(A′i,h′i)→δ:輸入文件地址A′i和h′i,聯盟鏈通過智能合約執行該算法進行驗證,若輸出結果為δ則代表驗證結果為正確,否則返回錯誤結果。
本文電子病歷系統模型如圖3 所示,該系統主要包括患者、數據擁有者、數據用戶、醫療云服務器和聯盟鏈5 個實體:
1)患者:患者在醫院就醫時需要用個人身份證/醫??ㄟM行醫院注冊,當患者在醫院注冊后,醫生會根據對患者的診斷創建其個人的電子病歷,本文中當患者在醫院就醫并創建了電子病歷,即默認患者將個人的電子病歷授權給了醫院和醫生。
2)數據擁有者:數據擁有者指的是醫院和醫生。醫生在得到患者的授權后負責生成電子病歷,在電子病歷中提取并生成一系列關鍵字,將電子病歷和關鍵字進行加密并計算加密文件的哈希值,并將加密文件和加密的關鍵字共同上傳至醫療云服務器,然后將醫療云服務器返回的文件地址和密文的哈希值構建為新交易廣播至聯盟鏈。
3)數據用戶:數據用戶指的是醫療機構和政府等權威機構,且包括醫院和醫生在內的聯盟鏈中的成員。數據用戶向醫院進行數據請求,當醫院授權給醫生后,醫生生成相關文件的聚合密鑰,數據用戶將生成的聚合陷門發送給醫療云服務器得到數據文件,獲取數據后計算密文的哈希值并發送給聯盟鏈,同時通過智能合約驗證數據是否完整正確。
4)醫療云服務器:醫療云服務器主要負責存儲醫生上傳的加密文件和加密關鍵字,并將存儲的數據文件地址返回給數據擁有者。當數據用戶上傳聚合陷門時,醫療云服務器會進行搜索驗證,只有當結果為正確時才會將數據文件和文件地址一起返回給數據用戶,否則檢索失敗。
5)聯盟鏈:聯盟鏈節點負責將醫生上傳的對應密文哈希值和文件地址構建的新交易進行驗證并打包放入區塊中,當用戶發送密文哈希值和相應的文件地址時,聯盟鏈通過已部署好的智能合約驗證用戶得到的數據正確性和完整性,當數據正確時觸發智能合約返回正確驗證結果,否則返回錯誤驗證。

圖3 電子病歷系統模型Fig.3 System model of electronic medical record
2.3.1 功能性需求
本文方案需滿足以下3 個功能性需求:
1)緊湊性,確保聚合密鑰的大小獨立于分享的文件數量。對于一組密鑰{ki}(i∈S),將其密鑰聚合Extract(msk,S)→kagg,在設計方案時需要在后續步驟不失效的情況下將密鑰集聚合為單個密鑰。
2)可搜索性,使用戶提供的任何關鍵字在可搜索加密文檔上生成所需的陷門,即在減少密鑰數量的同時保留搜索功能。對于每一個包含關鍵字w的文檔集,要求其如果得到陷門Trapdoor(kagg,wi)→Tr,則應計算出Test(Tr,Δi,S)→(Ai,Cmi),并且通過驗證。
3)安全授權,通過聚合密鑰將關鍵字的搜索權委托給數據用戶。為確保任何擁有委托聚合密鑰的用戶都可以執行關鍵字搜索,要求陷門生成算法的輸入是不能公開的,即這些輸入不應該依賴任何用戶的私人信息。
2.3.2 安全性需求
任何可搜索的聚合密鑰加密方案應滿足以下兩個安全性需求:
1)聚合密鑰安全性,攻擊者無法搜索沒有數據擁有者授權的任意關鍵字,即攻擊者不能對已知聚合密鑰但無關的文檔進行關鍵字搜索,也不能根據已知密鑰為其他文檔集生成新的聚合加密密鑰。
2)陷門和關鍵字安全性,攻擊者無法從陷門中確定檢索中使用的關鍵字,只能通過觀察獲得關鍵字信息,即用戶可能會要求不受信任的云服務器搜索敏感詞,但不會將該敏感詞透露給云服務器。
基于密鑰聚合的密文檢索流程具體如下:
1)系統建立:醫療云服務器輸入安全參數λ和公開的雙線性映射B=(p,G1,G2,e(·,·)),定義一個雙線性映射e:G1×G1→G2和抗碰撞的哈希函數H:{0,1}*→G1,且循環群G1的階為p(2λ≤p≤2λ+1),隨機選取生成元g∈G1和,計算。假設n為醫療云服務器可存儲的最大電子病歷數,醫療云服務器輸出系統參數params=(B,Ppub,H),其中。
3)數據加密:醫生使用該算法加密數據,將每個患者的電子病歷加密為Cm=,并將電子病歷中出現的所有癥狀提取生成一系列關鍵字w={w1,w2,…,wn}。為生成關鍵字密文,該算法需輸入文件索引Im∈{ 1,2,…,n},醫生需要進行以下操作:
(2)對每一個關鍵字wi輸出所有關鍵字密文,并將Cm和Cw上傳至醫療云服務器,醫療云服務器向醫生返回每個文件在服務器中的存儲地址A={A1,A2,…,An}。

圖4 聯盟鏈區塊數據結構Fig.4 Consortium chain block data structure
4)聚合密鑰提?。横t生使用該算法生成一個可搜索聚合加密密鑰kagg。當數據用戶向醫生請求相關電子病歷時,醫生需要先向醫院進行申請,在醫院對醫生授權后,對于任何包含關鍵字索引的文檔子集S?{1,2,…,n},醫生需要輸入主密鑰msk 并輸出聚合密鑰,為將電子病歷中關鍵字搜索權委托給數據用戶,需要將聚合密鑰kagg和集合S同時發送給數據用戶。
5)陷門生成:數據用戶使用該算法生成可搜索的關鍵字陷門。當數據用戶得到聚合密鑰kagg后,對于聚合密鑰kagg所有相關的文檔,該算法將會對搜索關鍵字wi={w1,w2,…,wn}僅生成一個聚合陷門Tr且計算公式為。數據用戶在生成陷門后,將陷門Tr 以及集合S發送至醫療云服務器進行搜索驗證算法,只有通過搜索驗證,用戶才可以獲得數據。
6)搜索驗證:云服務器使用該算法執行關鍵字搜索。根據該算法輸入陷門Tr 與可搜索加密密鑰ki的輔助值Δi=(c1,c2,μ),云服務器進行計算驗證,當結果正確時向用戶返回加密的密文文件Cmi和相對應的文件地址Ai,若驗證結果錯誤則檢索失敗,其中,計算公式為,正確性驗證過程為:

7)數據驗證:將服務器部署的智能合約相關變量和函數接口采用Solidity 語言編寫,智能合約提供一個函數接口進行數據驗證并保證數據用戶得到的文件未被云服務器篡改。當數據用戶得到云服務器返回的數據文件C′mi和相應的文件地址A′i,數據用戶通過公共參數計算h′i=H(C′mi)并將A′i和H(C′mi)發送給聯盟鏈,聯盟鏈節點通過地址找到包含此交易的相應區塊,并使用智能合約算法進行驗證,數據驗證階段的智能合約算法具體流程如算法1 所示,當H(C′mi)=H(Cmi)和A′i=Ai時,返回正確驗證結果δ,否則返回錯誤結果。
算法1驗證階段的智能合約算法


為滿足本文方案的安全需求,假設醫療云服務器僅根據本文方案提供合法的服務,授權用戶可以嘗試訪問權限范圍內或權限范圍外的數據。此外,涉及醫療云服務器的通信通道被認為是不安全的?;谝陨峡紤],本節將在聚合密鑰以及陷門和關鍵字安全性方面進行具體分析。
本文要求任何擁有聚合密鑰的用戶都可以對集合S中的文檔進行關鍵字搜索,但不能對集合S之外的文檔進行關鍵字搜索。用戶也不能從已知的集合S中生成新的集合S′并生成其他的可搜索聚合加密密鑰。每個擁有聚合密鑰的數據用戶都可以成功地執行關鍵字檢索。數據用戶將得到的聚合密鑰生成一個聚合陷門Tr,然后執行搜索驗證算法進行關鍵字檢索,通過下式可以驗證檢索算法的正確性:

由此可知,擁有聚合密鑰的數據用戶可以成功地執行關鍵字檢索。攻擊者無法對任何不在聚合密鑰范圍內的文檔執行關鍵字檢索,即使服務器與惡意授權用戶串通,也無法對任何不在聚合密鑰范圍內的文檔執行關鍵字檢索。攻擊者A可能為云服務器或惡意授權用戶,此類攻擊者可能試圖對不在其聚合密鑰范圍內的文檔執行關鍵字搜索。從中可以看出,如果PS是由錯誤的文檔集j∈S′生成,則e(kagg,gt)與e(PS,gt)在等式中無法消除,因此必須在聚合密鑰相同的文檔集合S上進行計算?;谏鲜銮闆r,攻擊者可能使用目標集合S′作為輸入,但會因為文檔索引Im?S,在搜索驗證算法中返回錯誤結果。
攻擊者無法通過已知的聚合密鑰為任何新文檔集合生成新的聚合密鑰。假設一個擁有文檔集合S′的聚合密鑰kagg的攻擊者A想要嘗試為一組新的集合S′生成新的聚合密鑰。A需要已知任意文檔j∈S′的值,即使A已知聚合密鑰的值,由于每個乘數的值由數據擁有者的主密鑰γ生成,因此A無法從獲得的kagg值中獲取其中每個加密的乘數,因此攻擊者A無法從已知的聚合密鑰中為任何新的文檔集合生成新的聚合密鑰。
假設攻擊者A可能會獲得相關信息來發起攻擊,例如當云服務器獲取到存儲的關鍵字密文、可搜索加密密鑰ki的輔助值Δi和提交的陷門Tr 等時,對于惡意的授權用戶假設擁有聚合密鑰以及可在文檔集合S中執行關鍵字搜索的權力,然而即使云服務器能獲取到這些信息,本文方案仍具備查詢隱私安全性。
4.2.1 陷門安全性
假設攻擊者A在獲得提交的陷門Tr=kagg·后,只有取得聚合密鑰kagg才能在搜索時獲得關鍵字,在此情況下由于攻擊者A已知系統參數以及文檔集合S,為計算kagg,攻擊者A需先計算每一個文檔j∈S的,其中γ為數據擁有者的主密鑰且為保密值,而A計算得到γ的概率可以忽略不計,因此攻擊者A無法發起攻擊,可見本文方案具備陷門安全性。
4.2.2 關鍵字安全性
假設云服務器和攻擊者A試圖在存儲的數據中學習且假設已知以及cw=,A可能嘗試發起以下攻擊:
1)從已知的c1和c2中檢索t的值,但在離散對數問題中A不能計算得到t的值。
將本文方案與文獻[17-18,23]方案在區塊鏈應用、安全搜索、密鑰聚合和可驗證性方面進行對比,如表1 所示,其中,“√”表示具備該功能特性,“×”表示不具備該功能特性,文獻[17-18,23]方案的應用環境均為云服務器,而本文方案是云服務器和區塊鏈的結合。可以看出,文獻[17,23]方案不具備可驗證功能,而本文方案通過應用區塊鏈智能合約技術可驗證醫療云服務器是否惡意修改信息或丟失數據,保證了用戶獲取文件的正確性和完整性,相比其他方案在區塊鏈應用、安全搜索、密鑰聚合和可驗證性方面更具優勢。

表1 4 種方案的功能特性對比Table 1 Comparison of functional characteristics of four schemes
表2 為本文方案與文獻[17-18]方案的運算時間對比結果,其中,Tp表示雙線性映射配對運算時間,Te表示指數運算時間,Tm表示乘法運算時間,Th表示哈希函數運算時間。已知常用的密碼操作時間排序為Tp>Te>Tm>Th且雙線性映射配對Tp的運算時間遠大于其他密碼操作的時間。結合數據加密階段和數據搜索階段的運算時間可以看出,本文方案的整體運算時間最少。

表2 3 種方案的運算時間對比Table 2 Comparison of computing time of three schemes
為更準確地評估密文檢索方案的實際性能,本文基于2.60 GHz CPU、8 GB 內存的聯想筆記本和Linux 虛擬機,并在真實數據集和由C 語言編寫的PBC 庫上進行模擬實驗。在實驗中,將最大文件值n設置為500,關鍵字個數設置為1、10、20、30、40 和50,實驗取50 次運行結果的平均值。為體現本文方案的性能優勢,將本文方案和文獻[17]方案數據加密和數據搜索階段的時間開銷進行對比,如圖5、圖6 所示。可以看出,因為本文方案利用多關鍵字加密算法,所以在數據加密階段的時間開銷隨著關鍵字的增加而增長,且在關鍵字個數大于10 時,本文方案的數據加密開銷低于文獻[17]方案。在數據搜索階段,本文方案和文獻[17]方案的時間開銷隨著關鍵字個數的增加成正相關變化,且時間開銷低于文獻[17]方案,可見本文方案的搜索效率更高,系統性能更優。

圖5 數據加密階段的時間開銷Fig.5 Time cost of data encryption phase

圖6 數據搜索階段的時間開銷Fig.6 Time cost of data search phase
本文提出一種面向區塊鏈電子病歷的基于密鑰聚合的密文檢索方案。該方案基于云服務器和聯盟鏈進行構建,將醫院醫生和醫療機構、政府等權威機構在內的聯盟成員分別定義為數據擁有者和數據用戶,使數據加密上傳至醫療云服務器,并將數據密文哈希值打包至聯盟鏈,同時使用密鑰聚合技術對多個文件生成一個聚合陷門進行安全檢索,并利用聯盟鏈的智能合約技術實現數據驗證,防止醫療云服務器的惡意攻擊行為。通過理論分析與數值模擬實驗驗證了該方案的安全性與高效性。