丁楊軍,錢 鋼
(南京審計大學信息工程學院,江蘇 南京 211815)
電子病歷是醫療數據的重要組成部分,對于提高醫療水平發揮著重要作用。若能將各醫院數據資源共享,實現數據資源間的互聯互通,就能使患者、醫院和科研人員及時掌握病歷信息,幫助患者更好地了解自身健康情況,幫助醫生給出更高質量的診斷結果,給科研人員提供更可靠的數據源從而促進藥品研發。
電子病歷包含了患者用戶的病情以及聯系方式等信息,如果病歷信息被泄露,將會給患者造成嚴重困擾。傳統數據庫往往將患者個人信息和病歷信息都存在本地數據庫中,需要第三方機構對數據庫中信息進行管理。同時由于缺少標準醫療體系,難以實現醫院間的信息共享,造成了各醫院之間“數據孤島”問題,阻礙了醫療行業信息化發展。
區塊鏈作為分布式存儲數據庫,具有去中心化、防篡改和安全性等優勢,區塊中數據公開透明,通過密碼學技術將數據加密處理,區塊鏈中每個節點通過共識算法達成一致,鏈中數據被篡改幾乎不可能,這使得區塊鏈技術非常適合用于存儲電子病歷信息,從而保護電子病歷信息安全和患者用戶個人隱私。
近年來,區塊鏈在醫學領域的研究受到廣泛關注。賀智明提出通過可搜索加密技術用于實現密鑰數據的加密和病歷的密文搜索,并設置匿名性實現患者身份的隱私保護[1]。李藝昕提出了一種結合IPFS系統和區塊鏈技術的分布式醫療數據鏈存儲系統,該方案將病歷索引存儲在區塊鏈中,并將病歷存儲在IPFS分布式存儲系統中[2]。金琳等人針對患者隱私泄露和追責困難等問題,提出多權限屬性隱藏電子病歷共享方案,以期保護患者隱私,提高電子病歷數據共享[3]。Priyanka Kamboj針對醫療數據共享難、病歷信息數據被篡改或泄漏的問題,提出采用適當的訪問控制策略來解決在訪問過程中醫療隱私泄漏問題,并提出數據共享方案,更好地支持醫學研究和精準醫療[4]。王曉麗利用區塊鏈技術,建立電子病歷自主管理與共享、網絡問診以及云藥房的可信安全參考機制[5]。
本文利用區塊鏈技術的去中心化、防篡改和可追溯等優勢,針對電子病歷存證系統存在的數據安全和“數據孤島”問題,利用機器學習中的K-Means 聚類算法和邏輯回歸算法對PBFT 共識算法加以改進。在此基礎上,提出改進PBFT 算法的區塊鏈電子病歷安全存儲方案,可以有效解決電子病歷共享難的問題,充分保障電子病歷信息的安全存儲。
區塊鏈是通過一系列有序區塊連接的分布式共享賬本和數據庫。區塊鏈通過遵循將新區塊認證到區塊鏈中的協議來達成共識,區塊鏈網絡中沒有固定中央節點,網絡中所有節點都存儲區塊鏈信息的副本。區塊鏈中的每個區塊都由哈希值連接,每個區塊包含前一個區塊內容的哈希值,并且將不可逆哈希函數用作鏈接機制以驗證前一個區塊的完整性,此功能保證區塊鏈技術具有防篡改和可追溯的特性[6]。區塊主要由區塊頭和區塊體兩部分組成。區塊鏈網絡可根據網絡范圍分為公有鏈、私有鏈和聯盟鏈[7]。公有鏈允許任何用戶參與,并且沒有身份認證和權限設置,鏈上交易是完全開放和透明的,所有用戶都可以在鏈中獲得完整賬簿,典型的公有鏈平臺包括比特幣和以太坊。聯盟鏈規定只有經批準的成員才能加入,并且通常由多個機構管理,處理速度比公有鏈更快。私有鏈具有集中的所有權和管理權,僅在組織內部使用。醫療場景中的區塊鏈系統需要包含多個醫療機構,患者、醫生和其他用戶相互交互,并且病歷數據只能在醫療體系內訪問。因此,基于區塊鏈的電子病歷存證系統采用聯盟鏈的形式。
電子病歷系統的要求和聯盟鏈特性相契合,故選擇基于聯盟鏈Hyperledger Fabric 環境作為系統開發平臺。正因為研究方案是基于聯盟鏈的區塊鏈,故選擇實用拜占庭容錯(PBFT)算法,PBFT 算法的共識過程分為三個階段:預準備、準備和確認階段。PBFT算法共識過程如圖1所示。

