牛淑芬 陳俐霞 李文婷 王彩芬 杜小妮
隨著時代的變化,科技已漸漸融入人類生活的各個方面.傳統的醫療保健體系已然跟不上當代便捷生活的腳步,電子病歷的出現更加有效地解決了患者診斷信息的存儲、查詢、數據共享和醫療錯誤等問題[1].電子病歷使患者擁有一個更全面的診斷信息,在就診時能夠讓醫生更快捷、準確的了解患者以往病情,并給出新的診斷結果.文獻[2-4]為電子病歷的應用提供了切實的范例.區塊鏈本質上是一個去中心化的分布式存儲系統,能夠為電子病歷提供平臺支持,生成永久、不可逆向修改的記錄[5-7].近年來,鑒于區塊鏈對電子病歷的應用優勢,多位學者相繼提出了針對不同問題的方案,Yue 等[8]提出一種基于區塊鏈的數據網關架構,并且利用安全多方計算使第三方用戶在不侵犯患者隱私的情況下對存儲數據進行計算.文獻[9]提出了基于區塊鏈的數據共享框架,解決了與云中敏感信息相關的訪問控制問題.該方案是基于許可鏈構造的,只允許受邀用戶訪問數據.張超等[10]構造了一個基于區塊鏈的醫療系統,該系統構建于聯盟鏈之上,通過實用拜占庭容錯算法,保證以很小的算力來實現系統安全穩定的運行,同時能夠防止醫療數據被篡改、泄露.Chen 等[11]提出一種基于區塊鏈共享醫聯體數據服務的框架,重點突出了實施方案不依賴于任何不可信的第三方的特性,可實現患者數據的安全存儲與隱私保護.文獻[12]構建了一種基于區塊鏈的保護個人隱私信息安全的共享協議,并提出了具體的系統模型及方案.該方案在私有鏈與聯盟鏈上進行構造,結合關鍵字搜索技術與聯盟鏈實現了對患者信息的安全搜索,同時保證了患者的數據安全和隱私保護.區塊鏈上電子病歷的最大優勢是多方數據用戶都能共享患者數據,但現有的許多文獻討論患者或者醫生某一方搜索并解密病歷數據.針對這一問題,本文提出了一種基于區塊鏈的電子病歷數據共享方案.在方案中,不但患者可以搜索解密自己的病歷數據,經過授權的第三方機構或個人數據用戶在不能侵犯患者隱私的前提下也可以訪問患者數據.本文的創新點有以下3 個方面:
1)基于區塊鏈提出了電子病歷數據共享方案,實現了第三方數據用戶對患者數據的安全訪問.方案模型的構造利用了私有鏈與聯盟鏈.每家醫院都擁有自己的私有鏈與服務器,多個私有鏈一起構建聯盟鏈.患者病歷密文存儲在醫院服務器,病歷密文的哈希值和關鍵字索引存儲在醫院私有鏈上,而由私有鏈塊標識、患者偽身份和關鍵字索引構成的安全索引則存儲在聯盟鏈上;
2)使用可搜索加密技術實現了安全搜索.聯盟鏈上存儲了由關鍵字索引所構成的安全索引.當有患者或者數據用戶需要使用電子病歷數據時,患者使用自己的私鑰產生搜索陷門發送至聯盟鏈,聯盟鏈上節點進行搜索;
3)使用代理重加密技術實現了第三方數據用戶對患者數據的安全訪問.經患者授權后,聯盟鏈上節點在搜索到患者病歷的原始密文后,對原始密文進行代理重加密,將轉換后的密文發送給第三方數據用戶,數據用戶使用自己的私鑰解密密文.
定義1.令G1和G2為兩個階為素數q的乘法循環群,定義一個雙線性映射e:G1×G1→G2滿足如下性質:
1)雙線性:對于任意a,b∈和x,y∈G1,e(xa,yb)=e(x,y)ab成立;
2)非退化性:存在x,y∈G1,使得e(x,y)1;
3)可計算性:對于任意的x,y∈G1,存在有效算法計算e(x,y).
可搜索加密是由Boneh 等[13]在2004 年提出的,它可以對加密數據進行搜索.在公鑰密碼體制下,用戶將明文消息的關鍵字加密后發送至服務器,用搜索陷門搜索關鍵字.在提出該密碼原語之后,對關鍵字搜索加密的研究陸續展開.2008 年,Baek等[14]指出Boneh 等[13]的方案存在安全信道的問題,通過使用服務器公鑰加密搜索陷門的方法改進了方案,并證明其安全性.為了提高搜索的安全性,Hu等[15]提出了指定驗證者的可搜索加密方案.文獻[16]將可搜索加密技術與代理重加密技術相結合,允許被授權者從委托者的數據中搜索感興趣的關鍵字.在某些情況下需要搜索多個關鍵字,文獻[17-18]提出了帶有聯合字段關鍵字搜索的公鑰加密方案.本文提出了一種基于區塊鏈的電子病歷關鍵字搜索方案.該方案將由關鍵字索引構成的安全索引存儲在聯盟鏈上,實現了關鍵字搜索功能.
代理重加密是由Blaze 等[19]在1998 年提出的一個新的密碼原語.代理重加密的中心思想是對密文的轉換,其參與者有委托者、代理者和受托者,代理者能夠將受托者生成的密文轉換為委托者對同一消息的密文.根據密文轉換方向,可將代理重加密分為單向和雙向.單向代理重加密能夠實現受托者密文向委托者密文的轉換,雙向代理重加密能夠實現密文的雙向轉換.近幾年代理重加密仍然是密碼學界中的研究熱點.Fang 等[20]提出了帶關鍵字查詢的代理重加密的概念,并構造了具體方案.Shao等[21]提出了基于身份的多用戶代理重加密,并證明其安全性.Tang 等[22]基于多線性映射構造了一個單向代理重加密方案.劉振華等[23]提出一個支持關鍵詞搜索的密文策略的屬性代理重加密方案,利用屬性代理重加密實現了數據轉發與數據共享,并且支持數據檢索功能.在這項工作中,本文將代理重加密技術應用于方案的數據搜索階段,提出了一個基于區塊鏈的電子病歷方案,實現了第三方數據用戶對患者數據的安全訪問.當搜索到患者的原始密文后,聯盟鏈[24]上節點通過使用代理重加密算法進行密文轉換.
在該系統中,假設由多個醫院組成一個聯盟鏈,其中每個醫院都有本地服務器和和若干個客戶端,客戶端是由醫生進行操作的.每家醫院構建自己的私有鏈,而多個私有鏈構建一個聯盟鏈.在進入系統前,患者、醫生和數據用戶都需要進行注冊,生成各自的公私鑰對.其中,患者的電子病歷密文存儲在醫院服務器上,電子病歷密文的哈希值和關鍵字索引存儲在醫院私有鏈上,而由私有鏈塊標識、患者偽身份和關鍵字索引構成的安全索引則存儲在聯盟鏈上.系統中主要包括患者、醫生、數據用戶、醫院服務器、私有鏈、聯盟鏈6 個實體,系統模型圖如圖1 所示.

