張 磊 鄭志勇 ,2 袁 勇,3
1.中國人民大學數學學院 北京 100872 2.中國人民大學金融計算與數字工程教育部工程研究中心 北京 100872 3.中國科學院自動化研究所復雜系統管理與控制國家重點實驗室 北京 100190
電子醫療病歷(Electronic health record,EHR)存儲著病人的診斷信息和治療信息,有助于提供便利的健康記錄存儲服務.對于嚴重疾病或者慢性疾
病,病人就診時,如果醫生能夠看到先前病史,就可以綜合之前的診斷及治療效果,對病情進行更全面、準確地分析,為病人提供更加高效的治療方案.同時,對于重大突發傳染病,EHR 的共享也可使來自各個地區的優秀醫療團隊對疫情態勢進行全方位、準確和快速地研判,提高處置效率和公共醫療健康水平[1].
然而,目前不同醫院之間的數據互操作性相對較差,醫療數據普遍存在數據孤島問題.電子病歷數據大多是由醫院掌握,病人對自己病歷的使用情況并不完全知情.EHR 中存儲著病人的個人信息和病歷,一旦受到攻擊,將會導致病人隱私等敏感信息泄露,引發安全風險及醫患矛盾[2].因此,EHR 共享時的數據及身份隱私保護至關重要.
為實現不同醫院間醫療數據的安全共享,同時病人能夠對數據進行訪問控制,一些學者提出利用基于密文策略的屬性加密方案(Ciphertext-policy attribute-based encryption,CP-ABE)[3]對病歷進行加密,將密文存儲于云服務器上,實現EHR的共享.CP-ABE 方案能實現細粒度的數據訪問控制和加密,然而,云服務器通常是半可信的,其會執行用戶的命令,但仍對用戶的信息感到好奇.在監管缺失和遭受特定攻擊時,云可能會篡改、丟失或泄露用戶的數據.
區塊鏈作為比特幣的核心技術,具有去中心化、數據不可篡改、可追溯、不可偽造、可編程等性質[4-6],在特定的場景下,也可以對區塊鏈上的數據進行隱藏,因此可用于實現安全和可信的EHR 管理[7-10].由于區塊鏈現階段存在性能瓶頸,而EHR 中通常包括大規模、跨媒體的健康數據,例如CT、X 光等醫療影像數據,因此單純使用區塊鏈存儲和共享EHR 的效率不高,迫切需要將云存儲和區塊鏈相結合,以便優勢互補,實現安全和高效的EHR 共享.
本文提出了云鏈協同、病人可控的EHR 安全共享方案.該方案采用鏈上與鏈下混合存儲方式,利用CP-ABE 方案來加密EHR 數據,使得病人可以自主可控地定義訪問策略,實現細粒度的訪問控制.病人將加密EHR 數據存儲于云服務器、并利用區塊鏈存儲數據的Hash 值及訪問策略,從而保證數據的真實性和完整性,方案支持用戶對密文進行多關鍵詞搜索,以提高搜索效率及準確性.各級醫院形成聯盟區塊鏈,改進實用拜占庭算法,利用聚類算法將節點進行分類,在病人將數據上傳至區塊鏈及數據用戶向區塊鏈訪問病歷摘要時,節點間可盡快達成共識,改進的共識算法支持節點動態加入及退出區塊鏈.考慮到數據用戶的身份不是一成不變的,本文提出了屬性更新子協議,以保障數據用戶身份變化時病歷的安全性.
本文其余部分安排如下:第1 節介紹相關工作和研究現狀;第2 節描述了EHR 數據共享模型的設計目標與模型框架;第3 節給出了模型的關鍵步驟和算法設計;第4 節闡述用戶搜索訪問更新子協議;第5 節討論模型的性質;第6 節總結全文.
近年來,EHR 逐漸代替紙質病歷,一定程度上解決了病人在某家醫院就診時,可能因為紙質病歷、檢查單等丟失,需要重復做一些健康檢查的困擾.目前的問題是:不同醫院之間的EHR 數據共享非常少,病人在轉院治療時,其他醫院無法看到病人之前的病歷數據.因此,EHR 數據共享成為公共健康和智慧醫療領域的熱點.
現有文獻中,Alshehri 等[11]提出將EHR 數據存儲在云上,利用CP-ABE 方案來進行加密,只有具有相應屬性的用戶才可以解密密文,可實現安全存儲及細粒度的靈活訪問控制.Yang 等[12]提出了支持連接關鍵詞搜索及定時啟用代理重加密功能的云上健康數據分享方案,允許用戶在指定的時間內進行病歷的搜索;數據擁有者可控制用戶搜索和解密的時間,但該方案計算能力較低,存儲開銷較大.Huang 等[13]提出基于歐幾里得相似性距離的推薦協議,為病人推薦合適的醫生,以便減少病人的隱私泄露,同時利用基于屬性的條件性代理重加密方案,提出了基于云的細粒度隱私保護的病歷共享方案.但實際應用場景中,數據用戶的屬性并非一成不變的,屠袁飛等[14]利用屬性加密,對EHR 進行加密存儲到云服務器上進行共享,同時利用版本號標記和代理重加密方案實現用戶屬性的撤銷,保證了在用戶屬性發生變化時密文的安全性.為提高病歷共享的效率,Rao[15]提出了安全的基于屬性的簽名及加密的病歷分享方案,相比之前存在的方案,該方案支持更短的密文,需要更少的雙線性對計算.
上述研究盡管也關注云環境中數據共享的安全性,但因云是半可信的,將數據存儲到云服務器中可能會面臨數據丟失、篡改等風險.區塊鏈技術可以較好地解決該問題,保障數據的完整性和真實性.區塊鏈是一個不可篡改的分布式賬本,特定的節點間通過共識,將數據記錄上鏈[16-17],進行數據審計,防止數據被更改.因此,不少學者將區塊鏈技術用于數據分享中,以期保障數據的真實性、完整性和不可篡改性[18-22].
Ekblaw 等[23]利用區塊鏈技術設計了去中心化的電子健康病歷分享系統,首次提出利用智能合約實現權限管理.Xia 等[24]提出了MeDShare,用于解決在共享醫療數據時缺乏信任的問題.該系統基于區塊鏈,為大數據實體之間在云存儲庫中共享的醫療數據提供數據來源、審計和控制,采用智能合約和訪問控制機制,有效地跟蹤數據的行為,并在發現用戶違反數據權限時撤銷違規實體的訪問權.薛騰飛等[25]提出了基于區塊鏈的醫療數據共享模型,將醫療機構劃分等級,使用改進的委托權益證明共識機制安全、快捷地進行數據共享.Shen 等[26]提出Medchain,將病歷內容放在點對點的網絡上,摘要等部分放在區塊鏈上,該方案利用智能合約管理數據的訪問權限,但使用智能合約成本較高.劉格昌等[27]提出了基于可搜索加密的數據隱私保護機制,將該系統應用于個人醫療數據區塊鏈中,使得隱私數據搜索更加方便.Wu 等[28]提出了將病人敏感信息進行數據脫敏,然后將其加密存儲到區塊鏈和分布式文件存儲系統中.張超等[29]提出Medical chain,利用實用拜占庭容錯算法達成共識,防止醫療數據被篡改.羅文俊等[30]將分布式密鑰生成技術和基于身份的代理重加密技術相結合,設計了數據安全共享協議,利用委托權益證明共識算法選取代理節點,重加密EHR,但此方案只適合于單對用戶間進行數據共享,不支持一對多的數據共享.
通過分析和比較現有的EHR 共享方案可知,該領域研究雖然取得了一定的成果,但還有一些可以改進的地方.例如,單獨使用云服務器進行數據存儲時,由于云是半可信的,可能會造成數據篡改或者泄露等安全性問題.單獨使用區塊鏈時,則無法克服因存儲數據的規模過大造成效率過低的問題.因此,有必要將區塊鏈和云存儲技術相互結合,實現云鏈協同的EHR 數據共享.此時,數據以何種方式存儲更加安全,病人如何進行數據訪問控制,數據用戶如何對密文進行高效的搜索,如何使得模型兼具以上良好的性質,如何提高共享的效率,都是值得進一步研究的問題.
為此,本文在現有文獻[31]的基礎上提出了病人可控的云鏈協同的EHR 共享模型.病人將EHR數據加密后存儲在云服務器上,將數據摘要及訪問策略存儲在區塊鏈上,這樣既能防止云服務器篡改數據、方便進行數據完整性審計;同時又能減輕區塊鏈的存儲壓力,使得方案更具可擴展性.本文利用聚類算法,改進實用拜占庭算法,提高區塊鏈中節點達成共識的效率.利用CP-ABE 方案加密病歷,只有滿足病人設置的屬性訪問策略的用戶可訪問數據,使得一對多的數據分享能夠實現細粒度的訪問控制.對于加密后的病歷,支持利用多關鍵詞搜索,以提高搜索效率及準確性.在實際場景中,用戶屬性的變化對于密文安全性有很大的影響,因此本文提出了用戶屬性的動態更新下數據安全共享的方案.本文模型既解決了EHR 安全存儲的問題,同時病人可以管理病歷的使用情況,使得數據共享更加高效、安全.
本節首先給出EHR 數據共享模型的設計目標,然后重點闡述模型的邏輯框架與運行流程.
該模型旨在達到如下設計目標:
1)病人可控的數據共享.針對病人無法完全掌握其EHR 使用情況的問題,本文旨在設計病人可控的EHR 共享模型,即由病人自主決定其病歷的訪問權限.
2)隱私保護.EHR 存儲著大量隱私信息,因此保障數據的保密性及完整性非常重要.本文旨在結合密碼學和區塊鏈技術,通過加密及屬性分配等方式保護病人及數據用戶的隱私信息,同時保障數據在共享過程中的完整性與可審計性.
3)細粒度訪問控制.利用CP-ABE 方案,病人可自主定義訪問策略,確保數據可達到細粒度的訪問控制.
4)安全搜索.本文模型旨在構建安全的可搜索加密方案,數據用戶利用多關鍵詞搜索算法,生成關鍵詞Token,進行搜索.數據用戶身份在滿足病人設置的訪問策略時,才有權訪問其歷史病歷.竊聽者無法猜到關鍵詞.即使其猜到關鍵詞,因其身份不符合病人設置的訪問策略,仍然無法得到數據密文.
本文提出將區塊鏈與云服務器相結合,實現數據的鏈上(區塊鏈)+ 鏈下(云服務器)混合存儲;同時,利用CP-ABE 方案和多關鍵詞可搜索加密方案,實現細粒度的訪問控制及高效的數據搜索和安全共享.如圖1所示,基于區塊鏈和云服務器的EHR 共享模型包括如下主要角色,即證書機構(Certificate authority,CA)、屬性機構(Attribute authority,AA)、聯盟區塊鏈(Blockchain,BC)、云服務提供者(Cloud service provider,CSP)、數據擁有者(Data owner,DO)以及數據用戶(Data user,DU).

