王浩亮,廉玉忠,王麗莉
(東莞理工學院城市學院 計算機與信息學院,廣東 東莞 523000)
電子證照庫系統以信息技術作為中介取代持證方的中介作用,解放持證方的保管與攜帶證照負擔,為用證方提供及時、準確、全面的信息,是智慧城市建設的重要組成部分,已成為公民活動辦事的電子憑證,可助力電子證照資源跨地區、跨部門、跨層級共享。然而,傳統智慧城市建設以各自城市為中心,缺少頂層設計與統籌協調,制約了電子證照庫信息手段效能發揮,其存在的主要問題如下:電子證照數據來源各地區或部門組織,信息采集和應用過程中權責不分,一旦數據信息有誤,對數據追溯困難;電子證照存儲在各管理部門的數據庫中,信息存儲分散,獨立性強,產生大量“數據孤島”,由于采用各區域中心化架構,信息泄露安全隱患大,存在數據存儲不完整和人為篡改的可能性,信息的真實性和完整性不易分辨,使得各參與主體間的信任度大幅降低;電子證照庫的數字證書和電子簽章來自于各部門業務應用系統,沒有統一標準且不互通互認,難以統一,而且跨層級、跨部門、跨業務的數據共享和開發力度不夠,電子證照信息難以全面歸集與快速檢索。
區塊鏈[1]被認為是第5個最有潛力引發顛覆性革命的核心技術之一,逐漸被世界各國認可[2],區塊鏈對鏈上信息分區塊存儲,將前后區塊運用加密驗證方式進行鏈接[3],從而形成不可篡改的鏈式數據存儲方式,然后將鏈式數據分散在組網內所有節點上[4],有效防止單個節點數據遭到篡改或遺失,實現去中心化的分布式數據管理和不完全可信環境中的可信數據管理[5],具有防篡改、不可抵賴、強一致和完整性等特性[6]。2018年11月,國家市場監督管理總局、國家標準化管理委員會、國家電子文件管理部際聯席會議辦公室(國家密碼管理局)、國務院辦公廳電子政務辦公室聯合發布電子證照系列國家標準,為國家電子證照庫和基礎平臺建設,實現跨層級、跨部門電子證照互認共享、資源整合等提供了標準支撐,也是新型智慧城市建設由從單點布局向全局規劃的拓展,但同時電子證照的應用還處于起步階段。
針對上述傳統電子證照研究存在的不足,本文運用區塊鏈技術實現電子證照數據的鏈上、鏈下存儲和查詢,依靠智能合約進行鏈上證照交易,為電子政務提供便利。
區塊鏈來自于中本聰提出的比特幣(Bitcoin),成為以數字貨幣為代表的區塊鏈1.0[7]。以太坊(Ethereum)平臺以去中心化的特性解決了比特幣擴展性不足問題,成為以智能合約功能為代表的區塊鏈2.0[8]。目前,應用于金融、科學、政務、醫療、教育等領域區塊鏈3.0時代已經到來。
區塊鏈是一種分布式的、不斷增長的、共享的區塊分類賬[9],整個區塊鏈由多個區塊(Block)組成,各區塊包括區塊頭(BlockHead)和區塊體(BlockBody)。區塊頭記錄著識別區塊的唯一標志,多個區塊組成完整的區塊鏈,結構如圖1所示。

