劉 宇,陳 哲,李孟恒,覃團發
1.廣西大學 計算機與電子信息學院,南寧530004
2.廣西多媒體通信與網絡技術重點實驗室,南寧530004
隨著智能醫療[1]的蓬勃發展,無線體域網被廣泛應用到智能醫療中[2-3],用戶穿戴各式各樣的傳感器設備,這些傳感器會在體域網中相互連通,協助人們完成數據采集、數據加密和數據傳輸等工作。由于采集的數據遍布全身且過于分散,傳統體域網通常采用依賴匯聚節點的星型網絡連接[4-5],在這種連接方式下,一旦匯聚節點被攻破,其中的用戶隱私數據就會泄露甚至被攻擊者篡改,繼而引起醫療上的錯誤診斷。另外,對于暴露在外界的體域網來說,數據通常是在公開信道中進行傳輸的,如果這些數據不加密將會很容易遭到劫持和篡改,因此提高傳感器節點在體域網中的安全性,是當前亟待解決的問題。
為了保護這些與個人隱私相關的生理數據,許多研究者都提出了相關的安全機制,大體上都包含了身份認證和信息加密。文獻[6]提出了利用PUF函數實現會話雙方的雙向認證和秘鑰交換,遺憾的是該方案為了降低執行開銷而放棄了散列函數,使得接收方無法校驗加密信息的完整性。文獻[7]提出利用心電信號來分配傳感器的秘鑰,但前提是所有的傳感器都得檢測到心電信號,這一方法限制了傳感器的位置分布,同時增加了硬件復雜度。文獻[8]提出了一種體域網輕量級協議,該協議能實現傳感器匿名相互認證,然而卻被文獻[9]的研究者發現該協議易受到傳感器節點模擬攻擊和集線器節點欺騙攻擊。針對上述問題,本文提出了一種基于聯盟區塊鏈的體域網信息安全應用,采用IBM貢獻的開源項目Hyperledger Fabric(以下簡稱Hyperledger)搭建聯盟區塊鏈,將用戶身上每一個傳感器都作為區塊鏈節點,通過成員服務提供商(Membership Service Provider,MSP)對節點身份進行管理,只有經過認證的節點才能加入到通道子網中,確保了用戶數據的隱私性,再利用Hyperledger分布式記賬[10]的特點來保證醫療數據不可篡改。針對體域網匯聚節點易受攻擊的問題,本文還提出了一種傳感器節點間安全通信的新方式,將傳感器通信轉移至區塊鏈上,交由區塊鏈節點進行通信,使通信過程更可靠、更安全。
現有的區塊鏈分為公有鏈、聯盟鏈和私有鏈三種。公有鏈是一種全公開的區塊鏈[11],任何區塊鏈節點都可以接入到公有鏈中,其中的交易信息和交易記錄對所有節點都是公開透明的,每一個區塊鏈節點都包含全網的所有交易記錄,且網絡中不存在任何中心化的節點,但因為所有節點都加入到一條鏈上,所以它處理交易的速度很慢,代表網絡有比特幣和以太坊。不同于公有區塊鏈,聯盟鏈并不是全公開的區塊鏈,聯盟鏈通常是由同行業的許多機構共同構成。聯盟鏈有嚴格的身份管理機制,聯盟的數據對外不可見,保證了數據的隱私性。私有鏈則是一種完全封閉的區塊鏈,通常由企業內部搭建而成,權限的管控相比于聯盟鏈來說更為嚴格,因此隱私性相比于前兩者來說更高,交易的處理速度也更快,但相對也更加中心化。通過上述對比,公有鏈公開透明的特點不利于保護體域網用戶的隱私數據,且冗雜龐大的全網交易記錄對于體域網來說是沉重的負擔,過長的交易同步時間也是體域網無法忍受的。私有鏈更加偏向于中心化,適合企業內部搭建使用,而本文需要將用戶的傳感器、不同醫療機構的區塊鏈節點聯系在一起,需要多方機構共同協作,應用部分去中心化的聯盟鏈更為合適,因此本文最終選擇了聯盟區塊鏈作為體域網的應用。
本文采用區塊鏈來管理體域網,分布式的區塊鏈需要達成一個一致的結果,因此需要根據體域網的特點選擇合適的共識算法。區塊鏈目前可以考慮的幾種共識算法里面,工作量證明(Proof of Work,PoW)是最常見的一種[12],它要求參與共識的節點解決復雜難題求出hash值,某一節點找到正確的hash值就可以生成一個新的區塊進行全網廣播,但缺點是解決復雜難題需要很長時間,耗費資源太多,不適合體域網。權益證明(Proof of Stack,PoS)[13]則像是股票一樣,持有股權越多、持有時間越長的節點,它的話語權就越大,通常聯盟區塊鏈節點規模遠不如公有區塊鏈龐大,因此這類節點很有可能最終演化成中心化節點,形成安全隱患。Kafka共識[14]可以接受區塊鏈上少于1/2的節點故障或失效,這對于體域網中有故障風險的傳感器來說十分友好,且耗費資源遠低于PoW和PoS共識算法,因此本文選擇使用Kafka共識。
區塊鏈節點對賬本的更新稱為一次交易,經過哈希函數y=hash(x)對交易內容x加密會生成固定長度的哈希值y,通過y不能反解出x,且不同的x和x'經過哈希后幾乎不可能生成同樣的哈希值y,因此哈希函數非常適合用于檢驗內容x的完整性。在區塊鏈中,每一個區塊都有上一個區塊的哈希值,哈希值包含著區塊中的信息,因而能保證數據難以被篡改。
非對稱加密就是采用公鑰和私鑰進行加解密,私鑰由自己保管,公鑰散發到外部,且公鑰和私鑰是成對存在的,公鑰可以解密私鑰加密的內容,反之私鑰也可以解密公鑰加密的內容。
本文采用橢圓曲線加密算法,該算法是基于橢圓曲線上點群離散對數難題設計的。假設p為大于3的素數,橢圓曲線y2=x3+ax+b,其中a、b為常數且滿足4a3+27b2≠0mod p,P1=(x1,y1)與P2=(x2,y2)是雙曲線上的兩點,O為無窮遠點。定義該橢圓曲線的加法和減法:
其中橫坐標滿足x3=m2-x1-x2,縱坐標滿足-y3=
由上述公式可知橢圓曲線上兩點相加,得到的點仍在橢圓曲線上,因此可以考慮假設兩個點P和Q在橢圓曲線上。在等式kP=P+P+…+P=Q中,已知k和P由加法公式可以很輕松地求出Q,而如果已知P和Q卻很難求出k,因此在本文中k即是簽名所需的私鑰,Q就是分發出去的公鑰。
由于聯盟區塊鏈上的所有操作都需要節點簽名,本文主要把橢圓曲線算法用于身份認證的數字簽名過程當中。假設傳感器節點A要發送一段消息m,將消息經過哈希散列函數處理后生成消息的摘要y=hash(m),傳感器A用自己的私鑰加密消息摘要y并和消息m一起發送給機構節點B,如果機構節點B能用A發布的公鑰解開,則證明消息的來源確實是傳感器節點A,機構節點B再將消息m哈希處理后得到摘要y',若y=y',則說明消息m沒有被篡改過。數字簽名過程如圖1所示。
圖1 數字簽名
本文采用非對稱加密技術進行數字簽名,每個區塊鏈節點可以保證自身的私鑰得到妥善保管,但卻不能保證發布在外面的公鑰沒有被其他節點冒充,因此還需要引入證書來幫助管理公鑰。證書的原理與簽名類似,權威證書頒發機構(Certificate Authority,CA)會在區塊鏈節點的公鑰后加入CA的私鑰簽名形成證書,用以擔保該公鑰的安全性。每一個區塊鏈節點本地還會存有一套CA根證書,根證書上包含CA的公鑰,用以核查頒發的證書是否是經由CA簽名的。證書的安全總是可以由上一級的證書來證明,一直追溯到最上級的根證書,形成一條完整的證書信任鏈,如圖2所示。
圖2 PKI架構
由于采集的數據遍布全身且過于分散,傳統體域網通常采用依賴匯聚節點的星型網絡連接。為了解決匯聚節點易受攻擊的問題,本文不采用傳統體域網的星型網絡連接方式,而是將用戶的每一個傳感器仿真節點都部署到云端服務器,云端采用CentOS 7系統并配置好Hyperledger相關的運行環境,之后就可以部署一個區塊鏈節點,并實現傳感器節點和區塊鏈節點的一一對應。這樣做的好處一是避免了匯聚節點的存儲轉發,降低了匯聚節點一旦被攻破將導致用戶所有數據丟失的風險;再一個是強化了體域網中傳感器的身份管理,當傳感器要獲得合法的區塊鏈節點身份時,會單獨受到更為嚴格的審查,冒充傳感器節點將會變得更加困難。
聯盟區塊鏈是同行業的多個機構一起聯合搭建起來的,因此僅有用戶的傳感器節點是遠遠不夠的,還需要醫療機構、保健機構和康復中心等提供大量的區塊鏈節點。本文的整個區塊鏈網絡節點架構如圖3所示。
本文的聯盟區塊鏈節點分為CA節點、Peer節點和Orderer節點三大類。
(1)CA節點是Certificate Authority證書頒發中心,負責用戶客戶端登記注冊和證書頒發,客戶端在區塊鏈上的任何操作都離不開CA節點頒發的身份證明。
(2)Peer節點又可以細分為背書節點和記賬節點。當客戶端發起交易之前,會先發起交易的提案交由背書節點來模擬執行交易,背書節點是由Peer節點中動態選舉出來的,因此本文選擇將背書的功能交由各類機構和中心的Peer節點來完成,減少傳感器Peer節點的負擔。記賬節點則只是負責同步新的交易到賬本上,所有的Peer節點都可以作為記賬節點,每個Peer節點都維護一份聯盟區塊鏈賬本的副本。
(3)Orderer節點也叫作排序節點,負責給新生成的交易進行排序并廣播給聯盟中的所有區塊鏈Peer節點,通知它們更新自己的賬本副本。
身份管理機制是聯盟區塊鏈相對于公有區塊鏈最獨特的一點,也正是因為有了身份管理機制進而才能實現聯盟準入機制,實現隱私數據對外不可見,這對于脆弱的體域網來說非常重要。本文的身份管理由證書與PKI架構實現,一個傳感器區塊鏈節點的身份注冊過程分為線下和線上兩部分,具體的授予過程如圖4所示。
圖3 區塊鏈網絡節點架構
圖4 身份注冊
用戶在線下憑借身份證明向CA機構申請用戶名和密碼,再在客戶端憑用戶名和密碼在線發送注冊請求;CA機構會在數據庫中標識該用戶名和密碼并返回注冊證書給用戶;用戶憑借注冊證書再向CA申請TLS證書用于連接本聯盟區塊鏈網絡;CA核對數據庫中是否標識了該注冊用戶,如果已標識則返回TLS證書給用戶客戶端。
智能合約[15-16]是一個區塊鏈網絡能否正常運行的核心所在,區塊鏈節點通過身份驗證后就可以申請加入聯盟通道(Channel),第一次創立聯盟通道需要為這個聯盟通道安裝智能合約,智能合約中包含了能實現本文需求的算法。
算法1初始化傳感器節點
1.INPUT user_name&&user_id&&sensor_id
2.IF user_id存在THEN
3. IF sensor_id存在THEN
4. break;
5. ELSE加入新的傳感器節點
6. END IF
7.ELSE創建新用戶&&加入新的傳感器節點
8.END IF
算法1輸入了用戶名、用戶id和傳感器id,通過初始化傳感器節點,可以方便醫療機構節點遍歷所有的用戶及傳感器的信息,并了解到用戶的傳感器活躍狀態。
算法2采集傳感器信息
1.給不同類型的傳感器設定不同的sensor_type
2.監聽用戶傳感器的sensor_data并記錄current_time
3.將信息user_name&&user_id&&sensor_id&&sensor_type&&sensor_data&¤t_time組拼成json
4.IF user_name||user_id||sensor_id不存在THEN
5. break;
6.ELSE將json記入賬本
7.END IF
由于智能合約內部不允許直接調用函數返回本地變量和本地時間,因此算法2是客戶端采集并傳入參數給智能合約記入賬本得以實現的。醫療機構可以通過user_id&&sensor_id查詢到用戶的某個傳感器采集到的信息sensor_data,并且該條信息還記錄了采集的日期和時間,便于醫療機構做數據統計和分析。
算法3生理結果分析
1.IF user_id||sensor_id不存在THEN
2.return;
3.END IF
4.根據user_id和sensor_id查詢該用戶某傳感器的種類sensor_type和采集到的sensor_data數據
5.根據不同的sensor_type執行不同的生理分析函數,以心率傳感器為例:
6.IF sensor_type==heart_rate THEN
7.IF sensor_data<40 THEN
8. 數據分析:用戶心率過緩,易造成大腦供血不足,建議及早就醫
9.ELSE IF sensor_data>160 THEN
10. 數據分析:用戶心動過速,恐有心臟疾病,應避免劇烈運動及早就醫
11.ELSE數據分析:用戶心率正常
12.END IF
13.END IF
當用戶和醫療機構需要分析用戶生理數據時,需要提供user_id和sensor_id,得到傳感器的不同類型sensor_type和數據sensor_data。根據不同的sensor_type,算法3對sensor_data進行不同的處理,并提供不同的數據分析函數。
區塊鏈節點注冊成功之后就擁有了合法身份,并憑借該身份加入聯盟通道。聯盟通道中通常包含用戶的所有傳感器Peer節點和若干個醫療機構的Peer和Orderer節點,節點架構如4.2節所述,這些節點聯合起來形成一個通道子網絡,數據記入賬本就是在這個子網絡中運行智能合約實現的。以傳感器的Peer節點為例,當傳感器在某個時間點需要上傳生理數據時,節點客戶端會發起交易的提案,區塊鏈網絡會根據預先設定好的背書策略選定背書節點;背書節點按照智能合約提供的方法模擬執行,完成后會把背書結果和簽名返回給客戶端;客戶端接收到足夠的背書結果以后,先核查背書結果是否一致,如果一致再將交易提案、背書結果和背書簽名打包成交易信息廣播給網絡中的Orderer排序節點;排序節點收到交易信息后按時間順序生成新的區塊并廣播給通道子網絡中的所有Peer節點,通知它們更新賬本信息。整個流程如圖5所示。
圖5 數據記入賬本
通過上述過程,傳感器節點就可以把采集到的數據寫入到賬本中,并且該數據還會綁定用戶的身份信息和傳感器id等信息,其他機構的Peer節點可以通過用戶的身份信息和傳感器的id在賬本中查詢到用戶的生理數據。同理,其他傳感器Peer節點通過應用程序客戶端也能查詢到該數據,因此可以把傳感器之間的安全通信轉移到區塊鏈上進行。
體域網中對于生理數據的安全性要求非常高。在體域網中數據安全主要指數據的完整性和隱私性。本文通過以下四點來保護用戶的數據:
(1)第3.1節曾提到每一個區塊都記錄有前一個區塊和自身的哈希值,這個哈希值包含了交易的內容,如果交易的內容被篡改了,哈希值會改變,前后區塊就會斷開,這就防止了用戶的生理數據被惡意篡改。
(2)區塊鏈中的每一個Peer節點都會維護一份賬本,整個區塊鏈就形成了分布式記賬,本文采用的Kafka共識可以容忍小于1/2的節點故障,因此僅僅某一個節點惡意篡改賬本上的交易是無法達成區塊鏈大多數節點共識的,這就維護了用戶數據的完整性。
(3)聯盟區塊鏈中的節點都會進行嚴格的身份管理和審查,在此之后才有資格加入聯盟鏈的Channel通道中,該通道是封閉式的,只有加入到通道的節點才能發起交易和記賬,因此用戶的隱私數據對于通道外的節點是不可見的,這在一定程度上保障了用戶數據的隱私性。
(4)在Channel通道中還可以通過私有數據Private Data技術進一步提升用戶數據的隱私安全,存放在Private Data中的數據可以只針對某些機構組織開放,這些組織可以查看到Private Data中的內容,其他的記賬節點只能記錄這些內容的加密hash值用于校對。
本文將聯盟區塊鏈引入體域網,進一步保障了體域網用戶信息的完整性和隱私性。在提高體域網安全性能的同時,也要兼顧體域網的其他特性。由于構成體域網的傳感器大多都是隨身攜帶的,因此體域網對于功耗的要求也十分嚴格,無論采用何種加密算法或是安全機制,體域網功耗都始終是一個繞不開的話題。圖6是本文引入聯盟區塊鏈到體域網后的心率傳感器節點功耗圖。
圖6 心率傳感器節點功耗
圖6的每一個峰值代表傳感器發起一次交易,可以看到傳感器平時處于低功耗的檢測狀態,需要發起交易時消耗的功率也很小,實際情況下也不會在如此短暫的時間內頻繁地發起交易,因此完全符合體域網低功耗的要求。除了對功耗有所要求外,體域網還對傳輸時延有所要求。圖7上面的曲線是一次心率傳感器數據上鏈所需要的時間,下面的曲線是其他區塊鏈節點獲取這次交易內容所需時間。
圖7 交易時延
可以看到,數據上鏈所需要的時延在1.5 s左右,數據查詢的時延在0.25 s左右,相對于現有的體域網來說,數據上鏈所需要的時延較高,如果僅僅是傳感器節點傳輸給機構節點,這個結果尚可以接受,如果是兩個傳感器節點在區塊鏈上相互通信,這個時延還需要降低。通過測試并分析代碼,發現在整個數據上鏈的過程中,交易的背書過程其實很快就完成了,真正耗費了大量時間的是廣播交易結果這一個過程,這也是下一步研究的方向,即考慮如何提高廣播效率。
本文提出了基于聯盟區塊鏈的體域網信息安全應用,通過分布式賬本和區塊的哈希鏈保障了用戶數據的完整性,防止被攻擊者輕易篡改,再通過身份管理和通道子網實現了數據的隔離,一定程度上保護了數據的隱私性,利用私有數據Private Data技術添加查看權限和加密交易結果,進一步維護了用戶數據隱私性。在此基礎上,本文還通過實驗測試了體域網的功耗和時延,論證了該應用是否符合體域網的現實要求。實驗結果表明,該應用可以滿足體域網低功耗的要求,但在傳輸時延上還有待提高,證明了聯盟區塊鏈應用于體域網以改善體域網的安全性是具有可行性的。下一步就是探究如何進一步降低傳感器與傳感器在區塊鏈上通信的傳輸時延。