常源恒,丁有偉,胡孔法
(南京中醫藥大學人工智能與信息技術學院,江蘇南京 210046)
中醫藥是中華文明的瑰寶,近年來隨著大數據技術的發展,中醫藥大數據的管理與應用備受關注[1-2]。中醫藥大數據中包含許多敏感信息,如中醫電子病歷中包含病人私人信息、中醫藥方等敏感數據,一旦發生泄漏,后果不堪設想。當前在中醫藥數據共享方面一般采用中心化的方案,由數據中心集中分配密鑰與權限并存儲所有數據,但這種中心化的數據共享方法存在一定安全隱患,如因數據中心抗攻擊能力不足導致外部攻擊者竊取數據,或因數據中心本身不可信造成數據泄漏等。因此,安全、高效的中醫電子病歷共享方法是中醫藥大數據應用中亟待解決的關鍵問題。
現有的中醫電子病歷大多使用集中化的共享方法[3-4],各級醫院將自己的電子病歷保存在本地數據庫中,但隨著數據規模的增長,對存儲設備、機房空間和管理人員的需求也隨之增長。同時,中心化的共享方法存在某些固有的安全漏洞,如數據庫被破解、內部人員監守自盜等均可能會導致隱私信息泄露,極大地阻礙了中醫藥大數據共享。另外,由于當前中醫藥電子病歷標準尚未統一,各醫療機構的數據格式及屬性存在較大差異,很難使用傳統的數據共享方案。因此,需要設計一種針對非標準化中醫藥電子病歷的數據安全共享方案。
區塊鏈技術是目前的熱門技術之一,作為網絡安全方面的佼佼者,區塊鏈具有去中心化、不可篡改等特性[5],對于交易雙方又具有非對稱加密、多方存證防篡改等安全機制,數據安全性可得到很好的保障[6]。區塊鏈技術目前已成功應用于金融[7-8]、保險、物流[9]、電子票據、醫學[10-12]等領域,但在中醫藥領域的應用較少。目前區塊鏈在中醫藥領域的應用主要是探索其可行性,尚未考慮實際性能問題[13]。如肖麗等[14]提出基于區塊鏈的中醫電子病歷系統,其需要各級醫院配合使用相同電子病歷,但目前各醫院的中醫電子病歷標準并不相同,實際上難以實現。其他相關研究使用完全的去中心化方案[15],如生慧等[16]提出基于聯盟鏈的中醫藥海量異構數據共享方案,使用戶可安全地分享自己的醫療數據,但這種方案并不利于醫療數據監管。從應用角度看,中醫電子病歷需要一種既能保證數據傳輸過程中的安全性,又能滿足衛生部門監管要求的共享方案。
針對上述問題,本文提出一種基于區塊鏈的中醫電子病歷共享方案。該方案結合區塊鏈技術與傳統數據共享的集中管理及中心化方法,將中醫電子病歷用區塊鏈形式存儲在中醫藥大數據中心,并搭建電子病歷共享聯盟鏈以保存共享過程中的請求答復信息。同時,為提高區塊鏈傳輸速度,使用一條額外的區塊鏈側鏈進行數據傳輸,使中醫藥大數據能更好地實現安全共享。
在傳統區塊鏈中,多個陌生節點在區塊鏈中通過共識機制達成信任,每個區塊擁有上個區塊的哈希值用于追溯,是一種去中心化結構,而傳統數據庫是中心化結構。本文將兩者結合,使用中心化的數據中心作為區塊鏈存儲中心,并利用區塊鏈可追溯、防篡改的特性,提出一種中醫電子病歷安全共享方法,即弱中心化方法。該方法包括主側兩條區塊鏈,主鏈的用戶有研究人員、數據中心和各級醫院,用戶加入區塊鏈后,由系統分發唯一標識uID 和密鑰對(uPk,uSk),其中uPk、uSk 分別為用戶的公鑰和私鑰。醫院作為數據所有者,也有唯一的身份標識符hID 以及公鑰hPk 與私鑰hSk。由于區塊鏈的整體效率較低,因此使用一條由數據中心監管的側鏈以提升數據傳輸效率。
區塊鏈主鏈存儲請求數據信息及對于請求的答復信息。在主鏈上,研究人員與各級醫院具有訪問數據中心目錄、發起交易的權限,數據中心具有簽發證書與存儲數據的權限。側鏈用于臨時存儲交易中請求者所請求的數據。數據中心具有完全的權限,包括發送區塊、刪除區塊,而研究人員和各級醫院只有讀取區塊的權限。整體網絡結構如圖1 所示。

