張 柯,黃曉芳
(西南科技大學 計算機科學與技術學院,四川 綿陽 621010)
隨著互聯網和數字經濟的飛速發展,服務數字化的程度也在不斷提高。例如,人們經常使用電子商務、在線支付、在線政務等,這些都需要可靠的安全機制進行保障,公鑰基礎設施(PKI,public key infrastructure)[1-2]利用公鑰技術和數字證書提供服務,能夠為用戶在開放環境中進行安全的通訊提供保障。現有的證書頒發機構(CA,certificate authority)其公鑰基礎設施可能使用不同的密鑰體系,不同的安全和認證策略,導致需要各自維護自己的信任域[3],當單個信任域提供的服務無法滿足用戶的需求,用戶需要進行跨域訪問,由此出現跨域認證問題。如何消除信任孤島,打通信任體系,實現各CA之間證書的互認互通是亟需解決的問題。
國內外已經有大量的學者針對跨域認證進行了相關研究,并取得了一些成果,提出了一系列跨域認證模型。文獻[4]提出了PKI域間認證模型,包括層次模型,網狀模型和橋CA模型等,但建立橋CA存在實際困難。顏海龍等人[5]提出了CA互信互認標準體系框架,制定了多CA兼容的數字證書格式,將現有的數字證書格式規范化。彭博等人[6]利用橋CA實現不同CA的交叉認證,利用層次模型實現橋CA的互信,從理論上構建了跨域認證模型。以上研究成果表明,CA跨域認證仍然存在諸多問題有待解決。
區塊鏈作為驅動比特幣的底層技術,其具有去中心化,防篡改,透明化的特性。其本質是一個分布式不可篡改的賬本,底層依靠共識機制,點對點傳輸,加密算法等組合而成。區塊鏈是按照時間順序將數據以一定的方式進行組合并形成的鏈式結構,將用戶的身份信息存入區塊鏈中,能夠確保數據的安全和非法篡改。W.Wang等人[7]首次提出了基于區塊鏈的跨域認證模型,隨著區塊鏈的數據量不斷增大,存在著用戶跨域認證效率不高的問題,周致成等人[8]等針對傳統PKI跨域認證方案的效率問題,通過與區塊鏈技術相結合,提出了基于區塊鏈的跨域認證方案,減少了簽名與驗證的次數,提升了跨域認證的效率,但用戶仍然需要申請對應信任域證書,產生額外的證書開銷,同時撤銷需要多次操作區塊鏈,效率不高。為了提升異構域的認證效率,馬曉婷等人[9]提出了一種基于區塊鏈技術的跨異構域認證方案,實現了PKI域和IBC域之間高效安全的通訊,簡化了重認證過程,降低了用戶端計算量。黃穗等人[10]針對區塊鏈跨域認證效率低的問題,提出了利用布谷鳥過濾器提升證書的查詢效率,但其存在著誤刪的情況,難以適應重要場合的跨域認證場景。
針對以上問題,本文提出了基于區塊鏈和動態累加器的跨域認證方案,通過將不同的CA加入到區塊鏈中作為分布式信任中心,消除了傳統CA中心化信任的弊端。通過利用智能合約構造動態累加器,避免了傳統區塊鏈跨域認證中證書的操作難題,提升了跨域認證效率,減少證書存儲開銷,實現證書的高效查詢、注冊和撤銷操作。
區塊鏈是一種去中心化的分布式不可篡改賬本[11],將數據按照時間先后順序組合而成的塊鏈式結構,依托密碼學方式保證區塊鏈的防篡改和不可偽造,通過共識機制將數據寫入到區塊鏈中,保證數據的一致性,利用智能合約進行數據的處理,能夠在不安全的環境中進行可靠的信息交換,實現不同實體之間的信任傳遞[12]。
智能合約[13]是具有自動執行協議能力的計算機協議,合約包含可執行的代碼和數據兩部分,允許用戶通過智能合約對區塊鏈的數據進行相關的操作并對用戶的輸入和輸出結果做出響應。比特幣(BTC,Bitcoin)中的智能合約使用依靠的是UTXO(unspent transaction outputs)模型,但合約功能有限,只能實現交易功能。以太坊依靠以太坊虛擬機(EVM,Ethereum virtual machine)運行智能合約,通過合約地址進行智能合約的調用與執行,消耗GAS作為智能合約執行成本。超級賬本(Hyperledger)中鏈碼(Chaincode)支持多種語言,其被編譯成一個獨立的應用程序,運行于隔離的Docker容器中。
通過將區塊鏈跨域認證協議和密碼累加器機制結合,利用智能合約構造出動態累加器,將區塊鏈證書指紋存入動態累加器中,各節點通過共識機制將數據寫入到區塊鏈賬本中,能夠降低證書存儲成本。
密碼學累加器[14]最早是由 Josh Benaloh 和 Michael de Mare 提出的,它能夠對一組元素進行綁定操作,并能夠對集合中的任何元素提供簡短的成員關系或者非成員關系證明。相較于其他累加器,動態累加器[15-16]能夠實現添加或移除成員時間復雜度不會隨著累加器中成員的數量增加而增加,其時間復雜度為O(1)[16],具有高效的成員添加和刪除效率。Wang P等人[17]給出了動態累加器的定義,下面給出動態累加器的形式化描述。
KeyGen(k,M):為了實例化參數而執行的概率算法,將安全參數k和上限M作為入參,將累加器參數P=(Pu,Pr)作為返回結果,其中Pu表示累加器的公鑰,Pr表示累加器的私鑰。
AccVal(L,P):用于計算累加值的概率算法,通過入參P和一組元素L={c1,c2,....,cm}(1 WitGen(ac,Al,P):見證生成算法,為每一個元素創建成員見證的概率算法。輸入ac、Al和參數P,輸出對于每一個ci(i=1,2,....,m)的見證值。 Verify(c,W,v,Pu):驗證算法,用來驗證給定的值是否為成員身份的確定性算法。輸入元素c、證據W、累加值v和公鑰Pu,通過證據W來驗證c是否被累計入v,返回YES或者NO。 DelEle(L+,ac,v,P):從累加值中刪除某些元素的概率算法,將表示為待刪除的元素L-={c1-,c2-,....,ci-}(L-?L,1≤i≤M-m),輔助信息ac,累加值v和參數P作為入參,返回新的累加值v′保持和集合LL-一致,更新輔助信息ac和au。 本文采用區塊鏈3種類型之一的聯盟鏈,其具有拓展性強和共識速度快等特點,適合跨域認證場景下大規模認證操作,鏈上各CA節點需要經過授權才能夠加入,CA節點作為各個信任域的根信任節點,主要作用是負責驗證用戶身份的真實性和頒發區塊鏈證書,同時接受跨域認證用戶的請求,生成區塊鏈跨域認證證書。區塊鏈賬本數據無需中心化的可信中心,通過多個CA節點共同維護,寫入賬本的數據需要大多數節點的同意,區塊鏈上的數據是公開透明的,避免了傳統基于PKI的數字證書存在的中心化信任和透明度缺失的問題。針對不同CA下用戶跨域認證問題,通過與區塊鏈技術結合,形成統一的區塊鏈證書,解決了傳統跨域認證中存在的證書路徑復雜,交叉互信難,單點故障問題。利用區塊鏈將各CA形成統一的信任聯盟,使得用戶持有的區塊鏈證書在不同信任域中得到認可,消除信任孤島,提升跨域認證的效率,降低證書的管理成本。通過引入動態累加器提高身份認證的效率,降低節點的存儲開銷。本章主要設計了區塊鏈證書模型和跨域認證協議。 區塊鏈證書相較于傳統的數字證書[2],減少了簽名模塊部分,減輕了CA節點計算驗證的壓力。同時為了滿足動態累加器的需求,在文獻[7]提出的區塊鏈證書基礎上引入了當前累加值到區塊鏈證書中。本文設計的區塊鏈證書如圖1所示。 傳統的基于區塊鏈的跨域認證模型[7]需要對區塊鏈進行查詢操作,隨著區塊鏈數據的增加,查詢耗時會線性增長,針對跨域認證中高并發的場景下,現有的方案無法進行高效的查詢和插入操作的問題,結合密碼學累加器,設計基于區塊鏈和累加器的跨域認證流程,認證流程如圖2所示。 1)UA→BCAB:用戶UA向CAB發送區塊鏈跨域認證請求。 2)BCAB→UA:{R1}:CAB節點收到請求響應后,將生成的隨機數R1發送給UA。 3)UA→BCAB:{BCertA,SignpriUA(R1),R1}:UA將自己的區塊鏈證書和CAB傳遞過來的R1進行簽名值以及R1返回給CAB。 4)BCAB→BCAA:{GetCertCAA,R2}:CAB通過證書驗證簽名值是否有效,檢查BCertA是否過期,根據證書中的頒發者向CAA節點請求獲得CAA根節點區塊鏈證書和隨機數R2。 5)BCAA→BCAB:{BCertCAA,R2}:CAA節點收到來自CAB節點的請求后,返回給CAB自己的證書和隨機數R2。 6)BC→BCAB:{BcertA,CAB}:將生成的跨域證書BCertA,CAB發送給CAB并將生成的哈希值通過節點之間的共識算法寫入到區塊鏈中。 7)BCAB→UA:{BcertA,CAB}:CAB將跨域證書BCertA,CAB發送UA,完成UA和CAB之間的跨域認證。 傳統區塊鏈查詢數據的方式需要遍歷整個區塊鏈,隨著區塊鏈的體積不斷增大,查詢效率會變得低下。本文通過利用智能合約構造動態累加器,將遍歷區塊鏈中數據的方式替換為證明成員在累加器中,使得查詢的時間復雜度從O(n)能夠降低至O(1),降低了查詢耗時,提升了跨域認證的效率。 本章主要描述了基于Hyperledger Fabric進行基于智能合約實現動態累加器的區塊鏈證書成員添加,區塊鏈證書成員證明,區塊鏈證書成員刪除的鏈碼實現。 當節點成功驗證用戶身份后,從區塊鏈賬本中讀取當前累加器對象,通過用戶提交的證書信息生成區塊鏈證書,并通過sha256(cert)生成證書的指紋和隨機數n,使得mem=H(sha256(cert),n)滿足裴蜀定理,動態累加器首先通過成員搜索函數verifyMembership驗證當前待添加的證書是否已經存在,若未存在則動態累加器acc通過proveMembership計算并生成新的累加值accValue和用戶身份信息對應見證witness。算法描述如算法1所示: 算法1:區塊鏈跨域證書添加 1)Input: ctx,certValue 2)Output: accVaule,witness 3)ChaincodeStub stub = ctx.getStub(); 4)byte[] ojectBytes = stub.getState(Accumulator.class.getSimpleName()); 5)Accumulator acc = deserialize(ojectBytes); 6)Integer mem = H(sha256(cert),n) 7)witness1=acc .proveMembership(sha256(cert,n)); 8)return accVaule,witness; 用戶將區塊鏈證書cert、見證值witness、當前證書累加值value傳遞給節點,節點讀取賬本的數據,反序列化動態累加器對象,通過傳入的cert,n,生成區塊鏈成員對象mem用來驗證區塊鏈證書是否在累加器中,若驗證通過返回true,驗證不通過返回false。其中value表示當前累加器值,mem表示證書成員指紋,n表示隨機數由區塊鏈證書添加時生成,witness表示通過累加器生成的見證值。算法描述如算法2所示: 算法2:區塊鏈跨域證書成員驗證 1)Input: ctx,value,mem,witness 2)Output: 驗證響應 success/false 3)ChaincodeStub stub = ctx.getStub(); 4)byte[] ojectBytes = stub.getState(Accumulator.class.getSimpleName()); 5)Accumulator acc = deserialize(ojectBytes); 6)boolean verifyPass = acc.verifyMembership(value, mem,n, witness, acc.getN()); 7)if(witness.modPow(mem,acc.getN()).comparteTo(A)==0){ 8)return true; 9)} 10)return false; 首先從區塊鏈賬本中獲取當前動態累加器對象,通過算法2驗證區塊鏈證書是否在累加器中,若驗證通過,從累加器中去掉該成員后重新計算累加器的值,返回刪除區塊鏈證書成員操成功響應當前并通過區塊鏈節點共識將累加器寫入到賬本中,若驗證失敗則返回刪除成員失敗,終止操作。 算法3:區塊鏈證書刪除 1)Input:ctx,mem 2)Output: 刪除響應 success/false 3)ChaincodeStub stub = ctx.getStub(); 4)byte[] ojectBytes = stub.getState(Accumulator.class.getSimpleName()) 5)Accumuldator acc = deserialize(ojectBytes); 6)BigInteger product = BigInteger.ONE; 7)for(BigInteger cert:certs){ 8)product =product.multiply(H(sha256(cert),cert.getNonce()) 9)} 10)acc.value = acc.value.modPow(product,acc.getN()) 11)return acc.value; 4.1.1 證書存儲安全性 將區塊鏈證書經過Hash(bcer)=m后存儲在區塊鏈上,Hash函數的單向性保證了攻擊者無法通過m反推cert,通過Hash的抗碰撞性能夠保證選擇任意的區塊鏈證書bcert1和bert2,使得Hash(bcert1)=bcert2是計算上不可行的。 4.1.2 累加器安全性 本文的動態累加器基于強RSA假設,在該假設下尋找滿足條件的f(w,m)=wmmodn的問題是多項式時間內難解的。如果存在攻擊者C能夠找到一組v=f(x,y),使得v=f(x,y)=wmmodn,其中n是由兩個大素數產生,那么強RSA假設不成立。因此在強RSA假設下,給定v,m,找到一個w使得v=f(x,y)是困難的,所以動態累加器f(w,m)=wmmodn是一個安全的累加器。 4.1.3 非法跨域認證安全性分析 跨域認證中存在著非授權的跨域認證等安全性問題。因此,為了防止非授權用戶進行跨域認證,在跨域認證中,用戶與目標節點會通過挑戰-應答方式驗證用戶身份的合法性,目標節點會校驗用戶提供的證書和源跨域CA節點進行比對,確保需要驗證的隨機數和目標節點保存的隨機數一致,確保用戶的證書由源節點簽發的同時起到了防止重放攻擊的效果,同時在區塊鏈證書的拓展項中加入節點白名單,只有當跨域認證用戶的區塊鏈證書里包含了目標節點的唯一ID,用戶才能夠與目標節點進行跨域認證操作,從而杜絕了用戶非法進行跨域認證操作的可能。 4.2.1 實驗環境 實驗開發環境為AMD Ryzen 5 2600X 3.60 GHz CPU 和24 GB內存的PC機。利用VMware Workstation Pro 10.0.177 63創建虛擬機,并在虛擬機中通過Docker創建節點,為每個peer節點分配1 G內存和10 G存儲空間。Hyperledger Fabric版本為2.2.0,鏈碼使用Java 1.8開發,Docker版本為19.03.13。 4.2.2 實驗比較 實驗開始前,先批量創建區塊鏈跨域證書3000條作為測試數據集,其中 RSA動態累加器模數是一個長度為1 024的正整數,是由兩個通過Miller-Rabin素性檢測算法生成和的乘積。為了避免偶發性誤差,將實驗重復進行5次計算平均值。圖3表示查詢50,100,150,200張證書的平均耗時。表1表示不同文獻中的優缺點比較。圖4表示不同方法在區塊鏈上的存儲成本比較。 表1 文獻優缺點比較 通過證書查詢平均耗時看出,文獻[7]的查詢耗時隨著證書的個數增長而線性增長,本文的耗時隨著證書數量的增加波動不大,并且查詢10 000張證書耗時仍然為1秒左右,能夠滿足批量跨域認證應用場景,雖然查詢速度落后于文獻[10],但文獻[10]存在著3%的誤判概率,這在一些重要的身份認證場景是難以忽略的。同時,本文的證書存儲相較于其他方法,存儲的消耗約為其他方法的一半,隨著區塊鏈數據的增加,能夠進一步降低區塊鏈證書數據存儲的成本。綜上所述,本文將區塊鏈和動態累加器相結合,在避免誤判的前提下,提升了跨域認證的效率,降低了證書的存儲成本。實現結果表明,該方法具備一定的有效性和可行性。 本文首先闡述了區塊鏈技術、動態累加器的相關知識。針對傳統的區塊鏈跨域身份認證存在的證書查詢效率低下,重認證耗時長的問題。提出了基于區塊鏈和動態累加器的跨域認證方案,通過在智能合約中生成動態累加器,利用動態累加器的高效可驗證特性和成員元素支持動態添加和刪除的特點,構造包含累加值的區塊鏈跨域證書,將證書的指紋作為成員值寫入到累加器中,通過區塊鏈共識機制共同維護累加器狀態,提升了鏈上數據龐大時的查詢效率,降低了證書存儲開銷。通過實驗數據進行分析比較,結果表明,該方法能夠有效提升跨域認證效率,降低證書鏈上存儲成本。

2 基于區塊鏈和動態累加器跨域認證方案
2.1 區塊鏈證書
2.2 協議設計
3 關鍵智能合約設計
3.1 區塊鏈跨域證書添加
3.2 區塊鏈跨域證書驗證
3.3 區塊鏈證書刪除
4 安全性分析及實驗
4.1 安全性分析
4.2 實驗

5 結束語