繆文豪,王健翔,鄭朝暉
(蘇州大學計算機科學與技術學院,江蘇 蘇州 215006)
近年來,隨著互聯網技術的飛速發展和普遍應用,大規模分布式系統的數量急劇增長[1],網絡安全問題也日益受到關注。認證技術是保障網絡安全和隱私信息的關鍵,傳統的認證方案都是基于中心化的模式[2],但這種方式也帶來了許多網絡安全風險,比如單點故障、隱私泄露、易受攻擊等[3]。目前的網絡身份認證系統大多采用口令認證和密鑰體制認證的方案。Hwang[4]提出了前向哈希鏈的動態口令方案,雖無須重新注冊,但不能抵抗重放攻擊方案。王秦[5]提出一種基于公鑰加密的一次性口令 (One-Time Password, OTP) 移動商務身份認證方案, 引入移動智能終端的唯一標識IMEI作為認證因素并利用偽隨機數實現雙向身份認證。該方案雖然安全性較高但對于密鑰安全太過依賴, 且非對稱密鑰的計算量較大。文獻[6]基于單鑰體制使用質詢設計了一個有效的適用于網絡通信系統的身份認證方案, 克服了通常的質詢響應認證方案的弱點, 能夠防止重放攻擊和冒充攻擊。
2008年中本聰就提出了區塊鏈的概念,但是直到2014年初,區塊鏈技術才開始出現在人們的視野中,其被廣泛應用于金融、物聯網、公共服務、數字版權等領域[7]。區塊鏈技術利用加密的塊鏈式結構來存儲數據,利用共識算法來生成和更新數據,具有去中心化、數據防篡改、可追溯等特性。盡管區塊鏈技術最初主要應用在金融服務領域,但是近幾年來,已有很多科研人員將區塊鏈技術引入到身份認證領域中以解決面臨的安全問題[8]。HAMMUDOGLU J S等人將區塊鏈技術應用于基于生物特征的身份認證問題, 使用區塊鏈技術存儲指紋形成一個基于區塊鏈的身份認證系統, 但是該方案直接將未加密的指紋存儲在區塊鏈上, 存在安全性與隱私性威脅。FROMKNECHT C等人將區塊鏈技術應用于傳統PKI身份認證領域, 解決了傳統PKI領域存在單一CA (Certifacate Authority)節點故障和使用CRL (Certificate Revocation List) 造成通信量過大的問題, 但未提及跨PKI信任域的身份認證問題的解決方案。
基于上述研究,本文提出了一種基于區塊鏈和多因子結合的身份認證方案。一方面,引入區塊鏈技術,解決中心化面臨的風險;另一方面,引入了人臉識別技術,將口令認證,密鑰認證和生物特征認證三者結合,大大提高身份認證的安全性。同時就目前聯盟鏈主流的實用拜占庭容錯機制網絡開銷大、不具備擴展性的缺點,提出了一種分層可擴展的實用拜占庭容錯機制(Layered and Scalable Practical Byzantine Fault Tolerance Mechanism,LSPBFT)。
區塊鏈是當今互聯網時代的一種新型技術,其結合了分布式賬本、非對稱加密、共識機制、智能合約等技術。在P2P網絡下,采用公開透明的準則,構建塊鏈式的數據結構,具有去中心化、防篡改、可追溯等特點,其獨有的技術特征能夠解決身份認證中面臨的諸多安全和隱私方面的問題[9]。
為了降低公鑰系統密鑰和證書管理的復雜性,以色列密碼學家Shamir在1984年引入了IBC (Identity-Based Cryptography) 的概念。其設計的思想是取代公鑰密碼系統中的數字證書,將用戶在標識密碼系統中的唯一身份標識作為用戶的公鑰,用戶的私鑰則由密鑰生成中心通過某種私鑰生成算法計算產生,這種系統模式本身就具備了密鑰托管的功能。在IBC體系中,用戶的公鑰是代表其在系統中身份的一組字符串,可以是姓名、郵箱、手機號碼、IP 地址等,這樣極大的減輕了公私鑰的管理[10,11,12]。
2.2.1 SM9密鑰生成算法
1)系統主密鑰生成
KGC產生隨機數s∈[1,N-1]作為主私鑰,計算G2中的元素Ppub=[s]P2作為主公鑰。系統的主密鑰對為(s,Ppub),KGC對外公開Ppub,私自保存s。
2)用戶密鑰對生成
KGC選擇一個私鑰生成函數標識符hid,用戶U的標識為IDU,KGC首先在有限域FN上計算t1=H1(IDU‖hid,N)+s,如果計算出的t1為0,則重新生成主私鑰,并計算和公開主公鑰,同時更新已有用戶的私鑰。若t1不為0,則計算t2=s/t1,然后計算dU=[t2]P1,即dU=[s/(H1(IDU‖hid)+s)]P1,計算出的dU就是用戶的私鑰,而用戶的公鑰QU=[H1(IDU‖hid)]P+Ppub。
人臉識別是一種依據人臉特征信息進行分析從而得出結論的生物特征識別技術[13],其主要基于人的臉部特征,通過檢測圖像中是否存在人臉,進一步確定圖像中人臉的大小、位置、角度等信息,并通過對比校驗實現人臉的識別[14]。近年來,基于深度學習的人臉識別算法正在迅速發展,目前處于人臉識別領域的領先地位。深度學習算法的創新之處在于網絡結構、損失函數、訓練數據集等方面,并在這些方面做著不斷的優化和改進,因而人臉識別的準度和效率不斷提高。在眾多基于深度學習的人臉識別算法中,Sphereface 是 Weiyang Liu 等人在 2017 年 CVPR (IEEE國際計算機視覺與模式識別會議)上提出的人臉識別新算法,該算法僅用 WebFace 作為訓練集就在 LFW 上取得了99.42%的成績。Sphereface模型是對open-set進行人臉識別,也就是測試的圖像并沒有在訓練集中出現過。不同于其他深度學習的算法,Sphereface算法提出了新的損失函數——A-Softmax Loss(angular softmax loss),該損失函數是基于角度距離的,因此訓練出的特征具有角度可分的特點[15]。
實用拜占庭容錯機制,簡稱為PBFT,英文全稱為Practical Byzantine Fault Tolerance,是一種基于狀態機復制的共識機制。在區塊鏈系統中, 由于某種原因引起的操作錯誤、網絡延遲、系統崩潰、惡意攻擊等都會引起系統錯誤, 這樣的錯誤被稱為拜占庭錯誤[16]。PBFT的關鍵在于解決拜占庭錯誤,主要思想是在去中心化的網絡中,各個分布式節點通過點對點的傳輸對傳遞的信息達成共識,最終生成區塊。實用拜占庭容錯機制的優點在于改變了原始拜占庭機制效率不高的缺陷,將機制的復雜度由指數級降到了多項式級,并使得拜占庭容錯算法可以應用于實際的分布式系統中。盡管PBFT機制是目前聯盟鏈常用的共識算法,但是其還是存在著很多不足,隨著區塊鏈技術的興起,大規模區塊鏈系統也隨之出現,研究人員逐漸關注如何簡化實用性拜占庭機制的設計,提高拜占庭協議的性能。PBFT算法的缺點如下:①PBFT算法是基于C/S架構, 整個系統中的節點數量是固定, 一旦節點數量發生改變系統無法感知, 不具備擴展性。如果某個節點想要加入該系統,則這個系統必須重啟,因此會產生不必要的資源浪費,影響實用性和用戶體驗。②在視圖切換協議中,沒有對選舉出的主節點的真偽性進行驗證,因此很有可能把惡意節點選舉作為主節點,惡意節點可能會給不同的請求編上相同的序號,或者不去分配序號,或者讓相鄰的序號不連續,這樣會給系統帶來極大的危險性。同時客戶端重復請求會導致視圖不停變換,從而影響正常的服務,甚至陷入宕機。③PBFT算法三階段協議中點對點的通信將產生大量的網絡開銷,造成大量網絡資源的消耗。
基于3.1節PBFT算法存在的問題,本文對其進行了改進,提出了一種分層可擴展的實用拜占庭容錯機制(Layered and Scalable Practical Byzantine Fault Tolerance Mechanism,LSPBFT)。在LSPBFT算法中,將整個網絡中的節點分為三類:服務端節點、驗證節點和客戶端節點。其網絡模型如圖1所示。

