紀露生,張桂玲,楊佳潤
(1.天津工業大學計算機科學與技術學院,天津 300387;2.天津市自主智能技術與系統重點實驗室,天津 300387)
大數據、互聯網和5G技術的發展,在為人類帶來發展機遇的同時,也導致大量數據泄露事件的發生,造成嚴重后果。2018年1月,印度10億公民身份數據庫Aadhaar遭到網絡攻擊,該庫除公民基本信息外還有指紋、虹膜等敏感信息。2018年8月,美國醫療收集局(AMCA)遭到黑客入侵,泄露了大量消費者的姓名、電話、余額、信用卡賬戶等重要信息。2019年1月,美國俄勒岡州公共服務部遭到了黑客的電子郵件釣魚攻擊,泄露了大量的客戶社保信息和健康信息。這些重大泄露事件的報道,使人們對個人數據的安全更為擔憂。
新興區塊鏈和智能合約技術[1]可為數據管理提供更好的技術支持,如在醫療數據領域,文獻[2]利用區塊鏈技術實現了個人醫療數據的存取和管理,文獻[3]解決了移動醫療數據的協同共享問題。此外,文獻[4]基于區塊鏈提出一種分布式個人數據和數字身份的聯邦授權框架,文獻[5]利用區塊鏈實現了個人數據分布式隱私保護,文獻[6-7]則從法律角度分析個人網絡數據的所有權問題,為個人數據保護研究提供了新的解決方案。
在個人數據管理方面,研究者基于區塊鏈和智能合約也提出了一些優秀方案。文獻[8]提出一種將區塊鏈作為一個不需要可信第三方機構的訪問控制管理器,并由事務管理權限的機制。文獻[9]為個人建立用戶配置文件和數據/設備,同時為服務提供訪問數據的接口,使用戶可以在服務請求個人數據時設置服務可以訪問的數據/設備及其訪問級別,并授予或拒絕請求的權限。文獻[10]通過設計一個個人元數據管理框架,提出SafeAnswers機制。該機制允許個人收集并存儲自己的元數據,并允許服務詢問根據元數據計算得出答案的問題,從而實現對這些元數據的細粒度訪問。
本文采用鏈下存儲的方式,提出一種基于區塊鏈的匿名地址管理方案,使用開源區塊鏈以太坊(Ethereum)并假設一個誠實可信的資源服務(Resource Service,RS)來共同管理用戶數據。用戶將個人數據的加密地址分享給區塊鏈的智能合約,解密私鑰則分享給RS。該方案通過智能合約建立用戶和第三方服務(Third Party,TP)之間的授權關系,使第三方服務得到用戶授權后才能獲得用戶個人數據的加密地址和訪問令牌,從而實現細粒度訪問控制,達到保護個人數據的目的。
區塊鏈源于比特幣系統[11],是一個點對點的分布式系統,其利用獨特的共識算法[12]和激勵機制鼓勵系統成員維護系統,系統的每一個狀態依靠成員共同決定,而不是依靠某個單一節點,因此,具有偽匿名性、去中心化、不可變性、透明度和安全性高等特點。比特幣系統是目前全球最早也是規模最大的區塊鏈系統,被稱為區塊鏈1.0。之后發展到帶有智能合約[13]的區塊鏈,如以太坊[14]和超級賬本[15],被稱為區塊鏈2.0。由于目前區塊鏈的效率較低,因此研究者提出構建區塊鏈3.0的設想,目標是實現更高性能和更高吞吐量。
以太坊是一個開源且具有智能合約功能的公共區塊鏈平臺,其通過圖靈完備的以太坊虛擬機(Ethereum Virtual Machine,EVM)來處理點對點合約,運行在EVM上的程序稱為智能合約。官方發布的智能合約語言是Solidity,合約部署后發布到鏈上,并被EVM執行其中的代碼程序。智能合約與普通程序的區別在于,其程序發布到區塊鏈上將被作為一個交易記錄永久記錄在塊中,不可更改,這類似于紙質協議,合同雙方簽訂協議后,一經發布則此合同將具有法律效力,不可更改。超級賬本的智能合約支持多種高級語言,運行在Docker容器中。
區塊鏈因具有透明性、不可變性、可追溯性和防篡改等特性被應用于多個領域,如金融、供應鏈和數據資產管理等。在數據資產管理方面,基于區塊鏈的個人數據保護方案大多采用鏈下存儲[16]的方式,即鏈上只保存簡短的訪問地址或路徑。這種以鏈下存儲方式將訪問數據的關鍵路徑或關系存儲在鏈上而將大規模數據存儲在鏈下的方法,構建了一個完整的權限控制生態,使得區塊鏈能夠通過存儲少量數據實現對大量數據的控制,極大地增強了區塊鏈的可擴展性。
2018年,歐盟通過了《一般數據保護條例》(簡稱GDPR),指出了個人數據處理原則,即合法性、公平性、透明性、保密性、完整性和有限控制等。
文獻[17]將數據分為靜態用戶數據和動態使用服務生成的數據兩類,同時從技術角度將區塊鏈分為3層,即智能合約層(用于存儲用戶和第三方服務之間的合約)、接入層(利用區塊鏈不可變性和完整性特點保護隱私)和哈希存儲層(用于存儲數據哈希),旨在構建一個以人為中心且符合GDPR的個人數據和身份管理系統。其中,鏈下數據庫存儲的個人數據使用對稱密鑰加密,對稱密鑰分別被擁有數據的各方持有。該方法存在的主要問題在于:只在第一次授權給第三方服務時是安全的,因為第一次授權之后,第三方服務將擁有個人數據地址和對稱密鑰,通過可解密密文得到完整的個人數據,之后即使撤銷第三方服務對個人數據的訪問,依靠個人數據地址和對稱密鑰其依然可以得到數據;此外,第三方服務也很有可能將地址和對稱密鑰泄露出去,或者將明文泄露出去,造成嚴重的數據泄漏風險。
文獻[18]設計了一個遵循GDPR的個人數據管理系統,其允許數據所有者強制執行數據使用許可,確保只有指定方可以處理個人數據,并使用智能合約和加密技術將所有數據活動記錄在一個不可變的分布式賬本中。該系統采用鏈下存儲方式,將個人元數據的訪問地址以加密的形式存儲在鏈上,第三方服務得到用戶授權之后將被授予訪問令牌并獲得用戶元數據的加密地址,同時得到解密此地址的私鑰。第三方服務使用用戶的個人數據地址和訪問令牌請求資源服務。由于個人數據地址一般情況下是不變的,因此即使用戶撤銷了對第三方服務的訪問權限,但第三方服務仍擁有用戶個人數據地址,利用此地址其仍有可能獲得個人數據,同時該地址也存在泄露風險。
本文給出當前個人數據保護體系的綜合性框架,如圖1所示,用以分析當前基于區塊鏈的個人數據保護方案存在的問題。該架構為一個通用架構,不同的方案采用不同的算法。架構中包含4個實體,分別為用戶(User)、管理用戶數據訪問權限的數據控制者(Data Controler,DC)、想要訪問用戶數據的第三方服務(TP)和管理鏈下數據存儲的資源服務(RS)。