圖1 區塊鏈結構Fig.1 Blockchain structure
各區塊通過哈希函數生成的數字指紋以加密方式密封。每個塊通過引用其散列值[10]“鏈接”到前一個塊,綜合運用點對點傳輸、加密算法、共識機制、分布式數據存儲等技術,形成不可篡改的區塊鏈數據存儲方式,將鏈式數據及時共享到所有節點服務器中,有效防止單個節點數據遭到篡改或遺失。因此,通過區塊鏈多中心提供存儲和服務的技術,實現電子證照信息真實不可篡改的可行性,充分利用區塊鏈的可追溯、共享賬本、不對稱加密的特征來建設電子證照庫,具有更好的真實性、安全性和可行性。綜合上述特點可有效應對電子證照應用面臨的問題。
以太坊是一個具有智能合約的開源公共區塊鏈平臺[11]。智能合約相當于以太坊中的法律,是區塊鏈上的去中心化、可復制可信共享程序代碼[12-13]。在以太坊中,所有的交易都按照合約定義的操作執行。
基于以太坊的建鏈過程,根據開發程度[14]可分為公有鏈、聯盟鏈和私有鏈。國家機關針對全民開發共享的證照可以采用公有鏈,地方政府或各企業部門之間對特定的群體開放的電子證照可以采用聯盟鏈,各組織內部對各部門之間共享的電子證照可以采用私有鏈[15]。
自以太坊誕生以來,學者對區塊鏈應用進行了大量的研究與探討,文獻[16-17]將以太坊應用在電子拍賣系統,通過精心設計的智能合約防止操縱拍賣和用戶出價隱私,實現了在沒有可信第三方的情況下安全交易。文獻[18]提出基于區塊鏈和以太坊的物聯網安全和隱私問題的一些可能解決方案。文獻[19]設計了基于區塊鏈的分布式賬本,以防篡改的方式存儲從物聯網智能計量設備收集的能源消耗信息,用于智能電網層面的能源需求與生產匹配,并在以太坊平臺上實現了原型驗證。文獻[20]實現了去中心化眾籌平臺,提供多個基于以太坊平臺的智能合約模板,方便用戶創建符合自身的眾籌項目。隨著人工智能和深度學習技術的興起,假數字內容大量出現,人們采用一種基于Ethereum智能合約的解決方案和總體框架,即使數字內容被多次復制,也能追蹤和跟蹤數字內容的來源和歷史[21]。
區塊鏈技術在金融、物聯網、能源等領域得到眾多學者關注,并通過以太坊平臺驗證了其原型系統的數據加密、防篡改和可追溯等特性。但是,區塊鏈在電子證照相關領域的學術文獻較少且主要為理論研究[22],缺少可行的技術方案研究。因此,本文通過搭建基于以太坊的區塊鏈環境研究電子證照庫原型系統的實現方案。
本文的主要貢獻如下:
1)基于區塊鏈技術,通過以太坊平臺建立分布式多賬本,對電子證照信息分區塊存儲,對前后區塊鏈接通過加密驗證,保證了信息真實不可篡改,實現了電子證照數據的可信、可追溯。
2)采用區塊鏈技術的不對稱加密方式,發證方將每條電子證件信息通過公鑰加密上鏈共享,每條信息對應有單獨的解密私鑰并由持證方保管,可有效防止信息泄露,保證隱私安全。
3)基于區塊鏈技術的平權、共建的特點,構建歸屬各部門的目錄體系,以共建共享的原則對各參與主體的上鏈信息全面歸集、共享,同時在建立電子證照信息鏈的基礎上增加索引信息,從而實現快速檢索功能。
系統基于以太坊智能合約平臺構建私有鏈,將電子證照庫與區塊鏈技術相結合,主要功能為證照數據鏈上鏈下存儲,電子證照信息溯源檢索采用交易功能。
基于區塊鏈的電子證照庫參與主體分為頒證方、持證方和用證方,不同主體對應界面不同。系統流程如圖2所示。

