潘 維,黃曉芳
(西南科技大學 計算機科學與技術學院,四川 綿陽 621010)
PKI[1,2]技術能夠實現在網絡中進行安全信息交換和身份認證,其原理是利用證書管理用戶公鑰,通過一個第三方可信任機構——CA中心將用戶公鑰和其它身份標識信息綁定生成證書,實現在互聯網上驗證用戶身份的目的。但中心化管理方式容易導致核心CA受到攻擊,并且不透明的特點使得惡意證書不能被及時檢測,存在著安全性問題。除此以外,由于多個CA機構間互相獨立,在實現交叉認證上具有一定的難度。自2008年“中本聰”發表《Bitcoin:A peer-to-peer electronic cash system》[3]以來,區塊鏈技術[4,5]作為比特幣的核心支撐技術得到了快速的發展。區塊鏈的早期特征是以比特幣為代表的可編程數字加密貨幣體系,隨著區塊鏈去中心化、公開透明以及防篡改等優點日益凸顯,其用途已經不僅僅局限于虛擬數字貨幣,越來越多的人開始在以太坊平臺通過智能合約開發不同類型的區塊鏈應用[6]。智能合約最大的特點是通過設置執行條件以及交易規則,在不依賴第三方的情況下進行可信交易。本研究主要將區塊鏈、智能合約技術運用到身份管理及認證上,提出了一個去中心化、分布式并且公開透明的身份管理及認證模型,解決上述PKI技術中存在的問題。
區塊鏈的出現,為解決傳統PKI中存在的安全性問題和對認證機制上的改進提供了新思路,國內外研究者對其展開了較多的研究。Fromknecht等[7]提出了一種基于區塊鏈的去中心化PKI認證系“CertCoin”,替代證書頒發機構(CA)提供密鑰查詢和身份綁定服務,解決了當前PKI中需要可信第三方機構導致的安全性問題。CertCoin利用在線密鑰對和離校密鑰對實現身份的注冊、驗證及撤銷。但其缺點在于沒有進行身份驗證,意味著無論誰首先聲稱身份的所有權就可以擁有該域名。Axon L等[8]提出了一種基于隱私保護的區塊鏈PKI——PB PKI,創新之處在于無需將公鑰和用戶身份信息相關聯,避免了通過公鑰追蹤到用戶身份的風險。Alexander等[9]提出了一個基于區塊鏈的PKI框架來管理X.509證書,通過給定證書與根證書之間的鏈接——信任鏈,實現對給定證書的驗證。但只在區塊鏈中存儲了信任鏈中的最終實體證書的Hash,一旦出現虛假證書將無法被監控。Wentong Wang等[10]提出了一種基于區塊鏈的跨域認證模型——BlockCAM,以此解決用戶訪問不同域名獲取資源的安全性和效率問題,其主要思想是將所有CA機構組成一個聯盟鏈,在區塊鏈上存儲用戶向CA申請的證書Hash值。Rong Wang等[11]提出了一個基于權限區塊鏈的隱私保護PKI系統,該系統將用戶身份認證與授權分離,實現匿名發布證書,從而保護用戶身份隱私安全。Ze Wang等[12]提出了一個基于區塊鏈的證書發布和撤銷過程透明的方案,但證書的撤銷主要還是依賴于CA定期發布撤銷證書并且沒有提出一個很好的監控架構。
以上提到研究都是為了解決傳統PKI帶來的安全性問題,盡管側重點不盡相同,但基于證書的方式難以滿足用戶多種類型身份數據的管理和認證需求[13]。因此提出了一種基于智能合約的去中心化身份管理及認證模型,實現用戶多類型身份數據的發布、認證以及撤銷,旨在解決傳統PKI中心化的特點帶來的不足以及多CA之間互信難導致認證機制不靈活的問題。其中“數據”是指用戶通過智能合約發布的身份數據,存儲在區塊鏈中用于身份證明的憑證,具有不同的身份屬性和類型,例如學歷信息、銀行卡信息等。本研究支持用戶擁有多條身份數據,實現在不同場景中根據不同的認證需求,使用所需數據憑證證明身份而不必提供用戶其它的身份信息,降低身份信息泄露的風險。
本研究采用區塊鏈類型之一的聯盟鏈,節點經過授權后才能加入其中,其中CA節點作為聯盟鏈中的驗證節點,主要作用是驗證用戶身份數據的真實性并簽發用戶身份認證憑證。整個區塊鏈分布式數據庫不需要一個可信中心存在,由多個節點共同維護,共識機制使得寫入的數據經過大多數節點同意,并且這些數據在區塊鏈中是公開可查的,這些優點可以有效解決傳統PKI中心化的特點帶來的安全性問題以及多CA之間互信難導致認證機制不靈活的缺點。在現實中,姓名、家庭住址等多種身份屬性信息組合成了一個人的實體。同樣的在本研究中,“一個人”由多條身份數據組成,這些數據作為用戶進行身份認證的憑證。由于用戶具有多類型身份數據,因此在某個服務商進行身份認證時,只需要根據認證要求提供所需身份數據憑證即可,不必提供其它的身份信息,有效降低身份信息泄露的風險。
模型主要結構如圖1所示,主要包括區塊鏈和可供外部調用的區塊鏈接口。用戶、服務商以及驗證節點通過調用接口實現用戶多類型身份數據的發布、認證以及撤銷。在模型中,以主要的發布和認證過程為例,對其過程進行了圖示說明。其中用戶數據發布過程主要包含用戶身份數據注冊以及驗證節點對數據的驗證過程,分別對應圖1中步驟(2)、步驟(3)和步驟(4)、步驟(5)。認證過程主要是用戶利用已發布的數據在其它服務商處進行身份認證,主要過程如圖1中步驟(6)、步驟(7)所示。
模型的關鍵在于智能合約的設計,通過智能合約編寫用戶身份數據發布、認證以及撤銷相關規則,主要是利用Solidity語言加以實現。此外,在客戶端實現主要是引用了第三方庫Web3.js,這是一個以太坊基于JavaScript的API,用于連接以太坊,客戶端的主要作用是實現用戶管理和發布身份數據。智能合約主要分為用戶身份數據(User-Identify)和可供外部調用的接口函數兩部分。在智能合約中,一個用戶對應多個以ID為標識的身份數據,一條身份數據主要包括身份明文信息的哈希值InfoHash、身份數據唯一標識ID、擁有者以太坊公鑰地址ownerAddr、認證狀態status(pendding/pass/revoke)。 除此以外,智能合約還包括實現用戶身份數據的發布、認證以及撤銷有關的可供外部調用的接口函數。下面將詳細闡述如何通過智能合約實現模型中的發布、認證和撤銷過程。
新用戶在客戶端注冊一個以太坊賬號,返回賬戶公鑰地址、私鑰等,用戶在區塊鏈中的身份與該地址關聯,代表著現實世界中的實體。已有賬號用戶登錄客戶端后,可進行身份數據的注冊和管理已發布身份數據等。
主要分為用戶身份數據注冊過程和驗證節點對數據的驗證過程,如圖2所示。
3.2.1 身份注冊過程
主要是用戶在客戶端通過調用智能合約中的REGISTER函數(如算法1所示)將其身份數據與其在區塊鏈中的身份進行綁定的過程。首先,存儲InfoHash和指定驗證節點signer,設置公鑰地址ownerAddr為調用方(msg.sender)的以太坊公鑰地址,設置認證狀態status為pendding。最后,生成并返回此條用戶身份數據唯一標識ID,用戶在本地客戶端存儲ID。