圖1 PBFT算法共識過程圖
PBFT 算法相較于拜占庭算法(BFT)在共識效率方面有一定提高,但仍存在一些問題。①PBFT 算法只適用于節點數目固定的聯盟鏈,當節點數目發生變化時,只能重新啟動系統才能適用于節點數目發生變化后的系統,不適用于動態變化的網絡環境。②在實用拜占庭容錯共識機制中,客戶節點將請求消息發出后,在等待回復消息前一直處于空閑狀態,不執行其他操作,將會造成時間資源浪費。
由上述分析可知,PBFT 共識機制為拜占庭容錯設計了復雜的通信過程,也帶來了較為嚴重的效率問題,而基于區塊鏈的電子病歷系統必須高效。因此,需要將共識機制的優化作為首要任務。針對上述問題,將PBFT共識機制做以下改進:
⑴全國各級醫院之間形成一條聯盟區塊鏈,利用K-Means 聚類算法,當系統中節點數目發生變化時,不再進行整個網絡初始化,即可將節點所屬類型進行自動劃分,從而保證系統動態性;
⑵當節點傳輸數據之后,利用邏輯回歸算法對其所收到的結果預測,利用節點等待時間,根據預測結果提前做出預處理,節省時間成本,提高共識效率。
針對PBFT 算法缺乏動態性問題,采用K-Means算法,在共識過程開始前對節點進行類型初始劃分,初始時聚類中心不是在樣本節點中隨機選擇,而是通過監督者嚴格審查,選取公信度較高的節點為初始聚類中心點。當節點總數發生變化時,再次觸發KMeans 算法對所有節點進行類型劃分,從而無需重新啟動程序,保證了系統能夠正常運轉。選取K-Means算法與區塊鏈模型相結合主要有兩方面原因,一是PBFT 共識算法需要將節點劃分為監督節點、主節點和客戶節點三種類型,當其中的節點離開或有新節點加入時,各類型節點數目將發生變化,需要對節點所屬類型重新劃分;二是K-Means 聚類算法是一種將數據對象根據屬性劃分成不同簇,使簇內對象相似度盡可能高,各簇之間相似度盡可能小的算法,算法簡單容易理解,被廣泛應用于用戶分群中。
2.1.1 節點數目固定的節點類型劃分
節點需要被劃分成監督節點、主節點和客戶節點三種類型,但在共識過程前,所有節點都為普通節點,沒有任何職責。因此,需要通過K-Means 聚類算法來實現節點劃分。
由于節點需要劃分為三種不同類型,故聚類算法中K的取值應為3。對節點劃分過程如下。
⑴所有節點集合為Sn,Sn={(x1,y1),(x2,y2)…(xn,yn)},其中n為節點總數,每個節點包含兩個屬性,即節點對所要成為的類型期望值x和節點自身所擁有的資源y,從Sn 中由監督者嚴格審查并選取公信度較高的三個節點作為三個簇的聚類中心。
⑵采用歐式距離求得其余各節點到三個聚類中心的距離。
⑶根據求得的距離,將各節點劃分到距離本身最近的聚類中心所屬類別中,并對每一類所有結點求均值,得到新的聚類中心。
⑷重復步驟⑵和⑶,若聚類中心節點不再發生變化,將停止迭代,完成節點類型劃分;否則,將不斷迭代。
2.1.2 節點數目變化后的節點類型劃分
為保證系統具有動態性,利用K-Means 聚類算法完成初始節點的分類,并當節點總數發生變化時,再次啟動K-Means 聚類算法,從而適應在共識過程中節點總數發生變化的系統網絡,確保系統無需重啟即可正常運行。當節點數目發生變化時,聚類中心K 的取值應變為4。因為在之前共識過程中,存在部分節點為惡意節點,惡意節點的不誠實行為將被記錄到特征指標中,再次進行聚類時,這些節點會被劃分為惡意節點,最終將變化后的節點集合劃分為惡意節點、監督節點、主節點和客戶節點。系統存在節點加入和節點離開兩種情況。當新節點加入時,新節點提供真實信息后,將自己所要成為的類型期望值和自身資源以數據對(x,y)的形式加入到節點集合Sn 中,再次觸發K-Means 聚類算法,按照節點類型的劃分步驟完成節點類型的再劃分。當節點離開時,將要離開的節點從集合Sn 中取出,再通過K-Means 算法對取出離開節點后的節點集合按照節點劃分步驟來分類,最終完成節點類型劃分。
在共識過程中,客戶節點每次發出請求消息后,直到接收到監督消息這段時間一直處于空閑等待狀態,節點自身資源未被充分利用,如圖2所示。在客戶節點發出請求消息后,可利用等待驗證消息的時間,從而減少資源浪費。由于邏輯回歸算法預測結果只有通過和不通過兩種情況,故采用邏輯回歸算法對驗證通過概率加以預測,根據預測結果判斷是否提前生產區塊,從而減少區塊的生產時間。當預測結果通過時,在未收到監督節點消息前提前生產區塊,當收到Ns/2+1 個包含Y 的監督節點消息后,直接將提前生產的數據區塊上鏈,從而完成數據區塊的上鏈操作,如圖3 所示。當預測結果不通過時,只能等待接收到Ns/2+1 個包含Y 的監督節點消息后才可上鏈,其自身資源只有在預測時被充分利用,如圖4所示。