圖2 系統流程Fig.2 System procedure
頒證方登錄平臺可以頒發證照,在填入證照名稱、編號、所屬人、期效等信息后,通過智能合約將證照信息加密上傳到信息鏈上,其中信息鏈、證照名稱和編號組成檢索信息上傳到檢索鏈,本地數據庫保存一份所屬人和檢索信息的數據便于檢索持有人所有證照。
持證方登錄平臺通過數據庫查找自己所屬的證照檢索信息,并且可以快捷定位到信息鏈上找到對應的證照區塊,用于查看和出示電子證照。出示電子證照時持證方會得到一個經過自己公鑰加密后的二維碼用于出示。用證方掃碼后需經過持證方授權確認,通過持證方的私鑰解密并且返回證照信息到用證方。
用證方登錄平臺根據需要可以掃取二維碼,經過持證方授權后查詢證照信息,從鏈上驗證數據的真實性,并獲得數據信息保存在部門系統。
在區塊鏈以太坊平臺上建立電子證照目錄索引信息和證照信息鏈,各行業部門可以建立自己的電子證照子鏈,通過上傳證書請求,申請加入電子證照主鏈。電子證照數據加密后寫入區塊鏈,并生成密鑰。
電子證照庫系統的體系結構如圖3所示,主要包含區塊鏈模塊、智能合約模塊、數據庫模塊和客戶端模塊4個模塊。
區塊鏈模塊的主要功能是將用戶提交的上鏈數據打包進區塊,由網絡中參與的節點通過共識機制確認后將區塊鏈接到鏈末端區塊,用來實現數據存儲以及數據溯源查詢,確保數據的安全性和完整性。
3.1.1 身份驗證
首先確保各參與方身份的真實性。系統采用了RSA非對稱加密算法,為保證安全使用2 048位的密鑰,公鑰用于標識系統內用戶的身份,私鑰用于數字簽名,確保用戶身份的真實性。數據完整性利用 Keccak 256哈希算法解決,與區塊鏈采用的SHA-256算法相比安全性高,效率明顯提升。
在頒證方進行上鏈操作前,核實和驗證證照信息的真實性,用戶將已認證的證照信息進行公鑰加密,使用證照時需要通過私鑰解密,Hash函數通過使用的Keccak 256算法形成摘要,將上一個區塊的Hash、隨機數、timeStamp傳入數據進行加密得到一個長度為256位的字符作為Hash地址。
密鑰通過密鑰派生樹來生成、管理。各個子鏈的數據密鑰由根密鑰派生出,子鏈間的數據互不可見,根密鑰擁有者可以查看各個子鏈的數據。管理部門只需保管根密鑰,即可根據派生路徑實時派生出各個節點具體的加密密鑰。再通過對證照數據進行歸類,一類數據的密鑰由具體的一個派生路徑派生出,并通過分享派生路徑上的密鑰實現對密鑰加密范圍內數據的共享。
3.1.2 驗證機制
當數據發生變化(新增、被惡意修改)時,會觸發驗證機制。如果是數據新增會驗證計算提交的Hash是否正確、上一個區塊Hash是否正確、自身是否為最后一個區塊。如果是數據被惡意修改,會重新計算Hash是否正確、驗證上一個區塊Hash是否正確、下一個區塊的前一個區塊Hash是否與當前Hash一致。
以太坊作為區塊鏈應用上最早提出智能合約的平臺,提供支持了圖靈完備的腳本語言,允許開發者在平臺上開發去中心化應用,創建和執行智能合約。
電子證照庫系統在以太坊平臺上建立私有鏈,提供給相關部門訪問節點,通過許可對各部門保持中心化。系統提供對應交互接口給不同身份用戶,用戶提交的數據經過智能合約進行上鏈存儲,通過非對稱加密方式保證數據的合法性。在智能合約模式設計方面編寫交互接口,將各參與主體所產生的數據進行上鏈存儲、查詢和用證交易。
3.2.1 電子證照上鏈存儲查詢
頒證方認證電子證照的真實性后對審核通過的數據進行提交,智能合約執行電子證照信息加密并寫入鏈上區塊生成密鑰,完成電子證照數據上鏈。系統根據生成區塊的哈希索引、私鑰以及證照提交方的信息存儲在關系型數據庫中。數據上鏈存儲查詢部分由結構體和存儲查詢函數組成,結構體中的屬性包括電子證照唯一標識 ID 和各參與主體需提交數據的屬性。數據上鏈存儲智能合約的部分solidity代碼如下:
contract ElectronicLicenseChain {//智能合約
struct ElectronicLicense{
uint license_id;//電子證照唯一標識ID
//頒證用戶需提交的數據
uint certificate_institution_id;
bytes32 certificate_institution_name;
…
//用證用戶需提交的數據
uint certification_body_id;
bytes32 certification_body_name;
//持證用戶需提交的數據
uint certificate_account_id;
bytes32 certificate_account_name;
//其他數據
}
//從電子證照id到結構體數據的映射
mapping(uint => ElectronicLicense)electroniclicense;
//存儲電子證照相關數據
function setElectronicLicense(uint license_id,bytes32 certificate_institution_name,…){
ElectronicLicense storage license_real = electroniclicense[license_id];
license_real.license_id = license_id;
license_real.certificate_institution_name = certificate_institution_name;
…
}
function setCertificateInstitution(…){…}//存儲頒證用
//戶的相關數據
function setCertificationBody(…){…}//存儲用證用戶
//的相關數據
//查詢電子證照相關數據
function getElectronicLicense(uint license_id,uint certification_body_id)constant returns(uint,bytes32,…){
ElectronicLicense storage license_real = electroniclicense[license_id];
return (electroniclicense[license_id].license_id
certificate_institution_name,
…);
}
3.2.2 電子證照使用
將傳統電子證照使用認證的過程轉移到通過以太坊區塊鏈網絡中部署的智能合約來進行,持證用戶通過用戶交互接口獲取持有證照的信息提交給用證方。為了提高證照信息的檢索交易效率,增加索引信息,將電子證照的信息使用外部數據庫進行存儲,并使用倒排索引對用戶持有的電子證照進行索引。
倒排索引將電子證照名稱與電子證照編號集合進行映射,通過名稱能夠快速定位到電子證照編號,從而進一步查詢證照的詳細信息。索引結構如圖4所示。

圖4 電子證照查詢倒排索引結構Fig.4 Inverted index structure of electronic certificate inquiry
通過用證機構中的各參與主體來共同制定智能合約,用證方提交信息并調用執行智能合約。根據索引值,在區塊鏈上檢索區塊并使用持證方的私鑰驗證電子證照信息的真實性。用證方在區塊鏈上進行證照驗證操作,同時作為一個交易被智能合約執行并記錄在區塊上。部分代碼如下:
contract LicensesTransaction {
//持證用戶使用電子證照
function useLicense(uint license_id,uint certificate_account_id,uint certification_body_id,uint price){
balances[msg.sender]-=price;
balances[receiver]+=price;
…
certificationRecord[license_id]= msg.sender;
…
} }
系統采用由區塊鏈系統構建的分布式數據存儲環境和Web應用需要的關系型數據存儲環境?;趨^塊鏈系統以太坊技術可視為一個數據庫,數據的變更由交易催化。一筆或多筆交易組成一個數據塊提交到數據庫中,使以太坊客戶端為一個去中心化的網絡。眾多節點對交易的驗證共同維護數據的真實性,保證數據的不可篡改。但是分布式數據在區塊鏈上的持久化仍存在交易開銷高、數據存儲量不足等缺點,為降低成本和提高效率,需要結合關系型數據庫系統進行交互。
系統將網絡應用交互接口基于關系型數據來維持和運行,用于存儲各身份用戶賬號用戶名、哈希加密后的密碼和額外的相關信息,如持證用戶電子證照的密鑰、描述等信息,通過賬戶信息的關系映射可得到對應區塊鏈的加密信息,提高查詢檢索用戶持有證照的信息效率。圖5為存儲于MySQL云數據庫中的數據結構,主要包括用戶表、電子證照表和用戶證照索引表。

圖5 數據庫結構Fig.5 Database structure
本文系統使用Java語言對客戶端模塊進行開發,利用Web3J進行智能合約的開發與部署和區塊鏈數據上鏈的操作,使用HTML+CSS+JS制作客戶端,為用戶提供可視化操作接口,使用戶能夠與智能合約進行交互。功能包括頒證方對證照的錄入、持證方對證照的查詢和用證方對證照的驗證。
頒證用戶證照錄入以及進行合約交易在Web交互接口實現的部分代碼如下:
//simpleStorage智能合約
SimpleStorage simpleStorage = SimpleStorage.load
(address,web3j,credentials,BigInteger.valueOf(200000),BigInteger.valueOf(20000000));
byte[] byteValueLen32 = new byte[32];
//cipherData加密的證照字節流
System.arraycopy(cipherData,0,byteValueLen32,0,cipherData.length);
//transactionReceipt上鏈信息
TransactionReceipt transactionReceipt = simpleStorage.set(byteValueLen32).send();
用證用戶證照認證以及進行合約交易在Web交互接口的實現部分代碼如下:
//simpleStorage智能合約
SimpleStorage simpleStorage = SimpleStorage.load(address,web3j,credentials,BigInteger.valueOf(200000),BigInteger.valueOf(20000000));
//index索引
BigInteger bigInteger = new BigInteger(index);
//byte經合約查詢的加密證照字節流
byte[] bytes = simpleStorage.get(bigInteger).send();
//plainData已解密的證照
byte[] plainData = RSAUtil.decrypt(bytes,keyPair.getPrivate());
本文系統基于以太坊開發環境搭建,操作系統采用Ubuntu的64位系統。建立私有鏈,提供給相關部門訪問節點,通過許可對各部門保持中心化,部門中用戶都可以加入其中成為參與節點讀取數據、發送交易、競爭記賬。智能合約的開發、編譯、測試和部署采用Truffle框架,區塊數據的分布式存儲采用Leveldb數據庫。實驗運用以太坊開發者測試網絡來配置模擬真實的以太坊網絡環境。前端應用基于Java進行開發與合約進行交互,實現對電子證照數據的存儲和查詢。
本文基于Solidity語言編寫實現智能合約[23],通過客戶端將Solidity源碼文件上傳,在區塊鏈上進行合約的部署如圖6所示。合約編譯生成后,通過調用智能合約中的相應函數完成數據的存儲。頒證用戶在操作界面進行上鏈數據提交如圖7所示,因為電子證照的繁雜和信息不統一,系統輸入證照信息時根據數據不同,用戶可自行添加輸入數據項。

圖6 智能合約部署Fig.6 Smart contracts deploy

圖7 頒發證照的交互界面Fig.7 Certificate-issuing interactive interface
通過測試網絡進行模擬頒證和用證流程,在頒發證照流程中,系統調用智能合約并將證照信息數據記錄到區塊鏈,證照信息成功上鏈后,得到摘要0x3443c68ac52b7eb3085ab76754d6d752fe6a97f82df0 a1379e655a7fb7613882,如圖8所示。通過Geth客戶端得到區塊上鏈過程數據如圖9所示。用證用戶用證查詢和提交的交互界面如圖10所示。用證單位通過持證用戶提交的數據信息,根據摘要信息查詢校驗證照數據信息的證照真實性。

圖8 證照提交返回摘要過程Fig.8 Process of certificate submission return summary

圖9 證照上鏈過程Fig.9 Process of certificate up chain

圖10 用證查詢的交互界面Fig.10 Interactive interface of certificate query
為對比用戶數據信息是否被篡改,系統后臺通過證照摘要調用合約執行和溯源證照數據,對比用戶提交的信息可以驗證數據信息是否被篡改,查詢過程如圖11所示。通過圖7和圖11的實驗對比顯示,溯源數據的數據信息與摘要查詢的數據信息哈希值一致,可證明數據未被篡改,說明本文提出方法的正確性。

圖11 證照查詢過程Fig.11 Process of certificate query
考慮數據有被篡改的可能,將圖7數據稍作修改并重新提交上傳。篡改的數據摘要為0d5ca27eb 3085ab76785acd5ca76fe6a97f82d2ea1e7665c62b5a71a 9082a,驗證從區塊鏈上查詢的證照信息為空,如圖12所示,可以看出輸入證照的數據不是有效的。

圖12 被篡改證照信息查詢Fig.12 Query of tampered certificate information
上述實驗在測試網絡上完成,說明了電子證照在基于以太坊區塊鏈上的數據安全和防止篡改具有可行性。對比傳統的證照系統,使用基于以太坊區塊鏈的電子證照系統只通過Solidity智能合約部署和執行支付少量的虛擬貨幣,而不需要較大的人力進行維護,簡化了操作流程,節省了成本,提高了效率。
本文提出一種面向電子證照共享的區塊鏈技術方案,該方案為基于以太坊的一個去中心化數據共享交易服務系統。將電子證照交易數據上鏈后打包入區塊中以保證數據可追溯性,鏈下數據存儲到數據庫降低交易成本。將頒證、用證各個環節的重要數據信息上傳存儲到區塊鏈中確保其不可篡改、真實可靠,通過智能合約的使用減少持證、用證過程中的人力損耗。實驗結果表明,本文電子證照的防篡改和溯源方案具有可行性,鏈上數據具有可溯源、防篡改等特性。正確運用區塊鏈技術可增強信任體系,有助于電子證照資源跨地區、跨層級共享及強化管理。下一步將繼續完善智能合約功能及以實現大規模證照交易數據的區塊鏈管理。