圖1 基于智能合約的身份管理及認證模型設計

圖2 用戶身份數據發布過程
算法1: 注冊身份數據
Input: infoHash,signer
Output: 身份數據標識符ID
(1) function REGISTER (infoHash,signer)
(2) ID = generateID (msg.sender,infoHash,now)
(3) userIdentity = UserIdentity[ID]
(4) userIdentity.infoHash = infoHash
(5) userIdentity.ownerAddr = msg.sender
(6) userIdentity.signer = signer
(7) userIdentity.status = pedding
(8) return ID
(9) end function
3.2.2 驗證過程
驗證過程主要指的是驗證節點對用戶已注冊身份數據進行驗證的過程。主要如下:
(1) 用戶向驗證節點發起驗證請求
User→node∶req(ID,Info,sign(sk,Info))
(1)
用戶客戶端將3.2.1中返回的身份數據標識符ID、身份明文數據Info以及用戶私鑰sk對Info的簽名值sign(sk,Info)提交給驗證節點,節點檢查用戶Info的格式以及真實性,有誤則返回失敗響應。
驗證節點收到請求后,對數據的驗證過程如下:
(2) 驗證節點根據ID通過智能合約獲取對應InfoHash等身份數據。
(3)驗證節點計算Hash(Info)是否與InfoHash相等,保證用戶提供的Info與已存儲的身份數據一致且完整,保證用戶發布數據的真實性。
(4)驗證節點驗證簽名。在以太坊中,用戶創建一個賬戶時,通過私鑰可生成對應公鑰,由公鑰產生唯一以太坊公鑰地址,該地址代表著用戶在區塊鏈中的實體,因此在對用戶身份數據驗證時,如果能證明用戶擁有該公鑰地址對應私鑰即可證明對注冊身份數據的所有權。驗證節點通過驗證用戶對身份信息Info的簽名值sign(sk,Info)確保用戶擁有對應私鑰,保證用戶對該身份數據的所有權。
(5)驗證節點修改認證狀態、發布數據。在通過上述幾個步驟證明了用戶對指定ID身份數據的所有權之后,驗證節點通過調用智能合約中的CONFIRM函數(如算法2所示)修改該條身份數據認證狀態status為pass,表明該條數據已經通過了自己的驗證,并設置過期時間expiryDate,然后發布該條身份數據。經過聯盟鏈中各個節點共識后用戶身份憑證InfoHash存儲在區塊鏈中,最后觸發emitConfirmEvent事件(監聽此事件的用戶客戶端及時得到響應),返回成功響應。
(6)用戶本地客戶端接收到成功響應后,存儲此條身份數據的ID、驗證節點地址、過期時間,以便用于后續的身份認證中。
算法2: 驗證數據
Input: ID,expiryDate
Output: 響應信息success/error
(1) function CONFIRM(ID,expiryDate)
(2)userIdentity = UserIdentity[ID]
(3)if msg.sender = userIdentity.signer then
(4)userIdentity.status = pass
(5)userIdentity.expiryDate = expiryDate
(6)emitConfirmEvent(ID,msg.sender,expiryDate)
(7) return success
(8)else
(9) return error
(10) end if
(11) end function
認證過程主要指的是用戶在網絡中獲取資源服務時,服務商對用戶進行身份認證的過程。根據不同的認證需求,用戶選擇所需的已發布身份數據進行認證。對于普通服務商來說,無需本地存儲用戶身份數據進行認證,只需要從區塊鏈直接獲取身份數據憑證后驗證即可,減少了成本的同時也降低了用戶身份信息泄露的風險。主要如下:
(1)用戶向服務商發起認證請求
User→server∶req(ID,Info,sign(sk,Info))/
req(ID,sign(sk,ID))
(2)
根據服務商對身份認證的需求不同,有的需要在對用戶進行身份認證的同時獲取明文信息,有的則只需要一個認證結果,不需要明文信息。因此用戶可以在認證時選擇是否提供身份明文信息Info。下面以前者為例,對認證過程進行說明。與3.2.2節中驗證過程類似,首先用戶提供給服務商已發布的用戶身份數據標識符ID、對應的身份明文信息Info和用戶私鑰sk對Info的簽名值sign(sk,Info)。
服務商接收到認證請求后,利用用戶提交的身份數據以及通過發布過程在區塊鏈中存有的身份數據憑證對用戶身份進行驗證,步驟如下:
(2)檢查數據Info格式,有誤返回認證失敗的響應信息。
(3)根據ID通過智能合約獲取對應InfoHash、ow-nerAddr、signer等身份數據。
(4)計算Hash(Info)是否與InfoHash相等,保證用戶提供的Info與已發布身份數據一致且完整,防止數據造假。
(5)驗證用戶對身份信息Info的簽名值sign(sk,Info)確保用戶擁有對應私鑰,保證用戶具有該身份數據所有權。
(6)檢查signer是否是所信任節點地址,確保該條數據是由自己所信任節點驗證(簽發)。
(7)檢查認證狀態status是否為pass,以及當前時間是否超出過期時間expiryDate。
若以上過程均滿足,該用戶身份認證通過,返回認證成功的響應信息,服務商可以提供后續資源服務。
撤銷過程主要指的是驗證節點修改指定已發布身份數據認證狀態的過程。通過調用智能合約中的REVOKE函數(如算法3所示)將認證狀態由pass修改為revoke:①檢查調用方是否為signer,若不是則不能進行撤銷操作;②將指定身份數據標識符ID對應的認證狀態status修改為revoke;③觸發撤銷事件(emitRevokeEvent),使得應用方(如服務商)及時更新最新數據,不需要CA機構定期發布撤銷證書列表就能被及時檢測到。
算法3: 撤銷數據
Input: ID
Output: 響應信息success/error
(1) function REVOKE(ID)
(2)userIdentity = UserIdentity[ID]
(3)if msg.sender=userIdentity.signer then
(4)userIdentity.status = revoke
(5)emitRevokeEvent(ID,msg.sender)
(6) return success
(7)else
(8) return error
(9)end if
(10) end function
確保用戶發布身份數據的真實性,是進行身份認證的前提。主要通過以下步驟保證用戶發布的身份數據的真實性。首先,驗證節點需要驗證用戶提交的數據Info的真實性和完整性;其次,驗證節點計算Hash(Info)并與用戶事先注冊的身份數據哈希值InfoHash進行比較,根據兩個Hash值是否相同來保證身份數據屬于同一用戶。最后,驗證節點驗證用戶對數據的簽名值,確保用戶擁有發布數據賬戶對應私鑰。以上步驟均通過,由驗證節點寫入區塊鏈中。對于驗證節點來說,一旦簽發了虛假數據,經驗證發現后,該節點簽發的身份將不再可信。除此以外,若是惡意分子想要冒充用戶身份通過認證獲取資源服務,首先,需要獲取相關身份數據唯一標識ID。其次,需要獲取ID對應的完整身份數據Info。最后,需要獲取用戶對應私鑰。因此冒充身份具有一定的難度。
首先是匿名性,用戶數據不以明文形式存儲而是身份數據哈希值,保證了用戶在區塊鏈中身份的匿名性。由于哈希函數單向性的特點,保證了即使惡意節點獲取了已發布數據的InfoHash,也無法得到用戶真實明文信息,確保用戶身份信息不被泄露。驗證節點在驗證和撤銷過程中,不能修改用戶身份信息,只能對認證狀態進行修改,保證了用戶身份數據的有效性。其次,用戶自主可控。在身份數據發布過程中,用戶可以選擇發布何種類型的身份數據,并且在認證階段,用戶提供服務商需要的身份數據進行認證,不需要其它數據。全過程用戶自主可控,避免了身份信息泄露的風險。
傳統基于CAs的PKI容易受到攻擊,一旦被攻擊者控制,其頒發的證書將不再可信。由于區塊鏈去中心化、分布式網絡的特點,即使一個節點發生故障,其它節點也不會受到影響,不會影響整個系統的工作,并且用戶身份數據經過發布、共識之后,由各節點共同維護,確保數據的有效性和不被篡改,從而避免傳統CA的單點失效的問題。此外,對于服務商來說,只需要從區塊鏈中獲取認證憑證即可,不需要本地數據庫存儲用戶身份數據用于身份認證,避免了用戶身份信息泄露的危險。
本研究針對傳統PKI中心化的特點帶來的安全性問題以及多CA之間互信難導致認證機制不靈活的問題,提出了一種基于智能合約的去中心化身份管理及認證模型,利用智能合約實現用戶身份數據的發布、認證和撤銷過程。用戶身份數據經過共識、發布后之后,能夠在其它服務商用于身份認證,實現交叉認證的目的。除此以外,支持用戶發布多條身份數據,在不同場景根據不同的認證需求,利用所需數據憑證證明身份而不必提供其它身份信息。最后對模型的安全性進行了分析。