圖1 LSPBFT算法的模型圖
這三種節點的數目分別表示為Ns,Nv,Nc。認定服務端節點只有一個,驗證節點的個數為20個,而客戶端節點的個數不收限制。那么,整個網絡的節點總數可以由式(1)表示
Nall=Ns+Nv+Nc
(1)
另外, 從式 (1) 可以看出整個網絡中只有客戶端節點的個數可以改變。經過驗證的節點自動成為客戶端節點,客戶端節點可以自由地進入和退出系統。驗證節點從客戶端節點中選舉出來,個數是固定的20個,而服務端節點從驗證節點中選舉出來,個數為1個。參與整個共識過程的節點為服務端節點和驗證節點,共21個節點。本模型參考EOS選舉出的超級節點的個數[17]。正在進行共識過程的驗證節點和服務端節點不能隨意退出系統,只能等整個共識過程結束,才能退出系統。
本方案采用了分階段的共識算法,當網絡條件優越并且選舉出的服務端節點和驗證節點不是拜占庭節點時(也就是誠實節點),采用本方案提出的快速共識算法FCA(Fast Consensus Algorithm),實現了優于 BFT 算法的吞吐量和共識效率,并且降低了算法的開銷。在網絡條件差并且共識過程中出現了拜占庭節點,切換到使用 PBFT算法來保證系統基本的容錯能力和可用性。
3.3.1 第一階段FCA算法
第一階段的 FCA 算法使用場景為網絡健壯性較好,參與共識過程中沒有出現拜占庭節點,滿足上述條件能夠成功快速地達成共識。當共識未達成時,能夠發現共識失敗。第一階段的 FCA 共識算法的流程圖如圖2所示。

