薛惠丹 李 峰 潘雨青
(江蘇大學計算機科學與通信工程學院 鎮江 212013)
分級診療制度[1]作為我國重要的醫療衛生制度,是合理分配醫療資源、促進基本醫療衛生服務均等化的重要舉措,是深化醫藥衛生體制改革,建立中國特色基本醫療衛生制度的重要內容[2]。隨著國外分級診療模式,尤其“美國模式”、“英國模式”的普遍推廣,以及“互聯網分級診療”中“微醫模式[3]”的出現,使得探索并落地國內特有的分級診療制度,構建“基層首診、雙向轉診、急慢分治、上下聯動[4]”分級診療秩序顯得尤為重要。
在“互聯網+”技術和大數據時代的背景下,數據作為一種價值資源,尤其醫療數據方面,病歷數據作為國家檔案的重要組成部分,是對患者疾病發生、發展、診斷、治療、護理、轉歸等情況的客觀和系統的記錄[5],是反映患者整體醫療過程的完整性證明。
隨著信息化的相對成熟,一些電子病歷系統(EMRS)、醫院信息系統(HIS)、基于醫學數字成像和通信(DICOM)的相關醫療信息化系統相繼出現。雖然解決了部分醫療數據泄漏的問題,但并沒有真正實現病歷數據的共享。其采用的是基于C/S或B/S 的電子醫療信息系統或者基于云存儲的分布式電子醫療信息系統[6~7],實現數據共享的主要途徑是將大量病歷數據于各個醫療機構中心化數據庫存儲及管理。這不可避免會帶來一些問題,于患者來說,其一中心化服務器存儲,在發生醫療糾紛時,數據易于被篡改、泄露且不留痕跡,使其無法追責;其二患者無法持有對數據的真正擁有權,數據的流向無法掌握,喪失了用戶自主權。于醫療機構來說,因醫療機構等級不同、私立公有的影響,在不同醫療機構間的“醫院-社區-患者”信息傳導機制缺乏聯動,造成“數據孤島[8]”現象,使得醫生無法獲取完整的診療歷史,導致無法對患者情況進行全面、準確的分析。所以,如何進行跨機構的數據共享以達到整個病歷數據的全流程追溯是分級診療中“雙向轉診”必須要解決的問題。
而區塊鏈作為一種分布式存儲機制,因其自身鏈式結構和P2P網絡而具有的去中心化、不可篡改及可溯源特性,加上密碼技術保證了數據完整性和可驗證性,為解決數據共享、數據存證、不可篡改等問題提供了一種新的解決思路。
為此,引入區塊鏈技術,針對分級診療制度下目前存在的病歷數據集中存儲、數據易篡改、不可追溯、共享難的問題,本文結合門限秘密共享[9]方案,提出一種面向分級診療的病歷數據共享方法DP-MDSM(Medical Record Data Sharing Method Based on Data Privacy)。用戶作為數據的分享者及擁有者,可以看到數據的整個流程路徑;醫療機構作為數據的請求者,不可以直接獲得數據,只有經過多個醫院共同驗證收集達到一定數量的分片才可以恢復出用戶病歷信息。其中針對數據共享首要存在的安全性問題,設計不同的交易格式,采用非對稱密碼方法使病歷數據以密文在區塊上鏈,以此達到數據的不可篡改以及可溯源性。同時,在保證數據共享的情況下,針對數據共享期間進行的身份驗證以及訪問量大可能造成的數據訪問周期較長的問題,設置區塊鏈驗證節點以承擔部分可驗證計算,保障了信息訪問和共享的高可控性和高可用性。
在區塊鏈技術提供的分布式環境中,存在單點故障或惡意攻擊造成的不誠實節點,所以探討在不可信環境中多節點如何協調工作是研究區塊鏈中數據如何共享的關鍵性問題;同時由于大部分區塊鏈平臺上的數據是對外公開的,任何節點都可以訪問區塊鏈上的數據,容易造成區塊鏈的隱私安全問題,所以如何在保證隱私安全的基礎上進行驗證是密碼學研究熱點問題。秘密分享與Pedersen 承諾是以上兩個問題的可行性解決方案。
秘密分享,一般也稱為(t,n)-門限秘密分享[9],簡單來說,就是用戶A向n個參與方分享一個秘密值s,s被分割為n份,任意t個參與方可以利用他們的分片恢復出秘密值(其中t≤n),但少于t個參與方無法得到與s有關的任何信息,t為門限值。
隨著同態加密的出現,使得分片持有人在密文的情況下對不同分片執行同態計算的結果與不同分片在明文的情況下進行計算之后加密的結果一樣,稱為同態秘密分享[10](HSS)。區塊鏈上互不信任的參與方將區塊鏈中發布的數據內容和交互數據、數據狀態屬性等進行加密,從而在保證數據安全的同時完成對數據的操作。
2018 年,Tsalolui G 等基于此提出了可驗證同態秘密分享(VHSS)的概念[11]。也就是,秘密分發者A將一個聯合計算外包給n個分片持有者,任何人都可以驗證最終的結果是否正確。
以上都主要解決在不可信的環境下,不同群體間如何協同工作的問題,秘密分存的優點在于個別子秘密的泄露不至于引起秘密的泄露,而個別子秘密的損失也不至于影響秘密的恢復。由于其計算復雜性和安全性上的優勢,在數據共享方面有很高的研究價值。
定義Pedersen承諾[12],如式(1):
其中G和H是橢圓曲線上兩個點(階為大素數p的兩個點),r是一個秘密值,v是盲化因子(即來自Fp的隨機數)。
由于離散對數問題的困難性以及橢圓曲線加密體系的特性,只要秘密的分發者A不公布r和v,其他任何人都無法從已計算出的承諾C中得到正確的r和v,在數據的安全性驗證方面有出色的表現。
門限秘密共享和Pedersen 承諾的出現,為分級診療體系的安全性共享及可靠性驗證提供了一種很好的解決思路。
病歷數據作為一種敏感數據,針對集中存儲、數據易篡改、數據追責難、安全共享難的問題,為患者和醫院提供具有高保密性、高可信度和具有驗證功能的數據共享,以此在區塊鏈平臺上提出了面向分級診療制度的病歷數據共享方法DP-MDSM。為了更好地描述整個共享方案,在此以單個患者的病歷數據共享作為一個基本案例,其主要包括一個患者、一定數量的醫院、區塊鏈上的標識節點、驗證節點以及一個醫療機構聯盟服務群組。本方案設計在聯盟鏈基礎上,醫療機構聯盟服務群組主要提供醫院節點加入網絡的認證。而整個共享場景是由若干個基本案例構成。在這個基本案例中,患者作為數據(即秘密)的擁有者,具有對數據分享的自主權,同時作為數據的分發者。醫院作為數據的分片持有者,多個醫院組成的一個信息交流循環體,且每個醫院各自錨定一個帶有自身ID 的標識節點。同時醫院作為數據的請求者,每個患者可以以保密的方式與每個醫院分享自己在某個醫院或多個醫院生成的醫療病歷相關數據,同時可以在不知道明文的情況下進行同態計算,提高了數據的安全性,減少了加解密過程中造成的計算資源浪費。在整個過程中,醫院不可以直接獲得患者的資料,患者擁有對自己信息的相對自主權。在不可信環境下,數據的發送者可能是不誠實的,為了保證數據的正確性和有效性,數據的接收者在接受數據之后,必須首先進行驗證運算,判斷數據是否被誠實計算。一些公開可驗證的計算工作可以放在區塊鏈上的驗證節點進行,即每次交易發送到區塊鏈,首先進行交易中攜帶數據的校驗,只有校驗通過的交易才可以上鏈,以此進行后續步驟的進行,減少醫院和患者服務器計算資源的浪費,提高整個數據訪問期間的時間消耗。
其機制涉及的主要符號及其含義,如表1 所示。