圖1 電子病歷系統模型Fig.1 Electronic medical record system model
1)患者:患者在醫院就診時首先在醫院服務器上進行注冊,注冊完成后醫院服務器給患者分配一個號碼牌,相當于患者的就診卡.患者保密該號碼牌,并在就診時出示號碼牌.醫生為患者產生電子病歷和關鍵字,并用患者公鑰進行加密.若患者去其他醫院就診,當醫生需要了解患者的過往病史時,患者生成搜索陷門并上傳至聯盟鏈.聯盟鏈上節點運行搜索算法后,將電子病歷密文發送給患者,患者可解密該密文.
2)醫生:每個醫院都有本地服務器和和若干個客戶端,客戶端是由醫生進行操作的.當患者就診時,醫生為患者產生偽身份、電子病歷密文、關鍵字密文和證據,并將電子病歷密文上傳至醫院服務器,將病歷密文的哈希值和由關鍵字密文和證據構成的關鍵字索引上傳至私有鏈,產生新交易,并廣播該交易.私有鏈上的其他節點負責驗證該交易,若驗證通過,則生成私有鏈上新的區塊.
3)數據用戶:當除了醫院和患者以外的第三方機構或個人(稱為數據用戶)訪問患者數據時,需要得到患者授權.患者生成搜索陷門并上傳至聯盟鏈,聯盟鏈上節點進行搜索,當搜索到相應患者密文后,聯盟鏈上節點作為代理者為數據用戶產生代理重加密密文.最后,數據用戶可用自己的私鑰解密密文.
4)醫院服務器:當醫生為患者治療并生成電子病歷后,醫院服務器提取私有鏈上的私有鏈塊標識、患者偽身份和關鍵字索引來構建聯盟鏈上新的交易,而在聯盟鏈中的其他節點負責驗證該交易,若驗證通過,則生成聯盟鏈上新的區塊.
5)私有鏈:醫生將電子病歷密文的哈希值、由關鍵字密文和證據構成的關鍵字索引上傳至私有鏈,產生新交易.當收到醫生構建的新交易后,私有鏈上節點驗證該交易.醫院服務器提取私有鏈上的私有鏈塊標識、患者偽身份和關鍵字索引來構建聯盟鏈上新的交易.在數據獲取階段,若搜索成功,聯盟鏈上節點提取塊上安全索引,獲得私有鏈塊標識.而通過私有鏈塊標識,聯盟鏈上節點能獲取到病歷密文的哈希值.
6)聯盟鏈:在搜索過程中,當收到患者發送的陷門后,聯盟鏈上節點運行搜索算法.若搜索成功,聯盟鏈上節點提取塊上安全索引,獲得私有鏈塊標識.通過私有鏈塊標識,聯盟鏈上節點獲取到病歷密文哈希值并反饋給醫院服務器,醫院服務器對電子病歷密文的哈希值進行對比,若一致,則將病歷密文發送給聯盟鏈上節點,聯盟鏈上節點將病歷密文返回給患者.當第三方數據用戶訪問患者電子病歷時,聯盟鏈上節點扮演代理者的角色生成代理重加密密鑰,對電子病歷的密文進行代理重加密后并將重加密后密文發送給第三方用戶.
假設醫院服務器與計算機客戶端均為半可信,攻擊者可以竊聽傳輸信道中的信息,比如安全索引、電子病歷密文和搜索陷門,不允許計算機客戶端與服務器串通以推斷用戶的真實身份.基于以上存在的安全問題,要實現的安全目標如下:
1)數據安全與訪問控制:加密和簽名保證了數據的機密性和完整性,即實現了數據安全.當醫生訪問數據時,系統可以通過識別、認證和授權等機制來實現訪問控制.當數據用戶訪問數據時,系統可以通過代理重加密技術來實現訪問控制.同時,本文利用私有鏈和聯盟鏈來增強數據的安全性.
2)隱私保護:系統通過匿名性和不可追蹤性來實現患者的隱私保護.其中患者偽身份的產生不僅實現了匿名性,同時保護了患者的身份信息和相關的敏感隱私.同時,竊聽者無法判斷兩個或多個電子病歷是否來自同一患者,保證了數據的不可鏈接性.而且竊聽者無法通過患者偽身份追蹤患者的真實身份.
3)安全搜索:系統通過指定驗證者來保證搜索的安全性.在搜索過程中,系統指定由患者生成陷門,聯盟鏈上節點進行搜索.在這個過程中,竊聽者無法猜出關鍵字.
4)系統可用性:區塊鏈的共識機制并不會泄露患者的隱私.聯盟鏈的一致性證明是通過驗證安全索引中的關鍵字是否屬于關鍵字集來實現.在聯盟鏈驗證過程中,竊聽者并不能得到該關鍵字.而私有鏈的一致性證明是通過驗證患者是否授權醫生生成病歷密文來實現,在私有鏈驗證過程中,竊聽者無法得知患者的真實身份.
本文在系統中使用了私有鏈與聯盟鏈,都分別存儲了不同的數據,因此具有不同的數據結構.私有鏈的數據結構如表1 所示.它由時間戳、塊頭和交易組成.塊頭包括:塊的ID、塊的大小和前塊的哈希.交易包括:塊產生者(醫生)的ID、患者偽身份、關鍵字索引、病歷密文的哈希和塊產生者(醫生)的簽名.塊產生者的簽名有助于追蹤醫生,時間戳顯示塊的生成時間,關鍵字索引由關鍵字密文和證據構成.

