鄧小鴻,朱年紅,黃 磊,王智強,王俊彬
1.江西理工大學 應用科學學院,江西 贛州341000
2.江西理工大學 信息工程學院,江西 贛州341000
互聯網和移動應用的飛速發展,產生了大量涉及各行各業的應用系統,人們越來越習慣通過計算機或移動設備享受社交、理財、購物等應用系統帶來的便利。通常情況下,人們需要進行虛擬身份登錄以便獲取所需的服務。然而隨著系統應用的多元化發展,人們在每一個系統登記的獨立身份信息越來越多,并且為了安全性考慮,很多系統要求用戶設置的密碼越來越復雜,造成記憶難度增大。越來越多的身份信息意味著管理難度增大,維護成本增加,忘記或者遺失身份信息給人們造成較大的困擾。因此,對用戶在不同系統留下的身份信息進行安全管理具有重要意義。
現有的身份管理都在中心化存儲環境下,用戶的密碼經哈希加密存儲在系統對應的中心化數據庫中,登錄的時候將用戶提供的密碼哈希加密之后再與數據庫中的數據比對登錄。這種身份托管機制在實際應用中面臨以下幾個問題:(1)用戶數據由服務器完全掌控,服務器出現問題將導致用戶數據丟失;(2)各個系統的信息形成數據孤島,難以交互,且有中心化系統帶來的數據泄露風險;(3)同一個用戶在登錄不同系統的時候都需要進行繁瑣的賬號密碼驗證過程,不同的應用系統都需要為此維護一個用戶賬號數據庫,對中心化數據庫的頻繁訪問,加大了數據泄露的風險和運維成本。為了解決同一個用戶登錄不同應用系統需要進行多次身份驗證的問題,研究者們提出使用一個通用賬號來登錄不同系統。Lin[1]提出了一種基于Chebyshev混沌映射的獨立多服務器動態ID認證方案,該方案不依賴于注冊中心的存在,每個用戶只需要保留一個密碼即可訪問不同服務器的資源,適用于不可信多服務器環境。在同一域中,單點登錄是另外一種登錄方案,能夠實現在多個系統中,用戶登錄一次便可以訪問所有互相信任的應用系統,這種方式一般使用共享Cookie或Session的方式來實現。例如黃琛等人[2]提出一種兼容多種身份認證的Web單點登錄方案,利用ticket代理技術實現兼容多認證方式,并基于證書鏈信任關系建立認證信任鏈以實現跨域范圍的單點登錄,具備高強度的安全性。李小標等人[3]則基于公鑰基礎設施(Public Key Infrastructure,PKI)和權限管理基礎設施(Privilege Management Infrastructure,PMI),服務端以中間件的方式實現認證、鑒權、審計功能,客戶端采用安全cookie、共享內存與ticket技術實現跨域單點登錄,解決了多模式應用的單點登錄問題。這樣的登錄驗證方案可以實現一個賬號登錄多個系統,但是沒有辦法同步賬號附帶的信息。由于缺少一個安全的賬號密碼存儲系統,如果一個系統的密碼被破解,那么其他所有使用同一賬號的身份信息泄露,存在重大安全隱患。而且使用一個賬號登錄不同的系統,需要對現有不同的系統進行重構,工作量巨大,而且這種方式不能夠存儲用戶的喜好以及在不同系統的附屬信息。
區塊鏈技術是一種去中心化的密碼學安全的分布式存儲技術。區塊鏈為許多傳統行業帶來新的應用模式。隨著近年來越來越多基于區塊鏈的應用落地,區塊鏈已經成為和人工智能、物聯網等并肩的前沿技術。錢衛寧等人[4]針對區塊鏈在可信數據管理方面的研究表明,區塊鏈滿足可信數據管理的要求,能為可信數據管理提供一種新的方法。區塊鏈天然的不可篡改、分布式等特性,能夠滿足身份信息的安全存儲要求。因此,本文提出一種基于區塊鏈的身份托管模型。模型使用區塊鏈的分布式存儲方案解決了單點失效帶來的安全隱患,并使用橢圓曲線簽名算法來進行登錄驗證、接管賬號登錄和存儲業務,有效解決了中心化身份認證存在的問題,并方便用戶管理諸多密碼和便捷地進行相關系統登錄驗證。
區塊鏈是一種典型的鏈式結構,其數據存儲在首尾相連的區塊中,其存儲結果如圖1所示。區塊通常包含區塊頭和區塊體兩部分。以比特幣[5]為例,區塊頭中存儲了上一個區塊的哈希值、版本號、時間戳、交易指紋、挖礦的難度系數和一個隨機數,區塊體中存儲著交易的詳細信息,所有的交易以Merkle樹(一種哈希二叉樹)的結構存儲。這種結構將同一時間段內的交易按順序排列,每兩筆交易串聯進行哈希計算得到父節點哈希值,以此類推,最終在樹的頂點處得到這一時間段內所有交易的數字指紋,將其存儲至區塊頭,在現有的區塊鏈架構體系中大多保留了這種交易存儲結構。區塊鏈網絡中的每一個網絡節點都存儲有完全相同的一份交易數據,這些交易數據與區塊鏈當前的狀態和歷史記錄被存儲在LevelDB、CouchDB等鍵值數據庫中。
圖1 區塊鏈存儲結構
智能合約的概念最早于1995年由學者Szabo[6]提出。智能合約是由參與方共同制定、嚴格遵守,并在計算機上運行的一串二進制代碼,最初是設計用來在沒有可信第三方情況下,保證事先定義好的合約條款,以計算機程序的形式如約運行。受限于當時計算機技術發展緩慢,智能合約難以找到足夠安全可靠的運行環境,因而沒有得到進一步的發展。比特幣系統的出現,帶動了區塊鏈技術的發展,而智能合約在區塊鏈的實現促進了區塊鏈在各種場景的應用。智能合約的實現,本質上是通過賦予對象(如資產、市場、系統、行為等)數字特性,即將對象程序化并部署在區塊鏈上,成為全網共享的資源,再通過外部事件觸發合約的自動生成與執行,進而改變區塊鏈網絡中數字對象的狀態(如分配、轉移)和數值[7]。歐陽麗煒等人[8]提出了由基礎設施層、合約層、運維層、智能層、表現層和應用層組成的智能合約基礎模型,很好地歸納了智能合約的特點。Christidis等人[9]對智能合約在物聯網方向應用的研究表明,區塊鏈和物聯網通過智能合約融合,可以在多個行業實現重大變革轉換,為新的業務模型和新穎的分布式應用鋪平了道路。以太坊是最早支持智能合約部署的區塊鏈架構之一。Cruz等人[10]提出一個智能合約實現的基于角色的訪問控制,使用區塊鏈標識訪問控制中的信任和認可關系,在以太坊智能合約平臺已經構建實現。同樣的還有張帥等人[11]在以太坊智能合約平臺部署的眾籌智能合約,實現了眾籌項目的自治化和可靠性,而且提高了項目可信性和公信力。圖2給出了智能合約的工作原理,在區塊鏈網絡中,智能合約在每個節點的一個獨立空間運行,智能合約負責區塊鏈網絡的權限控制,對區塊鏈數據的存儲,以及對數據的訪問,只有滿足智能合約的條款才能對數據進行操作。另外,智能合約也是區塊鏈網絡與外界交互的接口,一般提供區塊鏈內部訪問SDK等,便于用戶獲取鏈上數據。
圖2 智能合約原理圖
RSA是目前應用最普遍也是最經典的非對稱加密算法,在智能卡遠程口令認證[12]、電子現金[13]等領域被廣泛使用。RSA算法的安全性由對極大整數做因數分解的難度來決定。一般來說,只要RSA算法的密鑰足夠長,那么用RSA算法加密的信息是無法被破解的,與此同時密鑰過長帶來的問題是加密計算量過大,導致速度慢。
橢圓曲線加密算法(Elliptic Curve Cryptography,ECC)被認為是RSA的替代算法,因其更高的安全性,更短的密鑰長度,所以具有更高的安全強度,例如160位ECC與1 024位RSA、DSA有相同的安全強度,同時計算量小,私鑰處理速度快,存儲空間占用小,適用于內存受限的設備[14]。這些優點使得ECC具有廣闊的應用前景。比特幣底層的區塊鏈就使用了ECC算法來生成密鑰,現在大多的區塊鏈架構如Hyperledger Fabric等也將ECC算法用于背書簽名等場景。非對稱加密的解密過程通常計算量大,橢圓曲線算法本就比RSA算法計算量小,而一些資源受限的物聯網設備,計算能力通常有限,Lara-Nino等人[15]提出ECC算法的輕量化標準,并確定了實際應用解決方案,使其可以更好地在物聯網小型設備上工作。
本文使用橢圓曲線數字簽名算法(Elliptic Curve Digital Signature Algorithm,ECDSA)來實現登錄驗證。設公鑰、私鑰為Pk、Sk,對明文M進行橢圓曲線簽名,算法流程如圖3所示。
圖3 橢圓曲線簽名算法流程
發送方對明文信息簽名,過程如下:
(1)使用SHA算法生成明文M的消息摘要H(M);
(2)使用私鑰對消息摘要H(M)簽名,得到簽名結果為一對大整數S(r,s);
(3)將明文M和簽名結果S(r,s)發送到接收方。
接收方對簽名進行驗證,過程如下:
(1)對明文M進行哈希運算得到H1(M);
(2)使用發送方的公鑰Pk對簽名S(r,s)進行驗證,得到哈希值H2(M);
(3)若H2(M)=H1(M),則簽名驗證成功,即證明明文M屬于發送方,否則驗證失敗。
基于區塊鏈的賬號托管模型,主要由賬號存儲系統和身份驗證兩部分構成,分別解決身份存儲管理和身份認證兩個關鍵問題。其中賬號存儲系統使用區塊鏈搭建,身份驗證采用橢圓曲線簽名算法實現。
根據區塊鏈應用的基本框架,結合身份托管的流程,設計了基于區塊鏈的身份托管原型系統,其結構如圖4所示。
(1)應用層和合約層的交互
圖4 身份托管系統結構
用戶在應用層對身份信息進行非對稱加密簽名,將簽名發到區塊鏈。智能合約提供身份上鏈服務,將簽名信息保存到區塊鏈。在用戶登錄的時候,合約使用公鑰對簽名信息進行驗證,返回結果。同時,智能合約還負責區塊鏈上所有的數據狀態監控和管理,將狀態改變和交易背書信息記錄在賬本中。
(2)共識層
分布式系統節點眾多,決策權分散,難以達成共識,區塊鏈中的共識層解決了這一問題。在身份托管系統中,應用層和合約層是業務處理核心,負責將身份信息正確地傳到區塊鏈中,而共識層將這些身份信息按照共識算法進行統一,依次打包同步到區塊鏈網絡中的所有分布式節點中,保證數據的一致性。
(3)數據層
在身份托管系統中,每一組身份信息存儲在區塊鏈中被視為一筆交易,按照時間順序存儲在賬本數據庫中。每一定量的交易被打包成一個區塊,鏈接到前一區塊,由此形成一條記錄歷史數據的完整區塊鏈,不可篡改且可追溯。
(4)網絡層
區塊鏈中每一個節點都是平等的,因而節點間通信采用對等網絡(Peer to Peer network,P2P網絡),以扁平式拓撲結構相互連通,不存在中心化的特殊節點。P2P網絡使用的是Gossip數據分發協議,能夠優化區塊鏈網絡性能,滿足區塊鏈網絡安全可靠、可擴展的要求,并且保證數據分發的完整性和一致性。在身份托管系統中,網絡層保障節點間的共識通信和數據分發。
身份信息區塊鏈存儲結構如圖5所示。
圖5 區塊鏈身份存儲結構
其中每一組身份數據均至少包含表1所示的三部分。
表1 身份信息區塊鏈存儲結構
在身份托管系統中,交易ID被用來查找一組唯一的身份信息,對應一個系統唯一的一個用戶身份。身份信息是存儲在區塊鏈中的一個用戶身份明文信息,用來與公鑰對簽名驗證的結果進行比對來確認用戶的身份。簽名信息是使用非對稱加密對一組身份信息的簽名結果信息,用戶登錄系統使用公鑰對其進行驗證。
本模型涉及到的區塊鏈賬本操作均通過智能合約完成。智能合約主要完成兩部分功能:身份信息上鏈和身份信息驗證。
身份信息上鏈的智能合約如下所示:
Input:(1)Username(用戶名);(2)Password(密碼);(3)Sys-Token(系統標識);(4)Signature(簽名結果);(5)Operation(合約操作符)
Output:(1)InvokeResult(合約調用結果)
1.InputData←PackageInfo(Username,Password,SysToken,Signature);//打包所有準備上鏈的信息為固定格式
2.ArgsValidation←CheckArgs(InputData);//檢查參數函數,返回檢查結果
3.IdentifyToken←GenerateIdentifyToken(Username,Sys-Token);//將用戶名和系統標識整合為一條身份標識
4.Function ChaincodeInvoke(Operation,InputData);//開始調用合約
5.if Operation=Storage;//合約操作確定為存儲操作
6. ArgsValidation=CheckArgs(InputData);//先檢查用戶名、簽名等信息的合法性
7. if ArgsValidation=True:
8. StorageAccount(IdentifyToken,InputData);//以[身份標識:賬號信息]鍵值對存儲到區塊鏈
9. Return InvokeResult←上鏈成功;
10. else;
11. Return InvokeResult←上鏈失敗;
12. end if
13.end if
身份驗證智能合約如下所示:
Input:(1)Username(用戶名);(2)SysToken(系統標識);(3)PublicKey(公鑰);(4)Operation(合約操作符)
Output:(1)InvokeResult(登錄驗證結果)
1.ArgsValidation←CheckArgs(InputData);//檢查參數函數,返回檢查結果
2.IdentifyToken←GenerateIdentifyToken(Username,Sys-Token);//將用戶名和系統標識整合為一條身份標識
3.Username,SysToken,PublicKey←SeparateArgs(Input-Data);//驗證參數拆解函數
4.HashData←Hash(Password);//哈希加密函數
5.DecryptoData←Decrypto(PublicKey,Signature);//公鑰驗證簽名返回結果
6.Function ChaincodeInvoke(Operation,InputData);//開始調用合約
7.if Operation=Verify;//合約操作確定為驗證操作
8. ArgsValidation=CheckArgs(InputData);
9. if ArgsValidation=True;
10. Username,SysToken,PublicKey=SeparateArgs(InputData);//拆解參數得到用戶名、系統標識和簽名
11. IdentifyToken=GenerateIdentifyToken(Username,SysToken);
12. Password,Signature=QueryData(IdentifyToken);//從區塊鏈查詢身份和簽名信息
13. HashData=Hash(Password);
14. DecryptoData=Decrypto(PublicKey,Signature);
15. if HashData=DecryptoData;
16. Return InvokeResult←驗證成功;
17. else;
18. Return InvokeResult←驗證失敗;
19. end if
20. end if
21.end if
為了測試所提出基于區塊鏈身份托管模型的可行性,使用Hyperledger Fabric聯盟鏈架構搭建賬號存儲系統,使用橢圓曲線簽名模擬驗證登錄,設計并實現了一個基于區塊鏈的身份托管系統。實驗思路為:將用戶在不同應用系統的多個賬號使用橢圓曲線簽名存儲在區塊鏈中,在登錄應用系統時,區塊鏈網絡通過使用用戶提供的公鑰來檢驗簽名的合法性,并將檢驗結果返回給應用系統,以此實現用戶的登錄驗證。實驗機器配置為系統macOS10.14.5,處理器1.8 GHz Intel Core i5,內存8 GB,1 600 MHz DDR3。實驗環境為Hyperledger Fabric1.4。使用Golang編程語言完成橢圓曲線簽名和智能合約驗證算法。
在局域網中模擬6個區塊鏈節點,代表6個不同的組織,同一組織下有若干應用系統,以初始兩個組織為例進行說明,設計組織架構如表2所示。
表2 區塊鏈組織
組織中包含的初始節點如表3所示,每個組織各包含兩個初始節點,分別為主節點、備份節點。主節點兼背書節點,對區塊鏈上的每一筆交易進行背書。新增加的節點通過CA服務器發布證書,連接區塊鏈網絡。
表3 區塊鏈節點
設定好組織和節點之后,創建配置文件,寫入創始塊配置和賬本配置,然后根據配置文件生成系統組織架構。區塊鏈的第一個區塊稱為創始塊,Hyperledger Fabric中的第一個區塊是需要手動生成的,因此需要定義一個配置文件來寫入初始配置信息,并由此生成創始塊。準備證書和創始塊完畢之后,就可以啟動節點了,然后安裝智能合約到節點中。所有的操作通過Hyperledger Fabric提供的5個模塊命令cryptogen、peer、orderer、configtxgen、configtxlator來完成。
身份信息上鏈過程如圖6所示。假設某用戶在應用系統System1中的賬號是“znh”,密碼是“ZHU1234567#”,在應用系統System2中的賬號是“zhu01”,密碼是“pick987456”,使用該用戶的一對密鑰對密碼簽名并存儲到區塊鏈系統。
圖6 身份信息上鏈
(1)用戶獲取密鑰對
通過Golang提供的ecdsa包編寫密鑰生成程序模擬密鑰分發機構,獲得一對公鑰和私鑰,并將它們使用pem編碼分別保存在公私鑰文件中,由用戶保存到磁盤,內容如下。
私鑰:
-----BEGIN ecdsa private key-----
MHcCAQEEIKDKHMK7rxKeM6MJLdtM7K21SgLwhY FQ946Gbz+a/tO1oAoGCCqGSM49Aw EHoUQDQgAEPeSyb YXmje9w4vC9bOz9aFoYNr+1TjkqK535Car11Qs5rjWExRmm
3rkY9ID/FhuNOM4avOUw4DsyCm4uNH5HhA==
-----END ecdsa private key-----
公鑰:
-----BEGIN ecdsa public key-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPeSy bYXmje9w4vC9bOz9aFoYNr+1
TjkqK535Car11Qs5rjWExRmm3rkY9ID/FhuNOM4avOU w4DsyCm4uNH5HhA==
-----END ecdsa public key-----
(2)對密碼簽名
用戶分別對系統System1和System2的密碼進行哈希運算得到散列值,用戶用私鑰對該散列值加密運算得到簽名S(r,s),r和s是一對大整數。然后將簽名S和賬戶密碼發送給系統。
(3)身份信息上鏈
系統將簽名S、賬戶密碼Password加上自己的系統ID(SysToken)發送到區塊鏈網絡,智能合約對其進行驗證并保存,結構如下所示。
1.{
2."_id":"system1_znh",
3."_rev":"2-ccb581de9d1b0e17b53b9b74e605809d",
4."Password":"ZHU1234567#",
5."SysToken":"system1_znh",
6."r":"4DDD135559679110647118042865DDDDDD55 11146286028623055625653706849051060181145122657883",
7."s":"7905390495780267907304610411337128067536 1090163383359880313399688887901448672",
8."~version":"u0000CgMBMgA="
9.}
其中id為系統Token和用戶名組合而成。Password為用戶密碼明文,r和s為用戶對密碼私鑰簽名得到的兩個大整數。
以用戶登錄系統System1和System2為例,分別使用System1和System2的用戶名和公鑰通過區塊鏈進行登錄驗證。登錄驗證流程如圖7所示。
圖7 登錄驗證流程
(1)用戶發送公鑰和用戶名給系統。
(2)系統將用戶名、系統Token(系統的唯一標識符)用下劃線拼接為身份索引id發送到區塊鏈網絡。
(3)智能合約根據id查詢到相應的密碼,使用公鑰對簽名驗證。過程為:智能合約對密碼進行哈希運算得到散列值,智能合約使用公鑰解密簽名獲得散列值,兩者進行對比驗證,將結果返回給應用系統。
(4)客戶端收到結果,驗證成功則登錄成功,否則登錄失敗。
實驗完成了一個基于區塊鏈的身份信息存儲系統,并模擬了使用公鑰驗證橢圓曲線簽名來登錄應用系統的過程。驗證了用戶通過一對密鑰來登錄不同應用系統的可行性,從而解決了用戶面對不同應用系統需要記住大量賬戶密碼的問題。
(1)安全性分析
Hyperledger Fabric是一種聯盟鏈架構,對數據的訪問操作全部通過智能合約控制,只要在智能合約中設置合理的權限,數據就無法被非法訪問,這樣就保證了區塊鏈數據的安全。在區塊鏈之外,由于用戶是使用賬號和公鑰來登錄系統,不需要暴露密碼,因而不存在密碼泄露的安全問題。基于區塊鏈的身份托管模型的安全性主要依賴區塊鏈系統的安全性。對區塊鏈的攻擊有兩方面:一是對區塊鏈系統可用性的攻擊,惡意使區塊鏈停止處理交易;二是對區塊鏈智能合約的攻擊,利用智能合約的規則漏洞產生惡意的交易,這也是破壞性最大的攻擊。本實驗基于最小原型區塊鏈系統設計的智能合約主要分為兩部分功能:數據存儲和登錄驗證。數據存儲嚴格按照格式存儲,登錄驗證為簽名的解密過程,只要設計合理的校驗函數,就能規避利用智能合約被攻擊的風險。
(2)性能分析
性能不足是區塊鏈面臨的挑戰之一。區塊鏈的性能指標主要有交易吞吐量和交易時延兩個。交易吞吐量是指在固定時間區塊鏈網絡能處理的交易數量,而交易時延是區塊鏈對交易的響應和處理時間。本實驗使用Caliper對身份托管系統中的區塊鏈網絡進行綜合性能測試,從數據存儲和數據查詢兩方面,得到相關測試數據,如表4所示。
相對于比特幣每秒7筆交易的吞吐量,本實驗搭建的區塊鏈網絡吞吐量為存儲操作每秒13.2筆交易,查詢操作每秒51.4筆交易,有一定的提升,但是在面對高并發登錄的情況時,有待進一步改善。
智能合約控制著區塊鏈數據的存儲和查詢,其運行效率直接決定數據交易處理的性能。本實驗使用Benchmark測試框架單獨對智能合約進行壓力測試。一共進行5輪測試,每輪的加密簽名過程測試10 000次,驗證簽名測試5 000次,得到每次加解密操作的耗時數據,繪制折線如圖8所示。
由實驗數據可知,每次簽名操作耗時平均為113.721 2 ms(約0.000 11 s),每次驗證簽名操作耗時平均為278.803 2 ms(約0.000 28 s)。相對來說解密操作比加密操作耗時,但這兩種操作均低于1 ms,具有較高的時間效率。
表4 區塊鏈網絡性能指數
圖8 智能合約加解密性能
(3)可行性分析
基于區塊鏈的身份托管系統模型主要由區塊鏈存儲系統和登錄驗證流程智能合約組成。區塊鏈存儲系統基于Hyperledger Fabric已經實現,以Golang開發的智能合約對簽名進行校驗,能正確地驗證用戶身份信息,結果表明是可行的。由于應用系統的復雜多樣性,實驗只模擬了在客戶端用戶對密碼進行加密簽名的過程,實際應用可以在系統中增設一個加密接口,用來對密碼簽名。區塊鏈登錄接口可以使用中間件或者微服務的形式實現。這些都有成熟的技術架構,能夠很好地滿足需求。基于以上分析,本文提出的區塊鏈身份托管模型是可行的。
本文提出了一個基于區塊鏈技術的身份托管系統模型,將用戶的賬號密碼存儲在區塊鏈之后,用戶僅需使用用戶名和同一個公鑰即可完成不同應用系統的登錄校驗,為應用系統的訪問提供一種新的身份驗證模式。實驗過程設計了基于區塊鏈的身份存儲數據結構,以及相關智能合約,完成對身份信息的存儲和校驗,在登錄驗證環節,采用橢圓曲線簽名算法進行賬號驗證,解決了一個用戶需要記住多個不同應用系統不同密碼的問題。本文實驗模擬登錄部分,是在本地局域網環境完成,實際應用可能會有高并發的請求,因此可將智能合約使用公鑰驗證簽名部分轉移到中間件接口,以降低高并發的計算量,減輕區塊鏈網絡壓力,加快登錄驗證過程。以上問題將在后續研究中進行深入探索。