圖2 PBFT算法中客戶節點的時間使用劃分

圖3 PBFT改進算法預測通過時客戶節點的時間使用劃分

圖4 PBFT改進算法預測不通過時客戶節點的時間使用劃分
⑴動態性分析
PBFT 算法本身不具有動態性,當參與共識過程的節點數目發生變化時,系統需重新啟動,否則系統無法正常運行。針對此問題,提出利用K-Means 聚類算法來保證系統的動態性。在共識過程開始之前,將K-Means 算法啟動,根據系統中節點特征對節點進行劃分,將節點劃分為主節點、客戶節點和監督節點,不同節點對應不同的職責,共同完成共識過程。當系統中節點數目發生變化時,共識過程將暫停,再次執行K-Means 算法對所有節點再次劃分,將節點劃分完成后,即可進行共識過程,不再需要重新啟動整個系統,只需要將共識過程暫停一下即可完成。
⑵安全性分析
在共識過程前,節點分類是按照節點的特征指標進行分類,其中K-Means 聚類算法中的K 值為3。當完成至少一次共識過程后,K 的取值將變為4。因此,當節點數目發生變化時,再對所有節點進行類型劃分時,由于可能存在惡意節點,第四類為在共識過程中存在不誠實行為的節點或者為不滿足其他類型分類依據的節點,這種節點將不可以參加接下來的共識過程。采用此方法,將系統中存在的惡意節點進行剔除,可以有效避免一些不安全因素,從而可保證系統的安全性。
在改進的實用拜占庭共識算法中,當客戶節點將請求信息發送后,會執行邏輯回歸算法預測是否請求通過。在預測過程中,每次的預測模型都會發生改變,隨著共識次數增加,模型會逐漸適用于系統環境,預測結果會更準確,提前生產的數據區塊也會更正確,可以在一定程度上避免共識過程中惡意節點對數據的篡改,從而保障數據安全性。
本文設計并開發一種基于改進拜占庭容錯算法的區塊鏈電子病歷存證系統,此系統可以解決數據安全和共享問題。系統前端采用Vue.js 框架并結合Element UI 組件,后端使用Spring Boot 框架,區塊鏈網絡部分使用Hyperledger Fabric 框架,使用Java語言完成了本系統設計與實現。該系統將用戶分為四種角色,分別為患者、醫生、科室管理員和醫院管理員。患者具有掛號預約、預約信息查看以及病歷信息查看等功能;醫生具有對患者預約信息查看、診斷治療和病歷信息查看等功能;科室負責對醫生信息管理;醫院負責對科室信息管理。
本系統的總體架構體系為B/S 架構,將架構分為三層,分別為瀏覽器客戶端、Web 服務端和資源服務器,系統總體架構圖如圖5所示。