表1 私有鏈的數據結構Table 1 Private chain data structure
聯盟鏈的數據結構如表2 所示.它由時間戳、塊頭和交易組成.塊頭包括:塊的ID、塊的大小和前塊的哈希.其中交易包括:塊產生者(醫院服務器)的ID、安全索引和塊產生者(醫院服務器)的簽名.醫院服務器在一定時間間隔內創建新塊.期間,醫院服務器會收集私有鏈上塊的塊ID、患者偽身份和關鍵字索引來構成該塊的安全索引.

表2 聯盟鏈的數據結構Table 2 Consortium chain data structure
本文所用的區塊鏈系統就是一個分布式的數據庫,共識機制保證了數據的完整與同步,即數據的一致性.
1)私有鏈的一致性證明:當患者到醫院注冊后,醫院服務器為其產生號碼牌并分配醫生.當患者與醫生交互后,醫生為患者產生電子病歷密文.為了保證患者匿名性,醫生為患者生成偽身份.最后,醫生構建交易并廣播至醫院私有鏈.私有鏈上的驗證者驗證患者是否授權醫生生成電子病歷,即η與號碼牌是否匹配.若匹配,則驗證者驗證通過.若超過2/3 的驗證者驗證通過,則私有鏈生成新的區塊.
2)聯盟鏈的一致性證明:在數據加密階段,系統定義了一個關鍵字集W={w1,w2,···,wn},其中包含了患者有可能出現的所有癥狀的描述.而本文加密的關鍵字都是從關鍵字集W中選取的.在本文的系統中對聯盟鏈的一致性證明描述為:聯盟鏈上的驗證者驗證新塊中安全索引上的關鍵字密文是否來自關鍵字集W={w1,w2,···,wn}.為了實現聯盟鏈上的一致性證明,系統構造了一個多項式f(x),具體如下:對于關鍵集W,系統計算H1(w1),H1(w2),···,H1(wn),并定義多項式f(H1(wi))=0,i∈(1,2,···,n),即f(x)=(x-H1(w1))(x-H1(w2))···(x-H1(wn))=0.假設存在向量b=[1,bn-1,···,b0]使得多項式可以表示為f(x)=xn+bn-1xn-1+···+b1x+b0,轉換等式為xn+bn-1xn-1+···+b1x=-b0,其中x=H1(wi),i∈(1,2,···,n).若設置向量a=[an=-b1/b0,···,a1=-b1/b0],則系統可推出新多項式g(x)=anxn+···+a1x,且g(H1(wi))=1,i∈(1,2,···,n). 若存在向量h={H1(w1),H1(w2)2,···,H1(wn)n},則有等式ah=1.若數據加密過程中使用的關鍵字屬于關鍵字集W={w1,w2,···,wn},則等式ah=1 成立.若超過2/3 的驗證者驗證通過,則聯盟鏈生成新的區塊.
方案可以分為數據產生、數據存儲和數據搜索三個階段.圖2 為數據產生與數據存儲過程,圖3為數據搜索的過程.