圖1 個人數據保護體系的綜合性框架Fig.1 Comprehensive framework of personal data protection system
如圖1所示,在現有系統架構中,一個TP想要訪問User的數據,需要經過以下4步:
1)TP向User提出訪問其個人數據的請求。
2)User確認授權,將請求發送給DC。
3)DC驗證User和TP身份后,授權TP訪問User的數據,并將授權記錄在鏈上,發送User個人數據的地址或訪問令牌給TP。
4)TP利用訪問令牌或地址訪問資源服務,資源服務驗證后,處理TP請求并返回數據。
在第1步中,TP直接向User發送訪問請求,User確認授權后提交自己的簽名和TP的簽名發送給DC驗證,由DC處理授權,由此可減少DC的負載。在第2步中,若DC驗證TP的身份不合法,則不會通過這一請求,導致授權失敗。因此,TP需要經過DC驗證和授權,在系統中擁有自己的身份。如果TP直接向User發送請求,那么這一步TP身份的合法性就無法進行驗證,只能等到User確認授權后發送給SP時將TP和User的簽名一同發送給DC,再由DC驗證。因此,應先驗證TP身份的合法性。
鏈下數據的存儲大多使用IPFS系統[19],其將數據以文件的形式分散地存儲在系統中,更新文件時重新分配地址。由于是分散存儲,文件被散列在各處,因此只有通過創建文件時分配的地址才能找到分散在各處的文件。若使用傳統數據庫存儲,則一般不能更改存儲路徑和關系。
在圖1的第3步中,TP獲得訪問User數據的權限后,將會獲得User的個人數據地址。在這種情況下,即使User撤銷TP對其數據的訪問權限,數據地址仍然被TP持有,TP仍然有可能繼續訪問到User的數據。
針對上述問題,本文提出一個解決方案,即利用RS處理TP得到授權后分配的加密地址,而不是直接把用戶個人數據地址分配給TP。TP提交數據的加密地址和訪問令牌給RS,由RS處理TP的請求并返回數據。
本文方案中改進的系統架構如圖2所示。