表1 符號定義
3.3.1 交易的構造
一個區塊內交易信息會包含多種類型交易信息,主要由specific部分的交易詳細信息來區分。交易的具體構造,如表2所示。

表2 交易的構造
根據工作流程中不同階段的要求,本機制構造五種不同交易:患者產生驗證密鑰的交易TBvk,患者將秘密進行分割的交易TBscrt,患者對數據加密的交易TBenc,請求者發送請求的交易TBrequest,醫院發送反饋值的交易TBresponse。
將除了specific部分的其余部分算作交易頭,五種交易的結構設計如表3所示。

表3 TBvk,TBsert,TBenc,TBrequest,TBresponse 的構造
3.3.2 工作流程
本案例的主要參與者由一個患者、n個醫院、n個標識節點、一個請求者、多個驗證節點組成。本機制的及其它的復雜案例皆可由本基本案例組合而成。在此部分,患者以用戶相稱。該機制的具體工作流程如下步驟所示。
步驟一:前期準備階段。
1)醫院對節點的標識階段。每一個醫院對標一個區塊鏈標識節點,獲取IDhi以此參與后續秘密分享階段,此過程即為醫院注冊階段。
2)數據格式設置。本方法數據集為結構化數據形成的文書類病歷數據,包括入院記錄、病程記錄、手術文書記錄、出院記錄。原始數據于星際文件系統(IPFS)中存儲,存儲格式為式(2)所示。本地數據庫中存儲原始數據的摘要Ddata及與IPFS的映射關系。針對醫療數據共享中缺乏統一的格式規范,在此設定之后所有的醫療數據以下式所示格式進行初步處理。
其中,D為原始數據,T為時間戳,以便后續數據歸屬權的確認。
用戶注冊。用戶在初次登錄時主動進行注冊,或者在醫院進行初次檢測生成數據檔案時自動進行注冊,以此獲取IDui。
步驟二:初始化階段。也是用戶注冊階段的詳細過程。
1)驗證密鑰的生成。用戶在256-bit的p階大素數域Fp上隨機的選取兩個t-1 次多項式h(x)和f(x),如式(4)和式(5):
其中,α1,α2,…,αt-1,β1,β2,…,βt-1∈Fp。
在Fp中隨機取α0,令α0=core,作為核心秘密,僅由用戶知曉。則Fp上的t次多項式為式(6),作為生成核心分片的主要函數。
接著設計輔助分片相關函數s(x),計算如下所示:
于此同時,生成下式所示的驗證參數集合Gg:
此集合即為驗證密鑰集。其中g是256 位的橢圓曲線生成器。同時用戶將此計算結果打包為交易TBvk,將此交易發送到區塊鏈網絡。
2)分片的生成。從醫院列表中讀取n個標識節點,所以用戶生成的核心分片有n片,取1 ≤i≤n,用戶計算每個標識節點的核心分片及輔助分片,如下式:
為了保證分片傳輸過程中信息被截取造成數據的篡改,涉及到用戶與醫院信息的數據以非對稱加密方式進行數據傳輸。剛生成的分片進行下式所示加密:
并對選取得t次多項式中的核心秘密值core以同樣方式加密進行傳輸。
因此對于上述兩式只有專屬i所對應的醫院標識IDhi擁有的ski才可以將秘密解密。然后分別計算這n個分片的承諾:
將核心分片、輔助分片及其承諾打包,生成交易TBsert,并發送到區塊鏈網絡。
步驟三:對秘密數據的處理階段。也就是醫院對用戶病歷數據的處理階段。用戶病歷數據為Ddata,假設其由j個不同數據組成,對各個數據進行相同的移位處理,得到加密后的數據enc(Ddataj):
其中,core為標識節點驗證階段從用戶處獲取的核心秘密值。將打包進交易TBenc,并將交易發送到區塊鏈網絡。用戶可以不斷地生成秘密值,也就是可以生成交易若干次,以此來分享數據。
步驟四:請求者請求數據及獲得數據階段。至此前期工作基本完成,用戶病歷數據已經上鏈,用戶也給不同醫院分發了不同的分片,同時此過程在鏈上進行了記錄。基于此基礎上,醫院請求訪問用戶數據的整個階段的時序流程圖如圖1所示。