圖1 EHR 數據共享模型的邏輯框架Fig.1 The logic framework of EHR data sharing model
各個角色的具體介紹如下:
1)證書機構(CA):負責進行全局設置,設置系統的主公鑰和密鑰.生成DO 和CSP 的公私鑰對.本文假設CA 完全可信.
2)屬性機構(AA):例如醫院、保險公司或者醫療研究機構等,負責核查DU 的身份,為合法的DU 生成私鑰.
3)聯盟區塊鏈(BC):存儲加密數據的摘要,驗證DU 的請求.
4)云服務提供者(CSP):負責存儲加密數據及訪問策略.
5)數據擁有者(DO):即病人,負責加密、存儲數據,生成數據的訪問策略.
6)數據用戶(DU):例如醫生、保險公司經理等希望查看病人病歷的用戶.
該模型的運行流程如下:
步驟1.全局設置.該算法由CA 執行,包括設置全局公共參數、公共屬性密鑰、系統主公鑰和主密鑰.
步驟2.密鑰生成.CA 驗證AA 的身份,為合法的AA 分發身份.CA 驗證DO、CSP 的身份,為其設置公私鑰對.當DU 希望加入系統時,發送注冊請求給AA,AA 為合法的DU 分配身份uid及屬性Aaid,uid,同時為其計算私鑰,如圖1 中①和②所示.
步驟3.數據加密.DO 運行加密算法,包括以下3 個子步驟:
1)關鍵字索引index 產生:DO 為文件選擇關鍵詞,設置關鍵詞索引index;
2)文件加密:從密鑰空間隨機選取密鑰kθ,對文件進行加密;
3)加密kθ.
步驟4.數據存儲.如圖1 中③和④所示,為克服區塊鏈的空間限制和性能瓶頸,提高區塊鏈的可擴展性,同時防止CSP 篡改數據,本文提出將數據進行鏈上、鏈下混合存儲的結構,如圖2所示.