圖2 改進的系統架構Fig.2 Improved system architecture
從C/S模式的角度來分析,服務S幫助User管理其數據,用來處理TP的訪問請求和User的授權,User即數據主體(Data Subject,DS)。此時,服務S可以看作是一個服務于DS和TP的權限控制者(Authority Controller,AC)。如果TP違反協議,它將會被永久地記錄在賬本中。本文假設RS是“honest but curious”,這意味著RS誠實地執行所需的協議,即使它可能對操作后收到的結果感到好奇。利用區塊鏈的偽匿名性,RS被假設成一個只存儲DS身份(以太坊地址)和解密其加密地址私鑰的資源服務,DS匿名提交自己的數據給RS,得到真正的地址,其利用第三方加密軟件對地址進行加密得到其數據地址的加密地址和解密私鑰,原始地址由DS保存,加密地址被分享給AC,解密私鑰被分享給RS。DS的身份和私鑰以一個鍵值或表的形式存儲而不關聯DS的身份和地址。由此,RS沒有配套的加密地址,無法單獨查詢庫中指定用戶的數據,只有TP請求RS訪問DS的數據時,RS根據TP提交的加密地址和訪問令牌(訪問令牌中包含DS的身份)得到DS的身份和加密地址,使用與DS身份關聯的私鑰解密或加密地址才能返回給TP數據。
如圖2所示,在改進的系統架構中,一個TP想要訪問DS的數據,需要經過以下5步:
1)TP向AC提出對DS數據訪問的申請。
2)AC驗證TP身份后向DS發送TP的訪問請求,DS選擇同意或拒絕。
3)AC驗證DS的身份并處理授權,若DS同意授權,則AC發送給TP訪問令牌和加密地址。
4)AC和RS同步訪問令牌。
5)TP將訪問令牌和加密地址作為參數提交給RS,RS驗證令牌并使用解密算法解密地址,根據地址查找數據并返回給TP。
在改進的系統架構中,每個參與的實體都有一個以太坊地址,使用AC、DS、TP在以太坊中的地址id_AC、id_DS、id_TP來代表各個參與實體在系統中的身份。訪問控制列表以細粒度控制方式記錄哪些TP被授權以及被授予的操作和授權期限,其包含已經被授權的TP集合和每個TP的授權狀態(當前被授權的操作和訪問令牌),DS可隨時查看當前已被授權的TP。訪問控制列表的權限被限制為只有DS才能修改,通過更改訪問控制列表中對指定TP的訪問策略可修改或移除TP的權限,DS可以隨時授權、修改和撤銷TP的訪問權限。
在初始階段,DS同意AC管理其個人數據,并將鏈下地址pointer的加密密文enc_pointer分享給AC,將解密密鑰sk_dec分享給RS。AC和DS建立一張可證明授權關系的訪問控制列表A_list,其為address地址類型到A_list的映射,即每個地址都對應一個A_list列表,此表標識DS、AC和TP的關系。TP是一個address地址類型到address=>TP_policy的映射,標識唯一當前DS對應TP的訪問策略。當有TP被授權時,TP加入A_list關系表,由于DS可能授權多個TP訪問權限,因此使用一個集合tps存放已被授權的TP。根據A_lis[tDS].tps可查詢當前授權的TP,通過A_lis[tDS].TP_policy[TP]可查詢當前TP的授權狀態。A_list列表和TP列表結構設計代碼如下:


在struct list中,mflag標識當前AC是否已經請求AC管理其個人數據,tpsflag標識當前已被授權的TP數量,tpsflage標識被授權TP的數量。在struct TP中,tpflag標識當前TP已被授權。
圖3為DS同意授權TP的組件交互時序圖,具體過程如下:1)TP向AC發送訪問DS數據的請求;2)AC詢問DS是否同意授權;3)DS同意并向AC發送授權確認;4)AC收到DS的確認,更新A_list;5)AC發enc_pointer和訪問令牌,授權成功。

圖3 DS授予TP權限的組件交互時序圖Fig.3 Component interaction sequence diagram for DS granting TP permission
算法1為授予TP權限的算法。DS同意授權TP一組權限,需要提交希望授予TP的身份和訪問狀態(CURD)。AC收到授權確認后,首先驗證DS是否已經授權AC管理其數據(第1行);然后確認DS和A_list中的DS相同并查看TP是否已經被授權(第2行和第3行),如果條件成立,則將TP加入tps列表(第4行),更新A_list中TP的授權狀態(第5行~第10行);最后輸出success(第11行)。
算法1授予TP權限的算法


算法2為撤銷TP訪問的算法。在DS輸入想要撤銷的TP后,首先判斷DS是否已授權AC管理其數據(第1行);然后確認DS和A_list中的DS相同(第2行),并遍歷列表,找到TP在tps中的索引,若沒有則返回(第3行),刪除tps列表中的TP和TP的授權列表(第4行~第6行);最后輸出success(第7行)。
算法2撤銷已授權TP的算法

本文實驗基于以太坊平臺,使用remix編譯器的JavaScriptVM環境部署合約,消耗2 145 356 Gas。合約控制臺界面如圖4所示,其中,reqMange為請求合約管理其個人數據的函數,grant和revoc分別為授予和撤銷TP訪問權限的函數。DS請求AC后和授權指定TP訪問權限后的響應分別如圖5和圖6所示。

圖4 合約控制臺界面Fig.4 Contract console interface

圖5 DS請求AC后得到的響應Fig.5 The response after DS requesting AC

圖6 授權指定TP訪問權限后的響應Fig.6 The response after authorizing specified TP access rights
本文使用remix搭建的測試網絡,每次合約的調用時間約為2 s。由于測試網絡節點較少,因此挖礦難度低、出塊時間快。在實際應用中,隨著節點數量增加,如果出塊挖礦難度低,將會導致同時出塊的交易過多,造成阻塞。考慮此因素,當前以太坊主網出塊的平均時間已上調至15.5 s。此外,實際應用中還應考慮挖礦難度、Gas價格和網絡阻塞程度。
通過使用Caliper[20]對合約進行性能測試,共進行2次測試,第1次測試分2輪,每輪500次,第2次測試分3輪,每輪50次,測試結果如表1和表2所示。

表1 合約運行500次的性能測試結果Table 1 Performance test result after contract running 500 times

表2 合約運行50次的性能測試結果Table 2 Performance test result after contract running 50 times
實驗結果表明,兩次測試都執行成功,在運行500次的情況下,延時性能均優于運行50次的情況,且吞吐量比較穩定,保持在10 TPS左右。
在本文系統中,DS和TP是多對多的關系,然而一個TP地址無法對應多個DS的TP_policy。針對該問題,本文通過Solidity語言的mapping制造二級映射:mapping(address=>mapping(address=>TP))。通過使用DS地址所對應TP的TP_policy來唯一標識DS對指定TP的授權。對于DS的身份認證,利用Solidity語言自身的特性msg.sender來保證授權等操作必定由DS發出,而如果使用超級賬本或其他編程語言,則需要編寫身份認證的合約代碼。隨著系統中節點數目的增多,分布式賬本的數量也相應增加,只篡改少量節點的數據無法發起51%攻擊,由此可逐步提高篡改區塊鏈數據的難度。
在現有基于區塊鏈的個人數據保護方案中,存在個人數據地址無法收回的問題。本文提出一種匿名地址管理方案,將個人數據的控制分權,由AC管理加密地址,由RS管理解密私鑰,但雙方都沒有獲得真正的地址,只有在授權TP訪問后,TP提交加密地址給RS并由其解密地址,才能得到真正的地址并執行TP的數據請求,以此實現對個人數據的有效保護。后續將結合區塊鏈3.0的發展趨勢對本文方案進行優化,進一步提高出塊速度和吞吐率。