李 嶒
安徽中澳科技職業(yè)學院信息工程與藝術設計系,安徽合肥,230041
隨著互聯(lián)網規(guī)模的不斷擴大,物聯(lián)網終端隨處可見,云計算極大普及,各種新型網絡平臺層出不窮,網絡應用已經徹底地融入到人們的日常生活中[1]。當用戶需要使用平臺服務時,需要提供相應的身份認證信息,每一個網絡平臺都有各自的身份認證方法,用戶需要記憶多個用戶名和口令,管理認證信息變得越來越煩瑣,用戶在不同網站注冊賬戶也消耗了大量的網絡資源。為了實現身份信息的共享和單點登錄,出現了中心化的認證平臺來集中管理賬戶信息,但也伴隨著認證跨平臺難度大、隱私保護困難、認證成本高等一系列網絡安全問題。
區(qū)塊鏈通過一種去中心化的共識機制讓所有區(qū)塊鏈網絡的參與者共同維護一個賬本系統(tǒng),具有分布式存儲、去中心化共識、信息不可篡改和不對稱加密等特性。將區(qū)塊鏈技術應用到身份認證系統(tǒng),讓用戶擁有管理身份的權利并通過智能合約傳遞身份信息,可以有效解決傳統(tǒng)中心化認證系統(tǒng)的安全缺陷[2]。
物聯(lián)網的普及使終端用戶多樣化,每個應用平臺擁有獨立的身份認證系統(tǒng),提供用戶身份標識和用戶證書,負責對用戶的合法性進行驗證,這種認證結構簡單易行。同一個互聯(lián)網用戶在不同的應用平臺上擁有多個虛擬身份,每個虛擬身份對應著一套應用賬戶信息,頻繁地在多個身份間切換給用戶帶來不便[3]。
微軟從1997年就開始嘗試使用身份聯(lián)盟的方式進行集中身份認證,加入聯(lián)盟的應用平臺接受同區(qū)域其他平臺發(fā)出的身份標識和授權[4]。用戶通過身份聯(lián)盟平臺的賬戶在不同的網站間進行單點登錄,解決了用戶多次注冊和登錄的不便。身份聯(lián)盟平臺采用中心化的系統(tǒng)構架,集中管理用戶的身份信息,合作網站不必開發(fā)獨立的授權和認證系統(tǒng),身份認證處理過程由身份聯(lián)盟平臺負責執(zhí)行,初步實現了身份信息的共享。身份聯(lián)盟采用中心化的結構管理用戶身份,如果中心服務器出現故障,將影響用戶使用聯(lián)盟中的應用平臺,同時跨聯(lián)盟訪問技術也是身份聯(lián)盟認證體系結構急需解決的問題。
開放授權是相對于封閉授權來講的,封閉授權是指在本地計算機或局域網內的認證授權,互聯(lián)網應用之間的授權即是開放授權。開放授權認證是通過一定的開放規(guī)則,由用戶授權第三方應用訪問該用戶在某一個網絡平臺上保存的身份信息,而無需將賬戶信息提供給第三方應用[5]。通過授權,用戶無須在第三方應用平臺中注冊信息,第三方應用也無法獲取用戶的隱私信息,授權平臺在收到用戶的授權請求后,向第三方應用發(fā)送認證結果。開放授權中,用戶在一定程度上掌握了身份信息的使用權利。
上文描述的三種認證體系中,獨立身份認證是最容易實現且擴展性較好,但對于用戶的負擔較大,無法實現單點登錄;身份聯(lián)盟內部共享認證信息,實現了用戶單點登錄,用戶身份由中心服務器集中存儲和管理;開放授權認證允許應用之間單項傳遞認證結果,用戶掌握了授權結果的使用權利,但用戶仍然沒有身份信息的管理權。因此三種認證體系在用戶體驗和技術實現上仍不完美。
區(qū)塊鏈技術是去中心化系統(tǒng),不需要高成本的中心信息架構,個別節(jié)點的故障不會影響整個區(qū)塊鏈系統(tǒng)的正常運行,幾乎不存在系統(tǒng)癱瘓的風險。
區(qū)塊鏈技術實現了鏈狀區(qū)塊結構、全網共享賬本和非對稱加密技術,具有去中心化、不可篡改、公開透明等特點,具有很強的抵御網絡攻擊能力。其發(fā)展經歷三個階段:區(qū)塊鏈1.0,起源于比特幣,是以實現虛擬貨幣支付和管理為主要應用的區(qū)塊鏈;區(qū)塊鏈2.0,以太坊的典型應用,構建了一個可編程的智能合約開發(fā)平臺,其應用領域從數字貨幣拓展到了其他金融領域;區(qū)塊鏈3.0,其應用完全超出了金融經濟領域,成為了一種通用的解決方案[6]。區(qū)塊鏈技術從1.0到3.0的主要技術特征和應用領域描述見表1。
表1 區(qū)塊鏈技術主要技術特征和應用領域
在區(qū)塊鏈3.0的架構中,超越了金融的應用范疇,而將區(qū)塊鏈技術作為一種通用的解決方案,應用到各行各業(yè),因此架構中需要具備企業(yè)級屬性,如身份認證、許可授權、加密傳輸等。區(qū)塊鏈體系架構如圖1所示。
圖1 區(qū)塊鏈3.0體系架構圖
區(qū)塊鏈體系架構包含以下組成部分[7]:
(1)核心數據層:區(qū)塊結構決定了區(qū)塊鏈數據存儲形式,區(qū)塊結構由區(qū)塊頭、交易數據和區(qū)塊數據三個部分組成,不同區(qū)塊的區(qū)塊頭通過哈希指針串聯(lián)起來,形成整個區(qū)塊鏈底層數據的鏈表,Mekel樹描述了區(qū)塊鏈中節(jié)點的層次結構,合約容器為智能合約的開發(fā)提供了專用存儲空間;
(2)網關控制層:區(qū)塊鏈的網絡結構是典型的點對點網絡,區(qū)塊鏈網絡中節(jié)點參與數據的維護,當某個節(jié)點請求對區(qū)塊數據進行操作時,其他節(jié)點參與身份認證和數據驗證。通過認證的節(jié)點和驗證后的數據才會被添加到賬本中;
(3)共識機制層:區(qū)塊鏈網絡利用工作量證明(PoW)和權益證明(PoS)來阻止網絡攻擊,以保證數據的合法和安全,防止信息被篡改。在區(qū)塊鏈3.0中,為了匹配各行業(yè)的使用需求,共識機制不是固定的,用戶可以根據需要去選用配置;
(4)擴展接口層:區(qū)塊鏈3.0提供了開發(fā)平臺和應用程序編程接口(API),包含了智能合約開發(fā)語言、圖形化開發(fā)工具、文件操作系統(tǒng)、數據存儲查詢和工作流引擎等技術。
非對稱加密是區(qū)塊鏈交易過程的一個重要組成部分。傳統(tǒng)的對稱加密算法中,加密和解密使用同一個密鑰。而非對稱加密算法,加密和解密使用不同的密鑰,加密時使用的密鑰是公開的,稱為公鑰;解密時使用的密鑰是節(jié)點私有的,稱為私鑰。非對稱加密保證了在節(jié)點間傳遞的信息始終是加密的,解密所有的私鑰掌握在信息所有節(jié)點中,參與驗證的其他節(jié)點無法對其解密[8]。公鑰和私鑰總是成對使用的,通過私鑰可以計算出對應的公鑰,而通過公鑰不能計算出對應的私鑰。區(qū)塊鏈中的加密解密過程如圖2所示。
圖2 非對稱加密過程圖
去中心化是區(qū)塊鏈技術的最重要特點,它采用了P2P的網絡結構。參與區(qū)塊鏈網絡的節(jié)點既是服務器又是客戶端,當節(jié)點產生交易時,其他節(jié)點需要對交易進行驗證,達成共識后交易信息才會寫入區(qū)塊鏈賬本。為了達成共識,產生交易的節(jié)點需要對自己所做的工作進行證明[9],常見的共識機制有工作量證明(PoW)、股權證明機制(PoS)、授權股權證明機制(DPoS)、拜占庭容錯機制(BFT)和實用拜占庭容錯機制(PBFT)等。不同的共識機制有自己的特點。在區(qū)塊鏈3.0應用中,共識機制不再被封裝在底層不可更改,用戶可以根據實際需要來選擇使用共識機制或共識機制的組合。智能合約是運行在區(qū)塊鏈中的條件約定,當數據環(huán)境達到合約規(guī)定的條件后,合約會自動執(zhí)行,無須人工觸發(fā)[10]。在區(qū)塊鏈3.0的技術架構中,完全支持智能合約的定制開發(fā),編寫好的智能合約可以方便地部署在區(qū)塊鏈網絡中。
區(qū)塊(Block)和鏈表是區(qū)塊鏈的核心數據結構,其中區(qū)塊數據包含區(qū)塊頭和區(qū)塊體兩個部分,區(qū)塊頭的作用是和其他區(qū)塊形成一個鏈表,區(qū)塊體則保存認證系統(tǒng)所提供的身份數據。區(qū)塊鏈的數據庫體系是由一系列節(jié)點組成的二叉樹,葉子節(jié)點的Hash值合在一起成為了父節(jié)點的Hash值,一直到根節(jié)點。區(qū)塊數據存儲在levelDB中,數據以鍵值對進行存儲。在鏈式結構中有兩個鏈表,一個是由所有的區(qū)塊數據形成的主鏈,另一個則是所有區(qū)塊頭數據形成的區(qū)塊頭鏈表。一般情況下,將區(qū)塊頭鏈表看成區(qū)塊鏈的一個部分。交易是區(qū)塊體的重要數據結構,交易被節(jié)點加密簽名形成一段指令,然后提交給區(qū)塊鏈。
區(qū)塊頭的儲存結構為:
type Header struct {
ParentHash common.Hash
UncleHash common.Hash
Coinbase common.Address
Root common.Hash
TxHash common.Hash
ReceiptHash common.Hash
....
}
區(qū)塊體中包含了用于形成鏈表結構的區(qū)塊頭信息,存儲結構如下:
type Block struct {
header *Header//區(qū)塊頭
uncles []*Header//前置區(qū)塊頭數組
transactions Transactions//交易名稱
hash atomic.Value//自動產生hash值
size atomic.Value//區(qū)塊數據大小
td *big.Int//封裝到該區(qū)塊的儲存層次
ReceivedAt time.Time//區(qū)塊數據被認可的時間
ReceivedFrom interface{}//共識接口
}
3.1.1 傳統(tǒng)認證系統(tǒng)功能分析
傳統(tǒng)的身份認證系統(tǒng)采用中心化的結構,用戶的身份信息保存在底層數據庫中,一個完整的認證系統(tǒng)需要包含身份認證、身份注冊、身份更新和運行維護四大基本功能[11]。身份認證是將用戶提交的信息和保存在系統(tǒng)中的身份信息進行比對,判斷用戶是否合法;身份注冊允許用戶根據需要新建一個身份信息,由管理員審核后寫入數據庫;身份更新功能允許用戶對身份信息的非關鍵數據進行修改,管理員審核后對數據庫進行更新;運行維護是認證系統(tǒng)對功能模塊進行運行監(jiān)控、事件采集和數據維護,提高系統(tǒng)的安全性和運行效率。認證系統(tǒng)功能示意如圖3所示。
圖3 認證系統(tǒng)功能示意圖
3.1.2 基于區(qū)塊鏈技術的認證系統(tǒng)可行性分析
根據傳統(tǒng)身份認證系統(tǒng)的功能需求,結合區(qū)塊鏈技術的工作原理和技術架構,分析設計認證系統(tǒng)功能需求在區(qū)塊鏈3.0技術下的實現方式,具體的功能的實現方式見表2。
為了實現去中心化,身份認證系統(tǒng)需要遵循區(qū)塊鏈的運行原理和操作規(guī)范,區(qū)塊鏈3.0技術架構中的共識算法和智能合約在系統(tǒng)運行中起到重要作用,分布式賬本的操作需要在達成共識的情況下進行。區(qū)塊鏈3.0最重要的特征就是可編程智能合約和可設定共識機制,智能合約主要控制身份信息查詢和系統(tǒng)維護,身份注冊和更新需要全網節(jié)點共同參與驗證,通過共識算法判斷交易的合法性。在系統(tǒng)功能設計中,考慮到認證操作的頻繁,賬本的查詢可以由智能合約直接驅動,無須其他節(jié)點達成共識,提高了身份信息的查詢效率。基于區(qū)塊鏈3.0的認證系統(tǒng)功能如圖4所示。
表2 區(qū)塊鏈技術的認證系統(tǒng)實現方式
認證系統(tǒng)建立在區(qū)塊鏈網絡之上,遵循區(qū)塊鏈3.0技術規(guī)范和操作規(guī)則,建立在區(qū)塊鏈技術架構上。最底層為區(qū)塊鏈技術環(huán)境,主要是支持區(qū)塊鏈工作的網絡拓撲、密碼學、節(jié)點設置、計算方法和數據結構;第二層為區(qū)塊鏈核心層,是區(qū)塊鏈3.0技術應用的基礎,包括區(qū)塊鏈核心支撐、共識機制、區(qū)塊數據操作規(guī)范、網絡操作規(guī)范,區(qū)塊鏈3.0采用的是可設置共識,共識算法作為一個獨立模塊可選擇、可組合;第三層是區(qū)塊鏈3.0智能合約運行和網絡操作調用的支持環(huán)境,認證系統(tǒng)的智能合約運行在虛擬機之上,認證系統(tǒng)的各種操作通過過程調用協(xié)議和區(qū)塊鏈網絡之間進行通信;第四層是智能合約層,該層是整個技術架構的關鍵,身份認證系統(tǒng)的邏輯操作通過智能合約和區(qū)塊鏈進行交互,區(qū)塊鏈3.0允許用戶通過腳本語言編寫智能合約;最上層就是最終實現的區(qū)塊鏈3.0應用身份認證系統(tǒng),它包含身份認證、身份注冊、身份更新和運行維護四個模塊。身份認證系統(tǒng)技術架構如圖5所示。
圖5 認證系統(tǒng)技術架構圖
對認證系統(tǒng)包含的四個功能模塊之間和自身業(yè)務處理邏輯進行設計,其中運行維護功能不需要和用戶進行交互,其他功能均需要根據用戶錄入信息和用戶的選擇進行業(yè)務邏輯的流轉。具體模塊的業(yè)務邏輯流程如圖6所示。
圖6 認證系統(tǒng)業(yè)務邏輯示意圖
3.3.1 運行維護模塊
為了提高區(qū)塊鏈網絡的執(zhí)行效率和數據處理能力,在智能合約中設定啟動網絡緩存清理、區(qū)塊鏈賬本優(yōu)化和節(jié)點狀態(tài)重置等維護函數觸發(fā)的條件,當認證系統(tǒng)在節(jié)點計算機啟動后自動執(zhí)行智能合約,對優(yōu)化條件進行檢查,滿足條件則執(zhí)行維護操作,之后轉入認證界面,不滿足條件則直接轉入認證界面。
3.3.2 身份認證模塊
身份認證模塊是認證系統(tǒng)的核心功能模塊,主要工作原理是根據用戶的認證請求,將保存在區(qū)塊鏈賬本中的身份信息和用戶提供的信息進行比對,結果一致則返回成功認證信息,結果不一致則返回認證界面或轉入注冊界面。身份認證功能僅執(zhí)行查詢操作,不對區(qū)塊鏈賬本進行寫入和更新,且查詢僅限于區(qū)塊信息擁有節(jié)點自身數據,不查詢其他節(jié)點的區(qū)塊信息,為了提高查詢效率,降低節(jié)點計算機資源消耗,利用區(qū)塊鏈3.0技術架構中的可設置共識機制,身份認證功能模塊直接通過智能合約查詢區(qū)塊鏈賬本,無須其他節(jié)點參與驗證。
3.3.3 身份注冊模塊
參與區(qū)塊鏈網絡的節(jié)點計算機注冊身份,產生一個新增區(qū)塊數據交易,將身份信息寫入區(qū)塊鏈共享賬本,身份信息的擁有者就是產生交易的節(jié)點。用戶進入注冊界面,輸入身份信息,由頁面內置script函數根據設定的規(guī)則判斷信息的合法性,如果信息不合法,提示用戶修改,信息合法,則產生一個交易,并調用智能合約寫入函數,向全網發(fā)送交易廣播,區(qū)塊鏈網絡的其他節(jié)點參與交易的驗證,調用共識算法對交易進行計算,全網達成共識后將區(qū)塊信息寫入區(qū)塊鏈共享賬本。
3.3.4 身份更新模塊
身份更新功能和身份注冊功能類似,都需要對區(qū)塊數據進行修改。身份更新需要在身份認證完成后由用戶選擇進入身份信息修改頁面,由智能合約調用相應函數對賬本中保存的身份信息進行查詢,并將可修改的信息顯示在修改頁面的表單控件上,用戶輸入信息合法的情況下,產生一個區(qū)塊數據修改交易,調用智能合約,全網節(jié)點根據共識算法共同驗證并認可交易,最終對區(qū)塊鏈共享賬本進行更新。
區(qū)塊鏈的網絡結構是典型的P2P對等網絡,構建身份認證平臺的網絡環(huán)境,需要定義P2P網絡的通信方式,將待接入的節(jié)點壓入已連接的節(jié)點堆棧,實現節(jié)點的初始化連接。建立連接后,對節(jié)點的錯誤狀態(tài)進行跟蹤,利用節(jié)點發(fā)出的廣播報文,同步實現錯誤信息的處理。最后同步區(qū)塊鏈信息,如果鏈路狀態(tài)信息有更新,就向其他節(jié)點廣播交易信息,目標節(jié)點接收到報文后產生交易驗證數據。信息平臺網絡構建命令行如下:
var initP2PServer = () ; //定義P2P通信模式
var initConnection = (ws); //初始化連接
sockets.push(ws); //壓入已連接的節(jié)點堆棧
initMessageHandler(ws);
initErrorTracer(ws);//錯誤狀態(tài)跟蹤
write(ws,responseLatestMsg());//廣播
var initMessageHandler = (ws); //同步信息處理
var initErrorHandler = (ws); //錯誤信息處理
var handleNum = (message);
var connectToPeers = (newPeers) ; //連接新節(jié)點
智能合約是基于區(qū)塊鏈技術的應用開發(fā)的核心,它存儲在區(qū)塊鏈網絡上的一個特殊地址(合約容器)上,區(qū)塊鏈3.0技術提供了智能合約開發(fā)、調試和運行的環(huán)境,智能合約是去中心化應用業(yè)務邏輯的載體,是身份認證系統(tǒng)和區(qū)塊鏈底層交互的紐帶。智能合約的開發(fā)和普通可執(zhí)行程序開發(fā)有所區(qū)別,不需要考慮如何在操作系統(tǒng)和特定網絡環(huán)境中獨立運行,但要遵循區(qū)塊鏈數據操作規(guī)范和虛擬機運行條件約束。一個完整的合約由一組狀態(tài)變量和合約函數組成。
在編寫智能合約時,首先定義存儲用戶身份信息的結構體數據類型,定義結構體的代碼如下:
struct UserIfo{//定義身份信息結構體
string UserName;//用戶名
int32 UserPassword;//用戶密碼
string UserRole;//用戶角色
bool Registered;//注冊狀態(tài)
bool Enable;//可用狀態(tài)
bool Logined;//登錄狀態(tài)
...
}
身份認證系統(tǒng)智能合約主要功能實現邏輯偽代碼如下:
contract identification {
uint numRegistrants;//已注冊數量
mapping(address=>user) users;//用戶身份信息的地址映射
string tag;//執(zhí)行結果
function set_numRegistrants(uint i) {//設定注冊數
numRegistrants = i;
}
function get_numRegistrants() constant returns (uint v) {//查詢注冊數
return numRegistrants;
}
function register(UserIfo user){//身份注冊操作函數
if(user.Registered){
tag=fail;
}
else{
Register( user);//調用注冊事件(網絡廣播、共識計算、寫入賬本)
}
function login(user user){//身份認證操作函數
if(user.Logined){
tag=fail;
}
else{
Login( user);//調用認證事件(查詢身份信息數據)
}
function update(UserIfo newUser){//身份更新操作函數
....
}
.....
}
區(qū)塊鏈3.0應用開發(fā)完成后,需要使用Geth工具來啟動和部署。智能合約虛擬機是智能合約的運行環(huán)境。智能合約需要編譯產生可以運行在虛擬機上的二進制代碼,獲得合約區(qū)塊鏈地址和合約接口的二進制表示。運行在虛擬機內部的代碼被封裝起來,不能和操作系統(tǒng)、網絡環(huán)境和文件系統(tǒng)有任何的信息交換,其內部定義的變量和函數也是嚴格的設定調用條件。Geth在8545端口提供了過程調用協(xié)議接口RPC API,協(xié)議中數據傳輸采用JSON格式。
本文設計的認證系統(tǒng)分為區(qū)塊鏈數據操作部分和交互界面部分,采用了去中心化的結構,沒有中心服務器,交互界面客戶端通過分發(fā)安裝在每一個區(qū)塊鏈網絡節(jié)點計算機上,區(qū)塊鏈操作部分是認證系統(tǒng)的核心,其運行原理完全遵循區(qū)塊鏈操作機制。當一個交易產生時,通過過程調用協(xié)議啟動智能合約,并向區(qū)塊鏈網絡發(fā)送廣播,區(qū)塊鏈網絡中的節(jié)點接收到廣播中的交易信息,從交易信息中提取智能合約的參數,通過本地虛擬機運行智能合約進行運算,根據共識算法互相驗證數據,達成共識的數據作為區(qū)塊數據寫入賬本。身份認證系統(tǒng)的運行原理如圖7所示。
圖7 身份認證系統(tǒng)運行原理圖
傳統(tǒng)身份認證系統(tǒng)采用中心化的結構,中心服務器作為身份信息的所有者,負責身份信息的存儲和管理,用戶僅有對身份信息的部分操作權限。目前,區(qū)塊鏈技術的應用完全超出了金融領域,區(qū)塊鏈3.0提供的可設置共識和可編程智能合約使區(qū)塊鏈在其他領域應用成為可能。根據區(qū)塊鏈技術的去中心化思想,對身份認證系統(tǒng)的系統(tǒng)架構進行重新設計,讓區(qū)塊鏈網絡節(jié)點共同維護和管理身份信息,區(qū)塊鏈底層的樹型數據結構實現了操作信息的可追溯,保證了身份信息的安全可靠。P2P的網絡結構讓參與節(jié)點在網絡中擁有對等的地位,區(qū)塊鏈網絡中信息交換和數據驗證建立在平等公平的基礎上。區(qū)塊鏈提供的共識算法,讓參與節(jié)點共同驗證交易信息,可以有效地抵御網絡攻擊造成的信息惡意篡改。智能合約定義了對身份信息進行操作的函數,通過過程調用協(xié)議實現了交互界面和底層數據的實時交換?;趨^(qū)塊鏈3.0架構的身份認證系統(tǒng)解決了中心化認證服務的產生的各種問題,但在系統(tǒng)的易用性、可移植性和運行效率上還需要攻關突破,可以采用封裝技術來將智能合約、合約虛擬機和客戶端統(tǒng)一分發(fā)安裝在節(jié)點計算機上,通過改進的共識算法來提高運行效率。