圖2 數據混合存儲結構Fig.2 Hybrid structure for data storage
DO 將原始醫療數據加密上傳至CSP,將數據摘要等存儲到區塊鏈上,區塊鏈中的Merkle 樹結構[16]可以用來驗證數據的完整性與真實性.醫療數據塊和摘要數據塊存儲內容如圖3(a)和圖3(b)所示.

圖3 醫療數據塊和摘要數據塊Fig.3 Medical data block and digest data block
DO 對醫療數據進行加密,得到密文CT,對其進行簽名,得到SigDO.同時,計算其Hash 值,然后將密文、Hash 值及SigDO,一起發送給CSP.CSP接收到簽名之后,驗證DO 的簽名,計算CT 的Hash 值,如果與DO 發送來的Hash 值相同,則證明接受到了正確的密文,向DO 返回1 及文件位置;否則返回0.
步驟5.數據訪問.當DU 希望訪問數據時,使
用可搜索加密算法,輸入公鑰、關鍵詞集合,產生搜索Token.DU 向區塊鏈主節點發送查找請求,如圖1 中⑤所示.
節點收到請求后,運行匹配算法,驗證是否有關鍵詞索引index 可以匹配上數據用戶產生的Token.如果搜索成功,表明數據文件未被刪除,區塊鏈返回相應的摘要數據塊給數據用戶,否則返回異常提示信息.
該算法由DU 執行,DU 接收到摘要數據塊后,首先計算出內容密鑰kθ,解密出文件位置,向CSP發出數據請求,如圖1 中⑥所示.如果DU 的屬性集合滿足DO 設置的訪問策略,CSP 會輸出相應的密文,否則返回異常提示信息.
步驟6.解密.DU 首先計算密文的Hash 值,與區塊鏈存儲的Hash 值進行比較,驗證文件是否被篡改.如果文件沒有被篡改,則首先解密出內容密鑰kθ,再利用內容密鑰解密文件.
本節介紹模型的詳細構造.
CA 進行全局設置,產生系統公鑰和主密鑰.具體步驟如算法1所示.
算法1.模型的全局設置.
輸入.安全參數,屬性集合.
輸出.全局公共參數GP,公共屬性密鑰PAKx,公鑰PK,主私鑰MK.