Fig.1 Overall network structure圖1 整體網絡結構
在整體框架中,數據中心的各服務器負責完成去中心化的區塊打包排序、分發區塊鏈認證證書等任務,但數據中心對于整體而言依然是網絡結構的中心,負責所有數據的存儲與分發,既具有去中心化的高安全性,又保留了中心化的高性能特征。
假設中醫電子病歷包含總編號、標準化臨床表現、標準化病機、膏方、劑量、備注等屬性,數據中心以區塊鏈形式存儲所有醫院的數據,每30 條數據打包為一個區塊。每個數據區塊的區塊頭包含該區塊內所有電子病歷的Merkle根與上個區塊的哈希,區塊體包含數據內容及其擁有者ID。
由于所有數據都存儲在一條鏈上,為便于查詢每個區塊的大致內容,且數據中心能快速遍歷整條鏈為數據創建目錄,數據目錄格式為列表,用戶可訪問目錄表查詢需要的數據。數據目錄表如表1 所示,其中hID 為醫院ID,num?ber 為數據所在區塊高度。

Table1 Data catalog table表1 數據目錄表
在主鏈上,每次用戶的電子病歷數據訪問請求為一個交易,請求內容包括用戶ID、請求的數據區塊及被請求的醫院ID。如圖2 中的主鏈請求區塊體部分,其中number 為請求數據所在區塊高度。醫院審核后,向區塊鏈廣播一條帶有認證人信息的答復信息,并對該信息進行簽名。答復格式如圖2 中的主鏈答復區塊體部分,其中,uID 為用戶ID,verifier 為認證人,answer 為該次請求的結果。數據中心判斷審核是否通過,如果通過,則數據中心將數據請求人的公鑰加密后發送到側鏈上。

Fig.2 Main chain and side chain blocks圖2 主鏈與側鏈區塊
對于非法請求,如出現所請求的數據與醫院不匹配的情況,除醫院對該請求的答復設置為非法(即將answer 屬性值設為n)外,區塊鏈會將該請求永久存儲,未來該請求者再次請求其他數據時,醫院可查詢該請求者非法請求的數量,酌情考慮對該節點的許可。如果非法數據連續超過5條,則該請求節點會被禁止發送請求。
如圖2 所示,主鏈上的區塊均為用戶請求區塊與醫院對該請求的答復區塊,區塊頭包含上個區塊的哈希,區塊體則是交易具體信息。
若醫院對請求者的認證通過,則數據中心使用請求者的公鑰對授權區塊加密后發送到側鏈上,即側鏈區塊,側鏈區塊經過一定時間后被自動銷毀。
如圖3 所示,用戶通過在數據中心存儲的數據目錄查尋自己所需數據,數據所屬醫院對用戶訪問請求進行審核。如果審核通過,數據中心通過側鏈將數據提供給用戶。

Fig.3 Flow of safe sharing of TCM electronic medical records圖3 中醫電子病歷安全共享流程
數據共享具體流程如下:
(1)用戶加入區塊鏈,區塊鏈向用戶分發證書與密鑰對,若需電子病歷數據,查看數據中心的目錄查詢當前已存儲數據。
(2)查詢到所需數據的區塊高度,用戶將區塊高度number、數據所屬醫院hID 及自身uID 打包為一個請求消息,使用自身的私鑰加密后形成一個區塊,廣播到主鏈上。
(3)醫院接收到該區塊后使用用戶公鑰解密,并對用戶身份進行審核,之后向主鏈發送對該請求的答復信息。答復信息中應包含所請求的數據高度number、請求用戶uID、審核人verifier 及審核結果answer,醫院打包答復信息并使用自身的私鑰加密形成區塊,廣播到主鏈上。
(4)數據中心使用醫院公鑰解密并檢查審核結果,對于審核結果answer 為y 的答復消息中提到的數據高度,遍歷數據區塊鏈找到處在該高度上的區塊,復制區塊內容并使用答復消息中用戶的公鑰加密,發送到側鏈上。
(5)用戶接收從側鏈上發送的區塊,使用自身私鑰解密得到所請求的數據。
(6)經過一定時間后,側鏈上的數據將被自動銷毀,保證非法用戶無法獲得數據,流程結束。
實驗使用計算機1:Intel? Core ?i5-2400 CPU @3.10GHz × 4,Ubuntu 18.04.5 LTS 系統,4GB 內存;計算機2:Intel? Core?i5-4200M CPU @2.50 GHz × 4,Windows7 系統,并使用VMware WorkStation 虛擬機Ubuntu 18.04.5 LTS,均搭建Hyperledger fabric 平臺,版本為1.4.4。數據集為脫敏后近兩年的中醫電子病歷數據,內容包含數據編號、標準化臨床表現、標準化病機、中醫膏方4 個屬性,共有2 665條數據,抽取其中部分數據作為實驗用例。
首先構建網絡,該網絡使用一個排序(order)節點模擬數據中心,具有Org1、Org2 兩個組織,Org1 代表數據中心的內部組織,Org2 代表公有的區塊鏈組織。兩個節點peer0.Org2 和peer1.Org2 模擬醫院與請求數據的研究人員,兩個通道(channel)模擬區塊鏈主鏈與側鏈。然后對每個節點進行存儲私有數據智能合約和請求數據智能合約的安裝與初始化,其中針對存儲數據的背書策略,設定為只能在數據中心組織內部查看其私有內容。在Org1 中存儲中醫電子病歷數據,在Org2 中的研究人員節點peer0 請求該數據,請求處理后order 節點將請求數據發送至channel2 上。
實驗按照不同的總體存儲數據量及每個區塊存儲數據量進行對照實驗,在安全性由區塊鏈進行保障的情況下,主要對其性能進行測試。對于傳統數據庫MySQL,通常研究人員請求某醫院電子病歷數據需要等待的請求及審核時間與使用本文方法相同,二者的時間差值主要體現在發送數據給請求者的傳輸時間,故實驗對傳輸時間進行比較。每組實驗傳輸10 次數據,在實驗過程中,首次對接收者所在組織的錨節點進行傳輸時會產生一定延遲,若對組織的首次傳輸不是該組織的錨節點,則不存在該延遲情況。由于實驗存在偶然性,故每組實驗去除最大值和最小值,對剩余幾次傳輸時間取平均值,得出實驗結果。
首先使用4 個節點構建網絡進行3 組實驗,每組實驗使用不同的單個區塊存儲量,每個區塊分別存儲1/50/60 條數據,總共存儲600~1 800 條數據在側鏈進行傳輸,結果如圖4 所示。由此可見,在節點數不變的情況下,不論區塊鏈中存儲數據總量為多少,每個區塊存儲數據量大小對傳輸時間影響不大,均在一個較穩定的區間內。