圖2 數據產生與數據存儲Fig.2 Data generation and data storage

圖3 數據搜索Fig.3 Data search
假設患者a去醫院i看病,由醫生d進行診斷.患者a看病之前需要在醫院i的服務器上進行注冊.醫院的服務器為患者產生號碼牌β,并計算μ=H1(β)存儲在系統中.患者在見到醫生后出示號碼牌β,相當于授權給醫生為自己生成電子病歷m和關鍵字w.醫生用患者的公鑰pka加密m和w.輸出密文Ca=.

為了實現患者的匿名性,醫生為患者產生偽身份.未經患者本人授權,其他用戶不能將偽身份與真實身份相關聯.不同醫生為同一患者產生的偽身份也不同,以實現不可鏈接性.最后,醫生構建新交易,并廣播至醫院私有鏈.當收到該交易后,私有鏈的驗證者進行驗證,生成了如表1 數據結構的新區塊.醫院服務器提取私有鏈中每個新的塊標識IDb、患者偽身份IDa和關鍵字索引構成安全索引.其中.服務器將在私有鏈上收集到的作為交易上傳至聯盟鏈,聯盟鏈上節點進行驗證,若驗證通過,生成如表2 數據結構的新區塊.
若去其他醫院就診,當醫生想要查看該患者相關的歷史診斷記錄時,患者將搜索陷門T1和T2發送至聯盟鏈,聯盟鏈上節點進行搜索.若搜索成功,聯盟鏈上節點提取安全索引中的私有鏈塊標識IDb.且通過私有鏈塊標識IDb,聯盟鏈上節點可以得到病歷密文的哈希值,由醫院服務器進行密文哈希值對比得到病歷密文并返回給聯盟鏈上節點.最后,患者可用自己的私鑰解密該密文.
當經過患者授權的數據用戶要訪問患者歷史診斷記錄數據時,患者將搜索陷門發送到聯盟鏈上進行關鍵字密文搜索.若搜索成功,聯盟鏈上節點作為代理者進行代理重加密并將重加密密文發送給數據用戶,數據用戶用自己的私鑰進行解密獲得患者的電子病歷.
本文方案由系統建立、數據產生與存儲、數據搜索與訪問3 個步驟組成.
1)系統建立:
本階段系統運行參數生成算法生成公共參數PP,患者、醫生和數據用戶分別生成各自的公私鑰對.每次患者去醫院就診時,醫院選擇隨機數β∈,將β安全地發送給患者.同時,醫院為該患者指定一名醫生,計算μ=H1(β)并發送到醫院服務器.
a)初始化:
系統輸入安全參數λ,輸出雙線性對e:G1×G1→G2,其中G1、G2是階數為素數q的乘法循環群,選擇生成元g∈G1,計算h=e(g,g). 定義6 個哈希函數H1:{0,1}*→、H2:{0,1}*→G1、H3:{0,1}*×{0,1}*→G1、H4:G2→{0,1}*、H5:{0,1}*×G1→和H6:G1→{0,1}*.設置公共參數PP=(g,h,e,q,G1,G2,H1,H2,H3,H4,H5,H6).
b)密鑰生成:

c)重加密密鑰生成:
輸入患者a和數據用戶u的私鑰 (ska,sku),采用文獻[13]的方法為代理者產生代理重加密密鑰rk=sku/ska.
2)數據產生與存儲:
當患者就診時,向醫生出示β,醫生對病患診斷后產生病歷m∈{0,1}*.并提取關鍵字w∈{0,1}*.醫生用患者的公鑰pka加密m和w.具體步驟如下:
a)加密:

b)患者偽身份生成:
患者的真實身份為RIDa,醫生隨機選取k ∈,計算患者偽身份IDa=RIDa⊕H1(β)k并保密k.為了提供私有鏈上的一致性證明,醫生計算η=(α=,β′=H6(gk)⊕β).最后,醫生利用關鍵字索引、醫生身份和醫生簽名來構建新交易并將交易廣播至醫院私有鏈.收到新交易后,私有鏈上的驗證者對新交易進行驗證:從交易中提取η=(α,β′),并在醫院服務器中搜索μ,計算β*=β′,檢查μ=H1(β*)是否成立.
若等式成立,則新交易有效,驗證者廣播驗證確認消息,當收到 [2/3np]的驗證確認消息之后,私有鏈接受新交易,并生成如表1 數據結構的新區塊.否則,拒絕新塊加入私有鏈.[np]表示私有鏈中的節點數量.
正確性:

c)數據存儲:
在每個私有鏈中,服務器提取每個新塊的塊標識、患者偽身份和關鍵字索引,令安全索引,服務器利用安全索引、服務器身份和服務器簽名來構建新交易并將交易廣播至聯盟鏈.
正確性:

3)數據搜索與訪問:
當患者或數據用戶想要訪問病歷數據時,患者使用私鑰為其產生搜索陷門并發送到聯盟鏈.具體過程如下:
a)陷門生成:

b)搜索:
聯盟鏈上節點計算Tw=并驗證等式F=H4(e(B,Tw))是否成立.若成立,聯盟鏈上節點提取安全索引并獲得私有鏈塊標識IDb.通過私有鏈塊標識IDb,聯盟鏈上節點訪問相應的私有鏈得到病歷密文的哈希值,由醫院服務器進行密文哈希值對比后得到病歷密文,并將其返回給聯盟鏈上節點.
正確性:

c)解密:

本節分析本文提出方案如何有效地滿足系統模型中提出的設計目標.
區塊鏈的基本特性使得存儲在區塊鏈中的數據是不可更改的,確保數據無法修改,除非攻擊者具有全網百分之五十一的計算能力.電子病歷密文是使用患者的公鑰加密的,因此只有用患者的私鑰才能解密數據,保證了數據的機密性.本文構建私有鏈上新區塊時附有醫生的簽名,而在構建聯盟鏈上新區塊時附有醫院的簽名,這保證了數據的完整性.存儲在區塊鏈上的密文,只允許經過身份驗證的訪問者獲取.若醫生需要患者數據,患者上傳搜索陷門,聯盟鏈上節點進行搜索后返回密文給患者,患者解密后給醫生.當數據用戶訪問數據時,首先與患者和聯盟鏈上節點交互得到代理重加密密鑰,而后聯盟鏈上節點運行代理重加密算法得到重加密密文,相當于患者對數據用戶進行授權.因此,患者能夠對自己的電子病歷進行訪問控制.
醫生為患者生成的偽身份IDa=RIDa⊕H1(β)k,竊聽者無法得到β和隨機數k,無法推出患者的真實身份,因此,本文方案實現了匿名性和不可追蹤性,保護了患者的身份信息.如表2 所示,私有鏈區塊上附有患者偽身份;如表3 所示,聯盟鏈區塊上的安全索引包含患者偽身份,即使是同一個患者,由于k的隨機性,則每次生成的患者偽身份不同.因此,竊聽者無法判斷兩個或多個電子病歷密文是否來自同一患者,保證了數據的不可鏈接性.表3中 ? 和×分別表示是否具有該功能.

表3 功能特性比較Table 3 Comparisons of functional properties
在搜索過程中,患者利用自己的私鑰和聯盟鏈上節點的公鑰生成陷門,聯盟鏈上節點利用自己的私鑰進行搜索.因為陷門T1、T2涉及患者私鑰ska和號碼牌β,搜索算法中涉及了聯盟鏈上節點私鑰sks,即使竊聽者得知陷門,也無法推斷出關鍵字和號碼牌β,進而無法推斷出患者的真實身份,有助于抵抗關鍵詞猜測攻擊.
在聯盟鏈上,共識機制需要醫院服務器提供證據驗證關鍵字索引中的關鍵字屬于關鍵字集.若=(A,Y,X)可以通過等式=e(X1,X1)則等式ah=1 成立,這意味著數據加密過程中使用的關鍵字屬于關鍵字集W={w1,w2,···,wn}.而且醫生在構造證據時使用的是關鍵字w的哈希值H1(w),由于哈希函數的單向性,即使竊聽者獲得證據=(A,Y,X),但竊聽者無法得到任何與關鍵字有關的信息.在私有鏈上,驗證者通過驗證患者是否由授權醫生生成電子病歷來確定新塊的有效性.雖然交易中包含患者的偽身份,但患者的偽身份IDa=RIDa⊕H1(β)k中k為隨機數,號碼牌β保密,故竊聽者無法得到患者的真實身份.
1)功能性對比
本文方案與文獻[5,12,25-28]進行了功能性對比,其中文獻[5,12,25-26]皆應用于醫療電子病歷,而文獻[27-28]的應用環境則是云服務器.結果由表3 所示.對比發現文獻[5,26-28]均為非區塊鏈數據存儲平臺,文獻[25]與文獻[26]無法達成數據搜索功能,文獻[5,12,25-26]方案均不具備第三方數據用戶安全共享患者數據的功能.表中文獻方案均滿足方案的訪問控制與隱私保護.通過與以上方案的對比,表明本文方案在功能性上具有一定的優勢.
2)運算成本分析
在表4 中,Tp表示雙線性配對運算的時間,Te表示指數運算的時間,Tm表示乘法運算的時間,Th表示哈希運算的時間.由表2 可以看出,常用密碼操作配對時間的排序為Tp>Te>Tm>Th,且配對運算的時間Tp遠大于其他密碼操作的時間.