DU 接收到區塊鏈節點發送的交易單.如果

本文基于實用拜占庭共識算法(Practical Byzantine fault tolerance,PBFT)[32],改進陳子豪等[33]提出的KPBFT 共識算法,全國各級醫院間形成聯盟區塊鏈,對于n個醫院,隨機選擇k個聚類中心,作為代理節點,構成代理節點群,對其進行編號,代理節點群中成員輪流成為當值主節點.考慮各個醫院間的地理位置、設備硬件、網絡延遲等因素,進行聚類.共識結構如圖4所示.

圖4 共識節點結構Fig.4 The structure of the consensus nodes
共識過程如圖5所示.首先每一類節點間達成共識,然后代理節點群間再進行共識,最后達成共識.在一段時間后,更換聚類中心,重新進行聚類.

圖5 改進的PBFT 算法Fig.5 Process of improved PBFT
共識過程描述如下:
1)請求階段.當病人DO 要上傳摘要數據塊,或數據用戶DU 想訪問病歷時,首先向區塊鏈提出請求.本文改變PBFT 中要將消息發送給所有節點,只發給代理節點.如果請求不是代理當值主節點收到的,先在代理節點群中廣泛轉發.如果是代理當值主節點收到的,其首先驗證交易的合法性.若不正確,直接丟棄.否則,對其進行編號,放入列表中,廣播到代理節點中其他成員.在這個過程中,節點需要驗證交易中CSP 的簽名是否正確,訪問策略與CSP 中的訪問策略是否相同.
2)子節點共識過程.如交易合法,代理節點將收到的交易廣播到其子共識節點群中.子節點群間進行預備、準備、確認、回復階段,將執行結果發送給其代理節點.
3)代理節點群的共識過程.代理節點間執行共識過程,因代理節點只需將自己負責的子節點群的消息相互廣播即可,所以代理節點間通過確認、回復階段即可,在收到別的代理節點值時,節點會驗證如果與他計算的值相同,那么廣播一個確認消息到代理節點網絡中.當節點收到 2f+1(f為系統中拜占庭節點的個數)個確認消息后,向客戶端回復消息.
實際應用場景中,DU 的屬性并非一成不變的.當DU 的屬性發生變化時,為保證文件的安全及搜索的有效性,本文設置了屬性撤銷及屬性添加子協議,協議的具體構造如下.