圖5 系統架構設計圖
在基于區塊鏈的電子醫療系統中,用戶登錄和注冊功能需要通過智能合約來完成。在智能合約設計中,對用戶登錄模塊函數和注冊模塊函數分別進行設計,以用戶私鑰和用戶所屬類型作為用戶登錄信息,實現了用戶賬號注冊登陸。在登錄本系統時,輸入用戶私鑰、選擇登錄身份,將注冊信息傳遞給后臺服務器,通過web3.js庫調用智能合約來判斷用戶是否存在且可用。若用戶存在且可用,則登錄成功;否則提示重新輸入密鑰。在用戶注冊時,由于醫生、科室和醫院角色的特殊性,不能隨意注冊,所以在智能合約中,規定醫生由科室進行添加,科室賬戶由醫院來添加。系統界面如圖6所示。

圖6 系統界面圖
在系統登錄界面以患者身份登錄成功后,可用以下幾個模塊功能:醫生預約、預約信息、病歷信息。患者查看病歷信息的主要過程如下:
⑴根據用戶以太坊地址address 查詢用戶的所有病例信息,根據病例創建時間選擇要查詢的病例信息。
⑵根據病例的Hash 值向區塊發起查詢請求,返回該Hash值的交易詳情。
⑶將返回交易詳情的字段從二進制轉換成字符串,顯示內容為病例的詳細信息。
在系統登錄頁面以醫生身份進入系統后,可用預約信息、病歷信息和個人信息三個功能模塊。醫生填寫病歷信息并存儲在區塊鏈中,這是基于區塊鏈電子病歷存證系統的重要技術,通過智能合約將電子病歷保存在區塊鏈上,其中患者病歷和合約交易產生的Hash值都以字母的形式在區塊鏈中保存。
智能合約的編寫用Solidity語言來完成,通過哈希算法計算每個病歷哈希值并通過AES 對稱加密算法對要保存的數據進行加密,通過web3.js來調用智能合約將加密后的數據進行合約保存,然后對合約進行編譯和部署,將加密數據存儲在區塊鏈中,防止數據在傳輸過程中泄露。病歷信息的存儲流程如圖7所示。

圖7 病歷信息存儲流程圖
醫生創建病歷時通過密鑰對病歷信息進行加密,形成密文,經網絡傳輸,密文發送給患者,患者通過密鑰對密文進行解密從而得到病歷信息。AES 加密算法流程如圖8所示。

圖8 AES對稱加密流程
本文根據電子病歷系統安全性能需求,并結合區塊鏈技術防篡改、匿名性和安全性等優勢,將區塊鏈技術應用于電子病歷存證系統的開發中。基于區塊鏈的電子病歷系統解決了傳統電子病歷系統的醫療數據安全與隱私保護問題。共識機制是保障區塊鏈中各節點狀態達成一致的重要環節,防止區塊鏈中任何單個實體控制或破壞整個區塊鏈系統,對區塊鏈系統的正常運轉起到了至關重要的作用。本文針對PBFT 共識算法存在的缺少動態性和共識效率低的問題,提出了基于機器學習的拜占庭容錯共識機制。與傳統電子病歷系統相比,基于改進拜占庭容錯算法的區塊鏈電子病歷系統使醫療數據更加安全可靠,方便患者用戶跨醫院看病,對于提高醫療服務質量具有重大現實意義。