表4 常用密碼算法的計算成本 (ms)Table 4 The computational cost of common cryptographic algorithms (ms)
由表5 可以看出,在關鍵字密文生成階段,各方案計算量由大到小依次為本文方案、文獻[28]和文獻[27];在搜索階段,各方案計算量由大到小依次為文獻[27]、文獻[28]和本文方案.

表5 方案的計算代價Table 5 Computational overhead of the proposed scheme
本文方案應用在區塊鏈上的醫療體系下.假設np代表私有鏈或聯盟鏈上的節點數量,則在私有鏈一致性驗證時,本方案的計算開銷是(Te+Tm+2Th)×[2/3np],在聯盟鏈一致性驗證時,本文方案的計算開銷是(4Tp+Te+Tm)×[2/3np].
數值模擬實驗是在Linux 虛擬機上通過利用PBC (Paring-Based Cryptography)庫由C 語言進行編寫,并在2.50 GHz CPU、4 GB 內存筆記本電腦上運行.在數值實驗中,由于本文、文獻[27]和文獻[28]方案只支持單關鍵字的搜索,設單關鍵字的基本字段長度為1 024 位,因此將變量設置為關鍵字的個數.將變量分別設置為10、20、30、40 和50,實驗結果取50 次運行結果的平均值,實驗結果如表6 所示.
由表6 的數值結果可以發現,在系統建立和數據產生與存儲階段,變量的增加對系統建立算法和私有鏈上對新塊的驗證算法所產生的時間成本基本沒有影響,加密算法和聯盟鏈上對新塊驗證的算法因涉及了多個雙線性對的運算,故時間成本受到較大影響.在數據搜索與訪問階段,2 種情形下解密算法的時間開銷基本沒有影響,搜索陷門產生算法和測試算法中雙線性對的運算涉及比重較小,大部分涉及點乘運算與冪運算,因此時間成本增長較為緩慢.

表6 本方案算法各個階段的時間成本 (毫秒)Table 6 Time cost of each phase in the scheme (ms)
為了更清晰地觀察本文方案的性能優缺點,對本文和文獻[27]和文獻[28]方案在數據加密與數據搜索算法的時間開銷進行了分析,如圖4~5 所示.由圖4 可以看出,盡管本文的加密算法時間開銷要高于文獻[27]和文獻[28]方案,但是本文更適用于區塊鏈上的醫療體系.由圖5可以看出,隨著關鍵字個數的增加,3 個方案的時間開銷呈現線性增長,且本文的搜索時間開銷要較小于文獻[27]和文獻[28]方案.故本文方案的搜索效率較高.故本文方案在搜索計算代價上有較明顯的優勢,提高了系統的性能.

圖4 加密算法的時間成本Fig.4 Time cost of encryption algorithms

圖5 搜索算法的時間成本Fig.5 Time cost of search algorithms
本文提出了一種基于區塊鏈的電子病歷數據共享方案,用于第三方數據用戶對患者數據的安全訪問.方案的構建是基于私有鏈與聯盟鏈的,每家醫院擁有自己的私有鏈,多家私有鏈一起構建聯盟鏈.服務器上存儲患者電子病歷密文,私有鏈存儲病歷密文的哈希值和關鍵字索引,聯盟鏈存儲由患者偽身份和關鍵字索引所構成的安全索引.方案使用可搜索加密技術實現了聯盟鏈上的安全搜索;使用代理重加密完成對密文的轉換,使數據用戶能對患者數據進行安全訪問.方案實現了數據安全、訪問控制、隱私保護和安全搜索的安全目標.最后,通過數值實驗分析了方案的綜合性能水平.在之后的工作中,擬將方案的單關鍵字搜索加密改為鏈接關鍵字搜索加密,并且進一步細化區塊鏈上對新區塊的驗證過程.