在CA 更新屬性密鑰及公共屬性密鑰,AA 更新DU 的私鑰及DO 更新相應的密文后,按照第3.3 節構造中的方法將更新的密文發送給CSP 及區塊鏈節點,重新在區塊鏈上進行存儲.在執行完上述操作后,不再擁有相應屬性的DU 不能再查看相應屬性加密的文件,確保了文件的安全.
當DU 新增新的屬性y時,為保證DU 能查看相應文件,系統運行屬性添加協議,更改DU 的私鑰.詳細過程如下所示,其余步驟與第3 節相同.
1)DU 向AA 提出申請:新增屬性y,AA 驗證其身份的合理性,重新計算其私鑰為.
3)DU 更新先前屬性集為Suid:=Suid ∪{y}.同時更新私鑰為SKDU′=(D,D′,D′′,Dx∪y).
執行完上述操作后,DU 憑借其新增屬性可以查 看該屬性能夠解密的相應文檔.
本節比較傳統的PBFT 算法及改進的共識算法的通信次數.當系統節點為n個時,傳統PBFT算法中客戶端請求、各節點間預備、準備、確認、回復給客戶端通信次數分別為為n次、n-1 次、(n-1)×(n-1)次、n×(n-1)次、n次,總通信次數為 2n2次.
改進的共識算法中,利用將節點進行聚類,通信次數計算如下:因將n個節點分為k類,每一類中有n/k個節點.首先,客戶端向代理節點請求及代理節點間預備通信次數為k次,子節點間通信次數為 2n2/k2次,然后代理節點間進行確認的通信次數為k×(k-1)次,代理節點回復客戶端次數通信次數為k次,求和得總次數為:2n2/k2+k2+k次.該函數圖像如圖6所示(為使趨勢變化更清晰明了,做圖時對該函數進行了取對數運算).