圖1 請求者請求數據時序圖
1)發送數據請求交易。假設一個醫院請求者想要獲取某用戶的病歷數據,使用用戶IDui獲取TBvk,即以此為輸入值,創建一個交易TBrequest,發送到區塊鏈網絡。
2)標識節點生成反饋值。當n個標識節點在區塊鏈上收到這個交易請求后,各個節點根據自身情況,進行反饋值的計算:
接著用請求者公鑰pkh0加密反饋值,并用自身私鑰skhi進行簽名,在此假設請求者為IDh0:
只有請求者擁有的私鑰才可以將秘密解密。接著,計算反饋值的承諾:
將以上計算結果及IDTBvk打包進交易TXresponse,并發送到區塊鏈。
3)對秘密數據的恢復。當請求者收到t個反饋值交易,t為門限值,t≤n且t≥f+1,其中f為惡意節點的數量,以此保證惡意節點無法影響最后的結果的生成。請求者首先使用自己私鑰利用數據對反饋值的完整性進行校驗,接著分別從交易TXresponsei中獲取enc(rspsi),使用IDhi的私鑰skhi對其解密,得到反饋值rspsi。首先對反饋值進行簡單運算:
如果與交易中攜帶的Crspsi相等,說明收到的反饋值rspsi是有效的。如果至少t個反饋值有效,則利用拉格朗日插值公式重構初始化階段提出的t-1次多項式,該計算如下所示:
接著把x=0 代入F(x),計算F(0),求得的結果即為用戶的病歷數據摘要,根據摘要在本地數據庫中獲取與IPFS 的映射關系來獲取用戶的原始病歷數據。
3.3.3 驗證流程
在不可信環境下,每個數據的發送者都很難保證其誠實性,所以在每次接受數據后,首先要進行數據的校驗。校驗過程分為驗證節點的校驗、醫院標識節點的校驗。
1)驗證節點的校驗
針對數據共享期間進行的數據驗證以及訪問量大可能造成的數據訪問周期較長的問題,設置區塊鏈驗證節點以承擔部分可驗證計算。整個驗證流程中驗證節點要進行的驗證主要分為以下幾個部分。
(1)對TBvk的驗證。用戶發送TBvk到區塊鏈網絡中時,為了保證數據分享者沒有進行錯誤計算以及對數據完整性的校驗,進行如下所示驗證。
驗證節點從TBvk中的specific中得到密鑰驗證集Gg,從Fp中選取一個隨機值x0,帶入式(21)中進行初始化階段的重新計算:
以此進行判斷是否滿足三個函數的關系如下式s(x)=h2(x)-f(x)。如果滿足,則證實數據計算正確,該交易TBvk可以上鏈。如果不滿足拒絕上鏈,并反饋一個錯誤位標志給IDui。
(2)對TBsert的驗證。同理用從TBvk中取出的Gg集進行3.3.2節中分片承諾生成的重復運算:
如果=CCserti,=CAserti,則證明用戶進行了誠實計算,可以上鏈。
(3)對TBresponse的校驗。
當接收到從各個節點發送的TXresponsei,驗證節點為保證各個標識節點的誠實性,要進行數據的重新計算。在計算出式(21)的基礎上,利用加密的數據和雙線性映射e,繼續計算:
如果式(22)成立,則說明反饋值是有效的。所以TBresponse可以成功記錄在區塊鏈上。
2)醫院標識節點對分片的校驗。當節點在區塊鏈上看到發送給自己的交易TBsert時,取得specific中的數據,用自己的私鑰skhi解密Ecserti,Ecore得到Cserti,Aserti,core,進行如下計算:
以此判斷與CCserti,與CAserti是否相等。如果相等,說明拿到正確的分片,為后期秘密數據的恢復做準備。n個標識節點分別進行同樣的計算以校驗拿到正確分片。
該套共享機制部署于筆記本電腦和阿里云服務器ECS 上的Hyperledger Fabric[13]平臺上進行測試,并于ECS上利用Docker[14]虛擬化技術搭建節點接入測試的區塊鏈網絡。
電腦配置為Win10 OS,Intel i7-8750H CPU,2.20GHz,16GB memory。測試云服務器硬件環境為4 vCPU,8GB 內存,40GB 硬盤;系統環境為CentOS 8.1 64 位。代碼運行的軟件環境為Docker,版本號型號為17.09。采用Hyperledger Caliper[15]作為性能測試工具。對每個交易的簽名算法使用基于secp256k1 曲線[16]的ECDSA 簽名算法,非對稱加解密采用基于secp256k1 曲線的ECIES 加密算法[17]。方法中承諾和雙線性映射涉及的橢圓曲線點乘運算采用Pairing-Based Cryptography(PBC)Library[18]來計算。
節點部署過程中,首先準備好peer、memsrvc、fabric-ccenv 等相關鏡像的tar 包,通過“docker load-i peer.tar”等命令將tar 包導入到本地docker鏡像庫中,之后進入到docker-compose.yaml所在目錄,執行“docker-compose up-d”將peer 節點和memsrvc容器逐個啟動起來即可。
基礎網絡中共有5個節點,分別為peer和memsrvc 節點。其中peer 節點共同完成區塊生成過程中的通信、共識、區塊生成和校驗等功能。memsrvc為成員管理節點,主要負責節點加入聯盟時提供注冊、身份證書頒發、交易證書頒發等服務。
為了分析在實際應用中DP-MDSM 方法在數據共享流程的時間消耗是否滿足實際應用,在此,使用每一步驟處理的平均時間消耗(Average time consumption)這一指標來進行驗證,采用(3,4)-秘密共享方法部署于測試環境進行實驗。接著測試該方法的部署應用是否滿足區塊鏈網絡性能,主要指標為交易上鏈成功率(Success rate)、節點訪問區塊鏈請求延遲(Request detention)。測試中,將發送率從50到300 TPS來觀察指標的變化情況。
案例包括1個數據分發者,4個秘密共享者(即標識節點),1 個請求者。在DP-MDSM 方法中,交易的大小影響每一步驟處理的平均時間消耗這一性能指標。在此分析不同交易的具體規模。1 個TBvk包含1 個用戶ID 和1 個驗證密鑰集;1 個TBenc包含4 個標識節點ID、4 個加密的核心分片、4 個核心分片承諾和4個輔助分片承諾;1 個TBrequest僅包含一個請求的用戶ID;1 個TBresponse包含1 個請求的用戶ID、1個加密的反饋值和1個反饋值的承諾;而TBscrt涉及到用戶病歷數據的具體大小,所以specific大小不定。不同交易包含的內容不同,造成交易specific的大小不同,如表4所示。

