潘 維,黃曉芳
(西南科技大學(xué) 計算機科學(xué)與技術(shù)學(xué)院,四川 綿陽 621010)
PKI[1,2]技術(shù)能夠?qū)崿F(xiàn)在網(wǎng)絡(luò)中進行安全信息交換和身份認證,其原理是利用證書管理用戶公鑰,通過一個第三方可信任機構(gòu)——CA中心將用戶公鑰和其它身份標識信息綁定生成證書,實現(xiàn)在互聯(lián)網(wǎng)上驗證用戶身份的目的。但中心化管理方式容易導(dǎo)致核心CA受到攻擊,并且不透明的特點使得惡意證書不能被及時檢測,存在著安全性問題。除此以外,由于多個CA機構(gòu)間互相獨立,在實現(xiàn)交叉認證上具有一定的難度。自2008年“中本聰”發(fā)表《Bitcoin:A peer-to-peer electronic cash system》[3]以來,區(qū)塊鏈技術(shù)[4,5]作為比特幣的核心支撐技術(shù)得到了快速的發(fā)展。區(qū)塊鏈的早期特征是以比特幣為代表的可編程數(shù)字加密貨幣體系,隨著區(qū)塊鏈去中心化、公開透明以及防篡改等優(yōu)點日益凸顯,其用途已經(jīng)不僅僅局限于虛擬數(shù)字貨幣,越來越多的人開始在以太坊平臺通過智能合約開發(fā)不同類型的區(qū)塊鏈應(yīng)用[6]。智能合約最大的特點是通過設(shè)置執(zhí)行條件以及交易規(guī)則,在不依賴第三方的情況下進行可信交易。本研究主要將區(qū)塊鏈、智能合約技術(shù)運用到身份管理及認證上,提出了一個去中心化、分布式并且公開透明的身份管理及認證模型,解決上述PKI技術(shù)中存在的問題。
區(qū)塊鏈的出現(xiàn),為解決傳統(tǒng)PKI中存在的安全性問題和對認證機制上的改進提供了新思路,國內(nèi)外研究者對其展開了較多的研究。Fromknecht等[7]提出了一種基于區(qū)塊鏈的去中心化PKI認證系“CertCoin”,替代證書頒發(fā)機構(gòu)(CA)提供密鑰查詢和身份綁定服務(wù),解決了當前PKI中需要可信第三方機構(gòu)導(dǎo)致的安全性問題。CertCoin利用在線密鑰對和離校密鑰對實現(xiàn)身份的注冊、驗證及撤銷。但其缺點在于沒有進行身份驗證,意味著無論誰首先聲稱身份的所有權(quán)就可以擁有該域名。Axon L等[8]提出了一種基于隱私保護的區(qū)塊鏈PKI——PB PKI,創(chuàng)新之處在于無需將公鑰和用戶身份信息相關(guān)聯(lián),避免了通過公鑰追蹤到用戶身份的風(fēng)險。Alexander等[9]提出了一個基于區(qū)塊鏈的PKI框架來管理X.509證書,通過給定證書與根證書之間的鏈接——信任鏈,實現(xiàn)對給定證書的驗證。但只在區(qū)塊鏈中存儲了信任鏈中的最終實體證書的Hash,一旦出現(xiàn)虛假證書將無法被監(jiān)控。Wentong Wang等[10]提出了一種基于區(qū)塊鏈的跨域認證模型——BlockCAM,以此解決用戶訪問不同域名獲取資源的安全性和效率問題,其主要思想是將所有CA機構(gòu)組成一個聯(lián)盟鏈,在區(qū)塊鏈上存儲用戶向CA申請的證書Hash值。Rong Wang等[11]提出了一個基于權(quán)限區(qū)塊鏈的隱私保護PKI系統(tǒng),該系統(tǒng)將用戶身份認證與授權(quán)分離,實現(xiàn)匿名發(fā)布證書,從而保護用戶身份隱私安全。Ze Wang等[12]提出了一個基于區(qū)塊鏈的證書發(fā)布和撤銷過程透明的方案,但證書的撤銷主要還是依賴于CA定期發(fā)布撤銷證書并且沒有提出一個很好的監(jiān)控架構(gòu)。
以上提到研究都是為了解決傳統(tǒng)PKI帶來的安全性問題,盡管側(cè)重點不盡相同,但基于證書的方式難以滿足用戶多種類型身份數(shù)據(jù)的管理和認證需求[13]。因此提出了一種基于智能合約的去中心化身份管理及認證模型,實現(xiàn)用戶多類型身份數(shù)據(jù)的發(fā)布、認證以及撤銷,旨在解決傳統(tǒng)PKI中心化的特點帶來的不足以及多CA之間互信難導(dǎo)致認證機制不靈活的問題。其中“數(shù)據(jù)”是指用戶通過智能合約發(fā)布的身份數(shù)據(jù),存儲在區(qū)塊鏈中用于身份證明的憑證,具有不同的身份屬性和類型,例如學(xué)歷信息、銀行卡信息等。本研究支持用戶擁有多條身份數(shù)據(jù),實現(xiàn)在不同場景中根據(jù)不同的認證需求,使用所需數(shù)據(jù)憑證證明身份而不必提供用戶其它的身份信息,降低身份信息泄露的風(fēng)險。
本研究采用區(qū)塊鏈類型之一的聯(lián)盟鏈,節(jié)點經(jīng)過授權(quán)后才能加入其中,其中CA節(jié)點作為聯(lián)盟鏈中的驗證節(jié)點,主要作用是驗證用戶身份數(shù)據(jù)的真實性并簽發(fā)用戶身份認證憑證。整個區(qū)塊鏈分布式數(shù)據(jù)庫不需要一個可信中心存在,由多個節(jié)點共同維護,共識機制使得寫入的數(shù)據(jù)經(jīng)過大多數(shù)節(jié)點同意,并且這些數(shù)據(jù)在區(qū)塊鏈中是公開可查的,這些優(yōu)點可以有效解決傳統(tǒng)PKI中心化的特點帶來的安全性問題以及多CA之間互信難導(dǎo)致認證機制不靈活的缺點。在現(xiàn)實中,姓名、家庭住址等多種身份屬性信息組合成了一個人的實體。同樣的在本研究中,“一個人”由多條身份數(shù)據(jù)組成,這些數(shù)據(jù)作為用戶進行身份認證的憑證。由于用戶具有多類型身份數(shù)據(jù),因此在某個服務(wù)商進行身份認證時,只需要根據(jù)認證要求提供所需身份數(shù)據(jù)憑證即可,不必提供其它的身份信息,有效降低身份信息泄露的風(fēng)險。
模型主要結(jié)構(gòu)如圖1所示,主要包括區(qū)塊鏈和可供外部調(diào)用的區(qū)塊鏈接口。用戶、服務(wù)商以及驗證節(jié)點通過調(diào)用接口實現(xiàn)用戶多類型身份數(shù)據(jù)的發(fā)布、認證以及撤銷。在模型中,以主要的發(fā)布和認證過程為例,對其過程進行了圖示說明。其中用戶數(shù)據(jù)發(fā)布過程主要包含用戶身份數(shù)據(jù)注冊以及驗證節(jié)點對數(shù)據(jù)的驗證過程,分別對應(yīng)圖1中步驟(2)、步驟(3)和步驟(4)、步驟(5)。認證過程主要是用戶利用已發(fā)布的數(shù)據(jù)在其它服務(wù)商處進行身份認證,主要過程如圖1中步驟(6)、步驟(7)所示。
模型的關(guān)鍵在于智能合約的設(shè)計,通過智能合約編寫用戶身份數(shù)據(jù)發(fā)布、認證以及撤銷相關(guān)規(guī)則,主要是利用Solidity語言加以實現(xiàn)。此外,在客戶端實現(xiàn)主要是引用了第三方庫Web3.js,這是一個以太坊基于JavaScript的API,用于連接以太坊,客戶端的主要作用是實現(xiàn)用戶管理和發(fā)布身份數(shù)據(jù)。智能合約主要分為用戶身份數(shù)據(jù)(User-Identify)和可供外部調(diào)用的接口函數(shù)兩部分。在智能合約中,一個用戶對應(yīng)多個以ID為標識的身份數(shù)據(jù),一條身份數(shù)據(jù)主要包括身份明文信息的哈希值InfoHash、身份數(shù)據(jù)唯一標識ID、擁有者以太坊公鑰地址ownerAddr、認證狀態(tài)status(pendding/pass/revoke)。 除此以外,智能合約還包括實現(xiàn)用戶身份數(shù)據(jù)的發(fā)布、認證以及撤銷有關(guān)的可供外部調(diào)用的接口函數(shù)。下面將詳細闡述如何通過智能合約實現(xiàn)模型中的發(fā)布、認證和撤銷過程。
新用戶在客戶端注冊一個以太坊賬號,返回賬戶公鑰地址、私鑰等,用戶在區(qū)塊鏈中的身份與該地址關(guān)聯(lián),代表著現(xiàn)實世界中的實體。已有賬號用戶登錄客戶端后,可進行身份數(shù)據(jù)的注冊和管理已發(fā)布身份數(shù)據(jù)等。
主要分為用戶身份數(shù)據(jù)注冊過程和驗證節(jié)點對數(shù)據(jù)的驗證過程,如圖2所示。
3.2.1 身份注冊過程
主要是用戶在客戶端通過調(diào)用智能合約中的REGISTER函數(shù)(如算法1所示)將其身份數(shù)據(jù)與其在區(qū)塊鏈中的身份進行綁定的過程。首先,存儲InfoHash和指定驗證節(jié)點signer,設(shè)置公鑰地址ownerAddr為調(diào)用方(msg.sender)的以太坊公鑰地址,設(shè)置認證狀態(tài)status為pendding。最后,生成并返回此條用戶身份數(shù)據(jù)唯一標識ID,用戶在本地客戶端存儲ID。
圖1 基于智能合約的身份管理及認證模型設(shè)計
圖2 用戶身份數(shù)據(jù)發(fā)布過程
算法1: 注冊身份數(shù)據(jù)
Input: infoHash,signer
Output: 身份數(shù)據(jù)標識符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 驗證過程
驗證過程主要指的是驗證節(jié)點對用戶已注冊身份數(shù)據(jù)進行驗證的過程。主要如下:
(1) 用戶向驗證節(jié)點發(fā)起驗證請求
User→node∶req(ID,Info,sign(sk,Info))
(1)
用戶客戶端將3.2.1中返回的身份數(shù)據(jù)標識符ID、身份明文數(shù)據(jù)Info以及用戶私鑰sk對Info的簽名值sign(sk,Info)提交給驗證節(jié)點,節(jié)點檢查用戶Info的格式以及真實性,有誤則返回失敗響應(yīng)。
驗證節(jié)點收到請求后,對數(shù)據(jù)的驗證過程如下:
(2) 驗證節(jié)點根據(jù)ID通過智能合約獲取對應(yīng)InfoHash等身份數(shù)據(jù)。
(3)驗證節(jié)點計算Hash(Info)是否與InfoHash相等,保證用戶提供的Info與已存儲的身份數(shù)據(jù)一致且完整,保證用戶發(fā)布數(shù)據(jù)的真實性。
(4)驗證節(jié)點驗證簽名。在以太坊中,用戶創(chuàng)建一個賬戶時,通過私鑰可生成對應(yīng)公鑰,由公鑰產(chǎn)生唯一以太坊公鑰地址,該地址代表著用戶在區(qū)塊鏈中的實體,因此在對用戶身份數(shù)據(jù)驗證時,如果能證明用戶擁有該公鑰地址對應(yīng)私鑰即可證明對注冊身份數(shù)據(jù)的所有權(quán)。驗證節(jié)點通過驗證用戶對身份信息Info的簽名值sign(sk,Info)確保用戶擁有對應(yīng)私鑰,保證用戶對該身份數(shù)據(jù)的所有權(quán)。
(5)驗證節(jié)點修改認證狀態(tài)、發(fā)布數(shù)據(jù)。在通過上述幾個步驟證明了用戶對指定ID身份數(shù)據(jù)的所有權(quán)之后,驗證節(jié)點通過調(diào)用智能合約中的CONFIRM函數(shù)(如算法2所示)修改該條身份數(shù)據(jù)認證狀態(tài)status為pass,表明該條數(shù)據(jù)已經(jīng)通過了自己的驗證,并設(shè)置過期時間expiryDate,然后發(fā)布該條身份數(shù)據(jù)。經(jīng)過聯(lián)盟鏈中各個節(jié)點共識后用戶身份憑證InfoHash存儲在區(qū)塊鏈中,最后觸發(fā)emitConfirmEvent事件(監(jiān)聽此事件的用戶客戶端及時得到響應(yīng)),返回成功響應(yīng)。
(6)用戶本地客戶端接收到成功響應(yīng)后,存儲此條身份數(shù)據(jù)的ID、驗證節(jié)點地址、過期時間,以便用于后續(xù)的身份認證中。
算法2: 驗證數(shù)據(jù)
Input: ID,expiryDate
Output: 響應(yīng)信息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
認證過程主要指的是用戶在網(wǎng)絡(luò)中獲取資源服務(wù)時,服務(wù)商對用戶進行身份認證的過程。根據(jù)不同的認證需求,用戶選擇所需的已發(fā)布身份數(shù)據(jù)進行認證。對于普通服務(wù)商來說,無需本地存儲用戶身份數(shù)據(jù)進行認證,只需要從區(qū)塊鏈直接獲取身份數(shù)據(jù)憑證后驗證即可,減少了成本的同時也降低了用戶身份信息泄露的風(fēng)險。主要如下:
(1)用戶向服務(wù)商發(fā)起認證請求
User→server∶req(ID,Info,sign(sk,Info))/
req(ID,sign(sk,ID))
(2)
根據(jù)服務(wù)商對身份認證的需求不同,有的需要在對用戶進行身份認證的同時獲取明文信息,有的則只需要一個認證結(jié)果,不需要明文信息。因此用戶可以在認證時選擇是否提供身份明文信息Info。下面以前者為例,對認證過程進行說明。與3.2.2節(jié)中驗證過程類似,首先用戶提供給服務(wù)商已發(fā)布的用戶身份數(shù)據(jù)標識符ID、對應(yīng)的身份明文信息Info和用戶私鑰sk對Info的簽名值sign(sk,Info)。
服務(wù)商接收到認證請求后,利用用戶提交的身份數(shù)據(jù)以及通過發(fā)布過程在區(qū)塊鏈中存有的身份數(shù)據(jù)憑證對用戶身份進行驗證,步驟如下:
(2)檢查數(shù)據(jù)Info格式,有誤返回認證失敗的響應(yīng)信息。
(3)根據(jù)ID通過智能合約獲取對應(yīng)InfoHash、ow-nerAddr、signer等身份數(shù)據(jù)。
(4)計算Hash(Info)是否與InfoHash相等,保證用戶提供的Info與已發(fā)布身份數(shù)據(jù)一致且完整,防止數(shù)據(jù)造假。
(5)驗證用戶對身份信息Info的簽名值sign(sk,Info)確保用戶擁有對應(yīng)私鑰,保證用戶具有該身份數(shù)據(jù)所有權(quán)。
(6)檢查signer是否是所信任節(jié)點地址,確保該條數(shù)據(jù)是由自己所信任節(jié)點驗證(簽發(fā))。
(7)檢查認證狀態(tài)status是否為pass,以及當前時間是否超出過期時間expiryDate。
若以上過程均滿足,該用戶身份認證通過,返回認證成功的響應(yīng)信息,服務(wù)商可以提供后續(xù)資源服務(wù)。
撤銷過程主要指的是驗證節(jié)點修改指定已發(fā)布身份數(shù)據(jù)認證狀態(tài)的過程。通過調(diào)用智能合約中的REVOKE函數(shù)(如算法3所示)將認證狀態(tài)由pass修改為revoke:①檢查調(diào)用方是否為signer,若不是則不能進行撤銷操作;②將指定身份數(shù)據(jù)標識符ID對應(yīng)的認證狀態(tài)status修改為revoke;③觸發(fā)撤銷事件(emitRevokeEvent),使得應(yīng)用方(如服務(wù)商)及時更新最新數(shù)據(jù),不需要CA機構(gòu)定期發(fā)布撤銷證書列表就能被及時檢測到。
算法3: 撤銷數(shù)據(jù)
Input: ID
Output: 響應(yīng)信息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
確保用戶發(fā)布身份數(shù)據(jù)的真實性,是進行身份認證的前提。主要通過以下步驟保證用戶發(fā)布的身份數(shù)據(jù)的真實性。首先,驗證節(jié)點需要驗證用戶提交的數(shù)據(jù)Info的真實性和完整性;其次,驗證節(jié)點計算Hash(Info)并與用戶事先注冊的身份數(shù)據(jù)哈希值InfoHash進行比較,根據(jù)兩個Hash值是否相同來保證身份數(shù)據(jù)屬于同一用戶。最后,驗證節(jié)點驗證用戶對數(shù)據(jù)的簽名值,確保用戶擁有發(fā)布數(shù)據(jù)賬戶對應(yīng)私鑰。以上步驟均通過,由驗證節(jié)點寫入?yún)^(qū)塊鏈中。對于驗證節(jié)點來說,一旦簽發(fā)了虛假數(shù)據(jù),經(jīng)驗證發(fā)現(xiàn)后,該節(jié)點簽發(fā)的身份將不再可信。除此以外,若是惡意分子想要冒充用戶身份通過認證獲取資源服務(wù),首先,需要獲取相關(guān)身份數(shù)據(jù)唯一標識ID。其次,需要獲取ID對應(yīng)的完整身份數(shù)據(jù)Info。最后,需要獲取用戶對應(yīng)私鑰。因此冒充身份具有一定的難度。
首先是匿名性,用戶數(shù)據(jù)不以明文形式存儲而是身份數(shù)據(jù)哈希值,保證了用戶在區(qū)塊鏈中身份的匿名性。由于哈希函數(shù)單向性的特點,保證了即使惡意節(jié)點獲取了已發(fā)布數(shù)據(jù)的InfoHash,也無法得到用戶真實明文信息,確保用戶身份信息不被泄露。驗證節(jié)點在驗證和撤銷過程中,不能修改用戶身份信息,只能對認證狀態(tài)進行修改,保證了用戶身份數(shù)據(jù)的有效性。其次,用戶自主可控。在身份數(shù)據(jù)發(fā)布過程中,用戶可以選擇發(fā)布何種類型的身份數(shù)據(jù),并且在認證階段,用戶提供服務(wù)商需要的身份數(shù)據(jù)進行認證,不需要其它數(shù)據(jù)。全過程用戶自主可控,避免了身份信息泄露的風(fēng)險。
傳統(tǒng)基于CAs的PKI容易受到攻擊,一旦被攻擊者控制,其頒發(fā)的證書將不再可信。由于區(qū)塊鏈去中心化、分布式網(wǎng)絡(luò)的特點,即使一個節(jié)點發(fā)生故障,其它節(jié)點也不會受到影響,不會影響整個系統(tǒng)的工作,并且用戶身份數(shù)據(jù)經(jīng)過發(fā)布、共識之后,由各節(jié)點共同維護,確保數(shù)據(jù)的有效性和不被篡改,從而避免傳統(tǒng)CA的單點失效的問題。此外,對于服務(wù)商來說,只需要從區(qū)塊鏈中獲取認證憑證即可,不需要本地數(shù)據(jù)庫存儲用戶身份數(shù)據(jù)用于身份認證,避免了用戶身份信息泄露的危險。
本研究針對傳統(tǒng)PKI中心化的特點帶來的安全性問題以及多CA之間互信難導(dǎo)致認證機制不靈活的問題,提出了一種基于智能合約的去中心化身份管理及認證模型,利用智能合約實現(xiàn)用戶身份數(shù)據(jù)的發(fā)布、認證和撤銷過程。用戶身份數(shù)據(jù)經(jīng)過共識、發(fā)布后之后,能夠在其它服務(wù)商用于身份認證,實現(xiàn)交叉認證的目的。除此以外,支持用戶發(fā)布多條身份數(shù)據(jù),在不同場景根據(jù)不同的認證需求,利用所需數(shù)據(jù)憑證證明身份而不必提供其它身份信息。最后對模型的安全性進行了分析。