圖2 FCA算法流程圖
1)請求階段:客戶端節點將驗證請求發送給服務端節點,服務端節點校驗該節點是否已注冊過,如果未注冊則返回“未注冊”的提示信息;否則校驗通過后,進入下一階段。
2)驗證階段:服務端節點給請求加上編號,并將編號之后的請求轉發給所有的驗證節點驗證節點收到請求后,直接對請求進行本地的處理并得到驗證結果,然后將結果簽名之后直接返回給客戶端。進入下一階段。
3)響應階段:客戶端獨立地收到來自所有驗證節點和服務端節點的響應,若所有的響應相同,則認為共識已經達成。
4)回復階段:客戶端節點將收到的簽名響應一起返回給所有驗證節點和服務端節點,服務端節點檢查響應相同,則此階段共識成功。
3.3.2 第二階段PBFT算法
當第一階段使用快速共識算法無法達成共識時,則判定系統中存在拜占庭節點,故系統切換到第二階段共識過程。第二階段共識過程中使用的是 PBFT 實用拜占庭容錯算法。第二階段的 PBFT 共識算法的流程圖如圖3所示。

圖3 PBFT算法流程圖
1)請求階段:客戶端節點將驗證請求發送給服務端節點。
2)預準備階段:服務端節點將請求轉發給所有的驗證節點。此階段中,驗證節點確保服務端節點不會發送兩條具有相同的編號,但是內容不同的消息。
3)準備階段:若驗證節點收到服務端節點的請求后,對該請求進行簽名并向其它節點廣播準備消息,并從其他參與共識的節點接收準備消息。若收到至少2 f+1 條來自不同節點的消息,則進入提交階段。如果驗證節點為拜占庭節點,則不執行該操作。
4)提交階段:所有參與共識的節點向其他節點發送提交信息,當收到包括自己的一共2f+1條提交消息時,可以認為大多數節點達成共識,然后執行驗證請求。
5)回復階段:參與共識的節點將驗證請求的結果返回給客戶端節點,當客戶端節點收到超過 2f+1條不同節點的響應時,共識過程結束。
本文通過采用節點選擇算法,來挑選出合適的驗證節點。為保證驗證節點能夠提供安全高效的認證服務,盡可能的在所有可選的驗證節點中選取節點質量指標(Node Quality Index,NQI)較優的節點。假設所有驗證節點的集合記作VC(Validation Node Collection),依據 VC 內節點的 NQI,選取綜合排名前20的節點。NQI根據實際情況來抉擇,比如平均在線時長,網絡帶寬,延時,參與共識的次數等條件。
VC={VC1,VC2,VC3,VC4,……,VCn}為VC內節點的集合。q={q1,q2,q3,……,qm}為NQI的各項指標的集合,每個指標用qi表示,i∈[1,m]。由于網絡情況是實時變動的,調度節點應采用動態測量的方法[18],首先獲取當前的驗證節點的數據指標,再結合以往的數據指標,計算出新的數據指標矩陣。M為VC內節點對應的NQI的數據指標矩陣,如式(2)、(3)。

