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