圖6 改進共識算法的通信次數Fig.6 The communication time of improved PBFT
本文部分工作是基于Sun 等[31]的模型,在其基礎上引入區塊鏈技術實現醫療數據的分享,關鍵詞搜索的正確性及文件解密的正確性均已在該文獻中加以證明.
云服務器是半可信的,它會執行用戶的請求,但也對用戶的隱私數據很感興趣.在本文模型中,其存儲的是密文文件,云服務器無法獲得解密密鑰,所以無法解密文件,因此數據的隱私可以得到保障.
DO 定義了訪問策略,只有當DU 的屬性滿足時,才可解密出內容密鑰,進行文件位置及文件密文解密,因此身份不符的DU 無法獲得DO 病歷.同時,本文將電子病歷的Hash 值和DO 定義的訪問策略記錄在區塊鏈上,DU 可通過區塊鏈驗證數據的完整性,進行數據審計,防止CSP 篡改數據.一旦云服務器非法刪除或者篡改數據,DU 在得到數據后,與區塊鏈中存儲的Hash 值進行對比,因Hash 函數的抗碰撞性,所以會很容易發現不同,DU 會向CSP 發送錯誤報告.
DO 向區塊鏈存儲數據及DU 向區塊鏈請求查詢文件時,可以通過改進的共識算法確保存儲服務及查詢服務順利實現.
DO 利用公鑰T對密文及交易進行簽名,發送給CSP 及區塊鏈節點進行驗證時,以下兩式的正確性SigDO(CT)T=H(CT)及SigDO(trans)T=H(trans)可由RSA[34]算法的正確性保障.
在向CSP 發送加密病歷時,DO 使用其私鑰進行簽名,而其公私鑰對是由完全可信的CA 來分配和保存,所以DO 的身份也是保密的.DU 在進行數據訪問時,利用AA 發送的獨特的身份和屬性集合,可以保持其真實身份的安全性.
在多關鍵詞搜索方案中,因選用隨機數產生的關鍵詞索引,所以竊聽者不能夠猜到關鍵詞,無法產生對應的Token,因此多關鍵詞搜索方案是安全的.
5.2.1 算法支持成員的動態變化
改進的PBFT 算法可以實現成員動態加入和退出的功能,因為每一類的成員由聚類中心的代理節點管理,當成員退出時,代理節點將該節點從廣播列表中刪除.當成員加入時,計算其與哪個代理節點距離較為接近,將其加入該類子群中,使得成員動態變化時不用再進行整個網絡的初始化.
5.2.2 通信次數分析
如圖6所示,在系統總節點數增加時,通信次數隨著聚類個數的增多而減少.但在聚類次數變大到一定程度時,通信次數沒有明顯的變化,所以在具體節點數目下,可結合容錯性分析,合理選擇聚類次數很有必要.
5.2.3 容錯性分析
對于改進的共識算法,容錯性分析分為代理節點中不存在拜占庭節點及其中存在拜占庭節點的情況.
1)代理節點中不存在拜占庭節點子群中錯誤的節點不超過其子群總數的
若拜占庭節點均勻分布在每個聚類中,則每個則對最終結果不會產生影響,整個系統的容錯為(n-1)/3.
當拜占庭節點集中在某個聚類時,則該代理節點將會產生錯誤輸出,這時在代理共識群中,該結果會被丟棄,該代理節點也會被降級.在這種情況下,系統的容錯為.
2)代理節點中存在拜占庭節點
當代理節點中存在拜占庭節點時,該節點可能會篡改其子群的共識結果,導致該區域的投票結果不正確.如果錯誤的代理節點超過整個系統的,系統會崩潰.否則,系統的容錯為.
綜上所述,代理節點的選取十分重要.本文隨機選取代理節點,未來考慮利用信譽機制及節點間的相互投票,選取更加可信的節點作為代理節點,提高共識效率.
本節采用對比分析的方式,將本文方案與已提出的醫療數據共享方案進行比較,分析模型的優缺點(如表1);另一方面,通過分析目前EHR 共享面臨的問題,分析本模型的應對方法(如表2).

表2 當前EHR 共享面臨的問題及模型應對的方法Table 2 The problems of EHR sharing and how to deal with the model
表1 從7 個方面將本文與現有研究成果進行比較,可以看出本模型有一定的優勢.但本模型仍有需要改進的地方,如可以嘗試利用智能合約使得交易過程自動化等.

表1 不同方案之間的比較Table 1 Comparison between different models
EHR 共享是非常有必要的,不僅使得病人在轉院治療時,病情能夠得到全面、綜合、準確的診斷,避免病人做一些重復的檢查;同時可以增進不同醫院間的交流,促進公共醫療領域的不斷發展.EHR中包含大量病人的隱私信息,在數據共享時需要保護數據隱私及身份隱私.
為了解決目前不同醫療機構間數據互操作性較差,及病人無法掌握EHR 的使用情況等問題,本文提出病人可控的、云鏈協同的安全數據共享方案,利用CP-ABE 方案對EHR 進行加密,防止半可信的云服務器竊聽數據,同時病人可以自主設置訪問策略,達到細粒度的訪問控制.該方案將加密數據進行鏈上、鏈下混合存儲,不僅保證了數據的真實性、完整性及不可篡改性,同時提高了區塊鏈的可擴展性.該方案利用多關鍵詞可搜索加密方案,可提高對密文搜索的準確性和效率.由于用戶的屬性是不斷變化的,因此本文設置屬性更新協議,支持用戶的屬性撤銷和屬性添加.通過將本文方案與其他方案的比較可知,本文方案在一定程度上具有優勢.利用聚類算法,選取代理節點,將各級醫院進行聚類,改進PBFT 共識算法.通過對改進的共識算法進行分析及計算,得出其通信次數有所降低,容錯性有待提高.在未來的工作中,將不斷試驗,考慮何種方法選擇代理節點更加安全高效,減少達成共識的時間,提高數據共享的效率.同時,將嘗試使用零知識證明、同態加密等隱私保護技術進行病人身份及病歷的隱私保護.