(2)

(3)
Mnow為當前的數據指標矩陣,Mpast為以往的數據指標矩陣。其中,第i行向量[qi1,qi2,……,qim]是VC中第i個節點VCi的m個NQI值。因此新的數據指標矩陣由式(4)計算得出。
Mnew=αMnow+βMpast
(4)
其中,α和β分別為當前數據指標和以往數據指標的權重,同時要滿足α+β=1且0 <β<α<1。由于NQI的各項指標的單位不同,比如延遲的單位為ms,帶寬的單位為bps等。為了更方便的處理VC內節點的NQI,需要將矩陣M進行歸一化運算,將M中的每一行向量映射到[0,1]區間內。本文采用線性函數如式(5)進行計算。

(5)
其中,qij是M中第i行、第j列中的值,qmax和qmin分別為第j列[q1j,q2j,…,qnj]T中的最大值和最小值,qij映射到[0,1]區間里面的值記作q’ij。
權重集合w={w1,w2,…,wm},其中wj∈R+,j∈[1,m]且滿足式(6)。權重集合w中的每一個元素對應為集合q中相應位置的指標的權重值。

(6)
因此每一個驗證節點VCi的NQI可由式(7)計算得出

(7)
根據式(7)計算出每個驗證節點的NQI,然后獲得向量NQI={NQI1,NQI2,……,NQIn}。將向量NQI中的值按照從大到小的順序排列,選取其中前20個節點最為最終的驗證節點。
用戶個人信息屬于敏感信息,系統有保護用戶隱私的責任,但是同時身份管理也需要加強權威,因此本文采用的系統架構并不是完全去中心化的,但也不是完全中心化的,隸屬于聯盟鏈的框架。聯盟鏈是部分去中心化的,由各個組織機構共同管理,用戶需要得到認可,才可以加入。本文設計的認證方案,可以理解為有一個權威的中心,但是其不是負責管理整個系統,而是把驗證的職責分離出來,交給驗證節點來執行。本文設計方案里面的角色包括客戶端節點、服務端節點、驗證節點和區塊鏈。具體的流程,如圖4、5所示。
步驟 1:客戶端用戶向服務端發送注冊請求;
步驟 2:服務端向客戶端用戶發送相應的注冊要求;
步驟 3:客戶端用戶向服務端上傳自己的身份證號和人臉照片;
步驟 4:服務端依據客戶端用戶的身份證號在本地數據庫檢索是否已存在,若存在則說明已注冊過,返回給用戶“已注冊過,不可重復注冊”的提示信息;否則采用SM9密鑰生成算法,依據用戶的身份證號生成用戶的密鑰對,同時使用人臉識別模型訓練出用戶的人臉特征值ID;
步驟5:服務端將用戶的密鑰對發送給客戶端,同時將簽名后的用戶信息UserInfo存入區塊鏈中。用戶信息包含用戶的身份證號和ID,UserInfo=s(Hash(HashInfo1-2))。其中s為系統的主私鑰,HashInfo1-2為身份證號和ID的哈希值。