表4 每種交易specific 大小
本實驗中,為了減少用戶與服務器節點的驗證負擔和大量計算浪費,設置區塊鏈驗證節點以承擔部分可驗證計算。在交易被記錄在區塊鏈之前,驗證節點負責驗證該交易中的所有公開可驗證的數據。
由此,針對不同的交易,用交易模擬器模擬產生和發送1000 次交易。在包含驗證過程的情況下,對該機制的不同步驟,每一步驟處理的平均時間消耗如表5所示。

表5 每一步驟的平均處理時間消耗
有無驗證節點存在對處理交易速度的對比圖如圖2 所示。根據圖中數據可知,公開可驗證的數據,如驗證密鑰、分片的承諾、反饋值的承諾,在前三個階段,通過在驗證節點進行驗證確實減少了部分時間消耗。

圖2 有無驗證節點對處理交易速度的對比圖
交易上鏈成功率也就是交易被成功記錄在區塊鏈上的概率。交易上鏈成功率隨交易發送量變化的情況如圖3 所示。根據圖知,交易上鏈成功率隨交易發送量的增多而降低。
節點訪問區塊鏈請求延遲如圖4 所示。整體趨勢上,平均區塊鏈訪問延遲隨交易發送量的增加而增加。根據測試結果可知,平均的訪問延遲設置在2.93s 左右,這個時間完全滿足目前的區塊鏈平臺的處理速度。

圖4 節點訪問區塊鏈請求延遲圖
針對病歷數據中心化存儲帶來數據篡改問題及其在分級診療制度中產生的“數據孤島”問題,本文采用區塊鏈技術作為一種解決方案,基于秘密共享方案與區塊鏈工作原理相契合的基礎上,提出一種面向分級診療的病歷數據共享方法。患者的病歷數據可以以密文的形式存儲在區塊鏈上,且不會被醫院直接查詢可得,任何人可以驗證該密文的正確性,請求者可以獲得真實可驗證的醫療數據。同時為了保證數據的安全性,設計不同的交易格式,采用非對稱密碼方法使病歷數據以密文在區塊上鏈,以此達到數據的不可篡改以及可溯源性。為了減少用戶與服務器節點的驗證負擔,設置區塊鏈驗證節點以承擔部分可驗證計算,保障了信息訪問和共享的高可用性。