Fig.4 Comparison of transmission speed of different total data圖4 不同數據總量傳輸速度對比
同理,使用4 個節點構建網絡進行3 組實驗,控制數據存儲總量分別為600、1 200、1 800 條,每個區塊存儲數據量從1~60 遞增,對比數據傳輸耗時。如圖5 所示,實驗結果表明,在數據總量相同的情況下,隨著區塊內存儲量的增大,傳輸速度逐步增加,但在實際應用過程中,每個區塊僅傳輸一條數據會使得每次傳輸過多區塊,側鏈變得冗雜,不利于接收與銷毀。故在實際應用中,每個區塊傳輸數據量應選擇在20~50 之間。

Fig.5 Comparison of different transmission speeds for different numbers of data stored in each block圖5 每個區塊存儲數據量不同時傳輸速度對比
最后,維持數據總量為1 200 條進行兩組實驗,將節點數量由2 個增加到10 個,如圖6 所示。隨著節點數的增多,數據傳輸效率有小幅增長,這是網絡增大所帶來的必然結果。由于實驗環境限制,本實驗未對大數據量的環境進行測試,因此在小數據量的情況下,本文方案的效果優于傳統方案。

Fig.6 Comparison of transmission speed with different number of nodes圖6 不同節點數傳輸速度對比
本文方案的安全性主要通過區塊鏈進行保障,使用SHA-256 算法保證區塊鏈的不可篡改性,對于一條任意長度的消息,SHA-256 都會生成一條256 位的哈希值,稱為消息指紋。當消息內容出現任何改變,就會使該指紋發生改變。目前對于SHA-256 的破解方法主要是窮舉法,這對于數據有2256種可能的哈希值來說,破解幾乎是不可能的。
對于數據加密,區塊鏈數據加密過程中使用的公鑰和私鑰由加密算法ECDSA(Elliptic Curve Digital Signature Al?gorithm,橢圓曲線數字簽名算法)得出,該算法由私鑰可得出公鑰,但私鑰無法由公鑰逆推。破解橢圓算法除非解決離散對數難題,否則只能在一個巨大的空間內進行暴力破解。ECDSA 算法原理復雜,且具有嚴格的證明過程,本文不再贅述。
對于傳統數據庫結構,假設惡意節點想要竊取數據,惡意攻擊者僅需攻破數據庫本身(數據中心的防火墻)即可獲得數據,且不會存在記錄。而對于本文結構,攻擊者首先需要在實名進入聯盟鏈的情況下攻擊數據中心防火墻,其次要破解使用SHA-256 與ECDSA 算法加密后的區塊鏈。又假設惡意節點是已加入區塊鏈的節點,想要篡改被醫院駁回的請求信息,首先需要破解醫院的私鑰,對駁回信息所在區塊A 的內容進行更改。由于更改了區塊內容,區塊A 的消息指紋發生了改變,惡意節點需要對區塊A的區塊頭進行更改,生成新的消息指紋。又由于區塊鏈中每個區塊都包含上一個區塊的消息指紋,對區塊A 的更改使得A 的下一個區塊發生變化。因此,惡意節點需要對下一個區塊的消息指紋進行更改,之后所有區塊才能成功進行攻擊,這需要極大的算力,幾乎不可能實現。
針對現今中醫藥數據共享方案研究中不能有效保證安全性的問題,本文提出一種基于區塊鏈的弱中心化中醫電子病歷分享方案。該方案使用區塊鏈技術結合傳統方案的中心化結構,可安全存儲中醫藥數據,保留數據共享過程以便于追溯,并使用側鏈提升區塊鏈傳輸效率,在保證較好傳輸性能的同時,還能保證共享過程的安全性,最后通過實驗證明本方案的可行性。但本文未對區塊鏈本身的協議進行更改,未來將會對區塊鏈協議進行針對性地修改,使其符合中醫藥電子病歷數據特性,以期進一步提升方案的傳輸性能。