圖4 注冊流程圖
步驟 1:客戶端用戶向服務端發送認證請求;
步驟 2:服務端向客戶端發送相應的認證要求(包括一個隨機口令);
步驟3:客戶端用戶向服務端發送自己的身份證號和隨機口令,同時通過實時拍攝自己的人臉照片進行上傳;
步驟4:服務端收到用戶的認證信息后,將用戶實時拍攝的人臉照片輸入到人臉識別模型并訓練出用戶的人臉特征值ID’,將認證信息(包括身份證號、隨機口令和ID’)發送給通過節點選擇算法選出的驗證節點;
步驟 5:驗證節點和服務端通過LSPBFT算法對用戶的認證請求進行驗證并達成共識;
步驟 6:檢驗隨機口令是否正確以及是否在有效期限內,如果隨機口令不正確則驗證失敗,如果隨機口令的時限不在有效期限內,則提示重新驗證;
步驟 7:使用用戶的公鑰解密認證信息,提取出用戶的身份證號和ID’;
步驟 8:使用用戶的公鑰在區塊鏈中查找相應的UserInfo,利用系統的主公鑰解密UserInfo,提取出用戶的身份證號和ID;
步驟 9:比對步驟7 和步驟8中的身份證號和人臉特征值是否相等,如果有一項信息不相等則驗證失敗,否則驗證成功,并將驗證結果返回給客戶端用戶;
步驟 10:如果用戶收到所有驗證節點相同的驗證結果,則共識過程結束,用戶身份驗證成功;如果用戶收到驗證結果不完全相同或者沒有收到全部驗證節點的驗證結果,則驗證失敗,重新返回步驟5,再次進行共識過程。

圖5 驗證流程圖
本實驗的硬件環境為Intel(R) Core(TM) i5的CPU,8G的內存和932G的硬盤,軟件環境采用VMware Workstation 15 Player的虛擬機和Ubuntu 16.04的操作系統。本實驗的開發語言為go語言,開發工具為LiteIDE,數據庫為MySQL。實驗通過MATLAB 2017a對LSPBFT算法和PBFT算法的運行結果進行數學計算仿真。
6.1.1 去中心化
由于本文的方案把服務端節點節點的認證業務分離,分配給驗證節點來執行,因此認證時涉及到多個節點,并不像傳統認證的單一服務器,所有業務只有中心服務器來完成。同時驗證時并不知道哪些節點會成為驗證節點,這也提高了攻擊的難度,大大提高了系統的安全性。
6.1.2 防篡改
傳統認證方式是把用戶的信息存儲在數據庫中,而這會遭受黑客的大量攻擊,如果數據庫被攻破,那么用戶的隱私也會受到威脅。而本文的方案是將節點的信息存入區塊鏈中,當網絡中的節點越多,存儲數據的副本就越多。因此,一旦數據存入區塊鏈就很難被篡改,如果想要修改數據,就需要攻擊全網所有的節點并更改數據。
6.1.3 抗重放攻擊
隨機口令在認證時只使用一次, 攻擊者即使截取了消息也無法進行重放攻擊。并且隨機口令附加上時間戳,由于時間戳無法篡改, 若攻擊者重用截獲消息, 因時間戳失效而驗證失敗, 因而有效防止重放攻擊。
6.1.4 防泄漏
單因子認證最大的弊端就是隱私泄露,就比如用戶的公私鑰,隨機口令或者人臉照片。而本方案將密鑰認證,口令認證與人臉識別認證相結合,即使數據丟失或者被竊取,也不會造成任何影響。本方案認證時人臉識別認證是通過實時拍攝人臉照片上傳,而不能通過選擇圖片上傳,就算個人信息泄露,竊取者也無法認證成功,這大大提高了認證的安全性。
6.1.5 防暴力破解
若攻擊者獲取到存儲在區塊鏈中的用戶信息UserInfo,并通過暴力破解的方式得到用戶的身份證號和人臉特征值。 首先要嘗試找到正確的公鑰將UserInfo解密為HashInfo1-2 (假設公鑰有m項選擇需要遍歷) ;接著嘗試將HashInfo1-2拆解為HashInfo1和HashInfo2;最后, 暴力破解2個單項哈希加密的信息。但由于哈希加密算法不可逆的特點, 攻擊者只能通過暴力破解等遍歷的手段嘗試找到2個單項HashInfo。因此, 其破解難度為n×n=n2(假設2個單項信息各有n項選擇), 除此之外還要遍歷m個公鑰嘗試解密。單因子認證暴力破解單項HashInfo和本方案破解UserInfo的難度對比見表1。

表1 單因子與多因子認證破解難度對比表
PBFT算法是基于狀態機復制原理的, 采用C/S的請求響應模式, 無法動態地感知節點加入或離開網絡, 當節點數目増加時需要重新啟動系統, 重新開始計算、傳輸信息數據。一旦節點數目發生變化, 且未重新啟動系統, 仍按照之前的節點數目進行運算, 將使得新加入的節點資源的浪費或為不存在節點占用一定的系統資源。LSPBFT算法在一定程度上解決了動態性的問題,LSPBFT算法將整個網絡系統中的節點劃分為三類,參與共識的節點只有驗證節點和服務端節點,而PBFT算法全網所有節點都需要參與共識??蛻舳斯濣c可以自由地進入或者退出系統,并不需要其他節點知道,并且不會影響整個系統的運行,但是正在參與共識的節點不可隨意退出系統,若驗證節點或者服務端節點要退出系統,系統會重新選出相應的節點代替。由此可見, 相對于PBFT算法, LSPBFT算法能夠動態地感知節點加入或離開網絡, 當節點數目増加時, 不需要重新啟動系統, 不會出現新加入的節點資源的浪費或為不存在節點占用一定的系統資源的情況。
當共識過程不存在拜占庭節點的情況下,LSPBFT 算法與PBFT 算法的共識時間對比如圖6所示。從圖中可以看出,兩種算法的共識時間都會隨著節點數量的增加而增加,且增加速度也越來越快。這是因為節點數量越多,則確認一筆請求所需發送的消息數量就越多,自然更耗時間。在節點數量較少的情況下,兩種算法的共識完成時間相差不大,但當節點的數量逐漸增加,尤其是超過50 個節點以后,LSPBFT算法的共識時間相較 PBFT 算法顯著減少。

圖6 LSPBFT算法與PBFT算法共識時間對比(無拜占庭節點)
當共識過程存在拜占庭節點的情況下,LSPBFT 算法與PBFT 算法的共識時間對比如圖7所示。盡管LSPBFT算法在共識過程存在拜占庭節點的情況下,先執行了第一階段FCA算法,但是會迅速切換到第二階段PBFT算法,并且參與共識的節點個數只有21個,并不想傳統的PBFT算法需要全網所有節點參與,這也縮短了節點之間通信的時間,因此共識時間也會更快。

圖7 LSPBFT算法與PBFT算法共識時間對比(有拜占庭節點)
相比于傳統中心化的認證方案,只依靠中心服務器來驗證用戶的請求。圖8為本方案與基于靜態口令和基于PKI機制的認證在響應時間上的對比圖??诹钫J證較為簡單,常以“賬號+密碼”的形式認賬,而PKI機制較為復雜,首先要獲取CA證書,并且證書的發放與校驗需要花費一定的時間。而本方案通過節點選擇算法,將選出的認證節點來代替單一中心,并且選出的節點只會認證一個待驗證的節點,這樣大大減輕了中心服務器的認證負擔,提高了認證的效率。

圖8 平均響應時間對比
隨著分布式系統的不斷增長,系統的安全性尤為重要。但僅僅依賴單一的集權中心來維護整個系統的運營和安全,這無疑會對其造成巨大的挑戰,同時各種各樣的問題也暴露出單一中心的缺陷和弊端。針對傳統身份認證方式的不足,本文將區塊鏈技術與密鑰機制、口令認證和人臉識別技術相結合,提出了多因子結合的認證方案。既保留了集權中心的權威,同時通過節點選擇算法減輕了集權中心的負擔。在提高認證安全性的同時,本文提出的方法在龐大的分布式系統中也能提高認證的效率。