檀鐘盛,陳春暉
(福建工程學院 互聯網經貿學院,福建 福州 350118)
2019年發生Covid-19疫情,中國政府反應迅速,采取果斷措施,其中健康碼就是措施之一。健康碼是一項可以安裝在智能手機上的軟件,個人可以實名認證并填報健康狀況[1]?!敖】荡a”誕生于數字政府建設發達的杭州。杭州健康碼是依據《浙江省疫情防控責任令》,為解決疫情期間返工返崗及公共空間管控而采取的應急性技術治理措施[2]。隨著疫情常態化,健康碼也出現長期存在的趨勢,但目前健康碼存在著以下問題:(1)信息不安全。主流健康碼平臺目前仍是中心化系統,中心化平臺容易遭受外部攻擊。例如,北京健康寶就曾在疫情的高峰期,遭到境外網絡的攻擊。而且這樣的攻擊并不只有一次,早在北京冬奧會、殘奧會期間,健康寶就曾多次遭受境外攻擊,一旦這些外部攻擊成功,將會導致不可估量的損失;(2)各地健康碼相互不流通。在疫情防控中,健康碼幾乎等于身份通行證,然而目前由于數據不共享、地方政策不同等原因導致各地健康碼各不相同,互不相認,甚至出現同一省份出現省市兩級不同的健康碼,造成了碼上加碼,給交通樞紐的人群造成不便;(3)健康碼中私人隱私保護不足。健康碼數據中涉及姓名、身份證、聯系方式等大量敏感數據,然而目前健康碼平臺五花八門,個人信息需要多次提交,泄露風險高。尤其在疫情期間,確診患者信息泄露,極有可能導致社會歧視、網絡暴力等嚴重后果;(4)健康碼穩定性。由于主流健康碼是中心化系統,一旦系統發生故障,可能導致系統數小時不能正常使用,給市民造成極大不便;(5)健康碼職權濫用。健康碼作為政府防疫工作中的重要工具,已經成為社會的普遍共識。在特殊的疫情時期,紅碼已經成為禁止令,濫用紅碼是對國家公信力的損害。區塊鏈去中心化、可追溯、公開透明等特點為解決上述問題提供了技術支持,該文將區塊鏈技術與非對稱加密相結合,提出了一種基于區塊鏈技術的健康碼方案,并基于此方案構建一個系統來驗證上述方案的可行性。
比特幣屬于區塊鏈(blockchain)的1.0版本,比特幣可以在沒有第三方的情況下進行交易[3]。區塊鏈能夠將數據分布式存儲在不同的節點,任何節點都必須按照共識協議進行更新,從而實現了多方信息共享和監督[4]。Buterin在2013年提出了以太坊,它作為區塊鏈2.0版本在區塊鏈1.0的基礎上,新增了圖靈完備的編程語言,首次將區塊鏈和智能合約相融合[5]。Nick Szabo[6]提出智能合約的概念,智能合約是一種可執行或驗證的計算機協議,智能合約一旦生效就會堅定不移地按照合約內容進行自我驗證和自我執行[7]??偟膩碚f,區塊鏈由數據層、網絡層、共識層、應用層、激勵層和合約層組成,具體架構如圖1所示。
區塊鏈主要有以下兩大特點:(1)去中心化:區塊鏈是由各參與節點組成的P2P(Peer to Peer)網絡構造的,沒有中心服務器,所有參與節點都是服務器,數據分布在各個參與的節點上,所有節點在區塊鏈中都是平等的。(2)不可篡改性:數據經過節點驗證通過后會被永久存儲在區塊鏈上,除創世區塊外,每個區塊都有上一個區塊的Hash值,如果修改某個區塊的數據,則之前所有區塊的Hash值都要重新計算,除非能掌握區塊鏈中51%算力,否則某些惡意的節點修改是無效的。
1976年,非對稱加密這一概念首次由W. Diffie和M. Hellman提出。非對稱加密需要兩個密鑰,即公鑰和私鑰。非對稱加密的公鑰和私鑰是成對產生,如果使用公鑰對一個明文進行加密,那么只有對應的私鑰可以對密文進行解密。反之,如果用私鑰對一個明文進行簽名,那么同樣也只有對應的公鑰可以對其進行驗證,具體非對稱加密原理見圖2。目前,RSA加密算法是用途最為廣泛的非對稱加密算法之一。

圖2 非對稱加密流程
RSA加密算法目前是最有影響力的公私加密算法之一。RSA密碼體制中包含一組密鑰對,公鑰和私鑰,私鑰歸個人保管,公鑰可公布給所有人。使用RSA加密首先需要知道接收方的公鑰,使用接收方的公鑰對明文進行加密,發送方將密文發送給接收方,此時即便遭遇外部攻擊信息被攔截下來,攔截方沒有對應私鑰也無法破解加密文件,接收方收到密文使用私鑰解密獲取明文。RSA加密算法安全性依賴于大數的因式分解,將兩個大質數相乘是十分容易的,但是對兩個大質數進行因式分解是十分困難的,所以用乘法作為加密密鑰,安全性極高[8]。
RSA生成算法如下:
(1)隨機產生兩個不同的大質數p、q;
(2)計算n=p*q,同時計算歐拉函數φ(n)=(p-1)*(q-1);
(3)隨機產生一個整數e,e與φ(n)互質,令gcd(e,φ(n))=1,且滿足1 (4)計算d≡e-1(modφ(n)); (5)公鑰PublicKey={e,n},私鑰PrivateKey={d,n}。 為了保證健康碼隱私不被泄露和信息非法篡改的問題,去中心化和非對稱加密是健康碼方案中不可忽視的重要環節。區塊鏈作為一項新型技術,其去中心化、不可篡改等特點可用于多個領域,比如醫療[9]、籌款[10]、能源[11]、人工智能[12]、金融[13]、疫情預警[14]等。文獻[15]提出了一種基于Django架構的校園健康碼系統,系統高效整合了校園健康碼信息,但系統并未對校園師生的信息進行加密存儲。文獻[16]使用TDC搭建了健康碼系統,但同樣未能對用戶信息進行加密保護。文獻[17]討論了由于數字技術抗疫成為主流抗疫手段,導致了個人私密信息的泄露,應該加強對信息匿名化和脫敏化的處理。文獻[18]認為目前App(Application)的隱私泄露嚴重,應該加強對App用戶的法律保護。然而,中心化平臺對信息有著絕對的控制權,故其容易遭受外部攻擊導致信息被篡改或泄露。為了解決中心化帶來的種種問題,相關工作則研究基于區塊鏈技術的Dapp(Decentralized Application)應用。例如文獻[19]提出了一種基于區塊鏈技術的個人信息管理系統,使用區塊鏈來管理信息。文獻[20]提出利用區塊鏈技術做一個隱私性投票,在不透露投票人的隱私的前提下通過投票決定是否進行以太幣資助。文獻[9]提出了基于區塊鏈的電子病歷,通過部署在區塊鏈上的智能合約來對病歷進行增加、刪除、修改、查詢等功能。文獻[21]提出將區塊鏈技術與云存儲技術相結合,實現基于區塊鏈技術的醫療數據存儲方案。上述研究雖然利用區塊鏈技術防止了信息被篡改,但是并沒有考慮到用戶隱私泄露的問題。綜合上述情況,該文提出將區塊鏈技術與健康碼相結合。利用區塊鏈去中心化、信息公開透明、可追溯等特點保證了健康碼信息公開透明,打破數據壁壘,為全國統一健康碼的使用奠定了基礎,同時滿足了系統安全、用戶隱私保護和紅碼追責的需求。 將區塊鏈技術引入健康碼平臺設計,基于以太坊平臺進行去中心化的健康碼方案設計。功能包括申請健康碼、健康碼信息展示、健康報備、高風險區域黃碼等功能。為了保證用戶隱私不被泄露,系統會用非對稱加密對用戶重要信息加密,然后上傳區塊鏈,以此保護用戶隱私可靠,避免了用戶的隱私泄露被不法分子利用,同時利用區塊鏈不可篡改、去中心化的特點有效解決了信息安全的問題。 相較于傳統的健康碼平臺,所提出的方案以區塊鏈技術為核心,通過利用區塊鏈不可篡改、去中心化、公開透明等特點實現了基于以太坊智能合約的健康碼系統,有效解決了健康碼信息安全、個人隱私泄露、紅碼追責等問題。 圖3展示了基于以太坊智能合約的健康碼系統中用戶提交數據進行鏈上存儲以及平臺操作流程。 圖3 業務模型 首先,用戶提交信息到系統,系統收到用戶的信息后使用平臺公開的公鑰對用戶的隱私信息,如身份證、電話等進行加密;然后,將加密信息上傳到以太坊。平臺收到用戶上傳的加密信息使用平臺的私鑰解密得到原始信息,確認用戶信息無誤則審核通過。 健康碼平臺會對用戶信息進行各類分析,用戶過去14天行程中去過高風險地區,健康碼則會從綠碼變為黃碼,變回綠碼需要兩次核酸檢測,若兩次核酸均沒有問題,則自動變回綠碼,紅碼人員在完成居家隔離和醫學觀察后,自動轉為綠碼,后臺會自動把用戶的健康信息更新到區塊鏈上,方便工作人員查詢。 系統分為三個部分,Web前端模塊、中間模塊、區塊鏈模塊,系統具體架構如圖4所示。 圖4 系統架構 應用層Web模塊使用react為前端框架。Web模塊為用戶提供良好可視化的交互界面,提交多方請求,通過智能合約提供的接口將數據提交到區塊鏈上。 中間模塊由智能合約與Web3組成,用戶與健康碼平臺的需求與業務邏輯均以智能合約的形式寫入以太坊節點中。智能合約規定了各方的執行操作和操作規范,所有的操作只能按照智能合約的內容執行。該文使用Solidity語言編寫智能合約,實現健康碼平臺的各項功能。Web3是實現智能合約具體操作的接口API(application programming interface),通過Web3獲取節點的狀態、監聽事件、調用合約等,實現智能合約和上層應用與以太坊的交互。 以太坊分布式交易賬本為底層提供數據存儲環境,支持并存儲智能合約操作所產生的各個區塊,使用PoW(Proof of Work)共識協議來實現記賬功能,每個節點會得到一個防篡改、真實的賬本。 Web前端頁面主要分為用戶注冊、用戶信息查詢、高風險地區判斷、行程申報共四部分。Web交互界面采用Html、Css 和Javascript進行界面設計,使用react開發交互界面。通過web3.js(與以太坊兼容的JavaScript API)與以太坊節點連接,從而調用智能合約方法。通過remix(以太坊官方推薦的網頁編譯器)來進行智能合約的編寫與測試,利用MetaMask插件(以太坊錢包)與以太坊進行交互,生成的交易數據通過MetaMask錢包發送到以太坊網絡,并通過MetaMask錢包支付gas(以太坊中每步操作都會消耗一個固定的消耗值)手續費等支付操作。 在業務層進行應用開發,首先需要對智能合約進行編寫,健康碼智能合約屬性信息見表1。用戶結構體包含了身份證、姓名、聯系方式、核酸檢測等信息詳情,見表2。 表1 健康碼合約屬性 表2 用戶結構體屬性 3.3.1 用戶注冊 用戶注冊是本系統主要功能之一,用戶需要提交信息到系統,系統會對用戶的隱私信息進行加密,加密算法使用RSA算法。系統收到用戶提交的信息后,使用平臺發布的公鑰對用戶隱私信息加密,之后將加密后的信息上傳區塊鏈,平臺工作人員通過區塊鏈獲得用戶加密信息,用平臺私鑰對加密部分進行解密,審核用戶信息,確認沒有問題則審核通過。用戶注冊的合約代碼如下: Algorithm 1:addper (1)//生成公密鑰 (2) key=NodeRsa({b:指定密鑰長度}); (3)//導出公鑰 (4) pub=key.exportKey(public); (5)//導出私鑰 (6) pri=key.exportKey(private); (7) myEncrypt=NodeRsa(platform_pubKey); (8) //加密隱私信息 (9)Encrypt=myEncrypt(person_message, 'base64'); (10)function (person message){ (11) perinfo memory pe=perinfo({ (12) identify :經過公鑰加密過的身份證, (13) status :健康碼狀態, (14) …… (15) phone :經過公鑰加密的聯系方式 }); (16)//加入用戶集合 (17) person.push(pe); 3.3.2 判斷是否為黃碼 健康碼分為綠碼、黃碼、紅碼,其中黃碼的判定規則為過去14天去過高風險地區,并且沒有做過核酸檢測的人員。判斷為黃碼的人員變回綠碼需要做兩次核酸,若兩次核酸都為陰性則轉回綠碼。高風險地區判斷合約代碼如下: Algorithm 2:isYellow (1)function() onlymanage { (2) for(i=0;i (3) for(j=0;j< 2 weeks;j++){ (4) //過去14天去過風險區則為True,反之為Fales (5) flag=isEqual(14天行程,高風險地區); (6) //如果為真則修改健康碼狀態 (7) if(flag){ (8) status=黃碼; (9) } (10) } (11) } (12)} 實驗在window10操作系統下設計實現,在構建的基于以太坊智能合約的健康碼系統下構建以太坊開發環境,同時實現健康碼功能,需要安裝Node.js,Truffle框架,MeatMask錢包,Ganache-cii測試框架,web3.js,remix。使用remix來測試智能合約的功能,通過Ganache模擬以太坊的真實環境,最后部署到以太坊rinkeby網絡上。 針對系統的用戶注冊、平臺審核、黃碼判斷、信息展示等一系列重要功能做了測試。用戶注冊、平臺審核等一系列會改變區塊鏈數據的操作都會通過MetaMask錢包打包到以太坊節點中。信息展示操作不會對區塊鏈數據產生修改的操作,只產生調用信息,無交易。 部分重要模塊功能實驗如圖5所示,圖5展示了用戶注冊時的操作??梢钥吹?用戶上傳的部分隱私信息將會以密文的形式顯示。 圖5 信息展示 以太坊中需要改變狀況的操作都需要消耗gas。gas price是單個gas的價格,實際交易花費成本為gas* gas price。在該系統中,智能合約部署在以太坊rinkeby網絡中,部署合約的賬戶地址為0xC2FC51c9e D99905bCBDcB1d5fe9296E6E5977510,智能合約的部署地址為0x1eda70be3a1fd92dfa783c698c00fb5114fdc dbd97d92890223e6da6dbd855ef。利用智能合約分析各函數消耗的花費。合約發起者發起constructor需要花費0.004 383 7 ETH(以太幣)。用戶注冊addper需要花費0.000 806 78 ETH。工作人員對與確診病例軌跡重合人員變更為黃碼需要花費0.000 120 57 ETH。工作人員對確診病患或高風險人員設置紅碼需要花費0.000 078 892 ETH。工作人員對病愈人員或核酸檢測超過2次為陰性的人員變更為綠碼需要0.000 097 492 ETH。智能合約具體花費見表3。表3證明了方案所消耗的成本是可接受的。 表3 智能合約花費測試 與文獻[15-18]所提出的方案進行對比,具體對比見表4。文獻[15-16]提出了一種健康碼方案,但方案僅實現了健康碼的監控功能,并未保障健康碼用戶的隱私安全。文獻[17-18]提出應對用戶信息進行脫敏處理,但方案沒有考慮中心化系統帶來的危險,且未解決信息孤島問題。文中方案利用區塊鏈解決了中心化和數據孤島問題且保證了數據可溯源,同時利用非對稱加密保障了用戶的隱私安全。通過與現有文獻的比較,不難看出提出的基于區塊鏈和非對稱加密的健康碼方案能夠有效地保障在疫情下的人身安全,且能夠有效保護用戶隱私安全。 表4 相關方案功能比較 區塊鏈技術本質上就是分布式數據庫,區塊鏈上各個節點通過共識協議記賬,它與傳統數據庫最大的區別就在于中心化和非中心化。方案根據區塊鏈技術去中心化、不可篡改、信息可追溯等特點,研究設計了基于以太坊智能合約的健康碼方案,該方案采用非對稱加密,保證了用戶隱私信息的安全性,同時利用區塊鏈公開透明、不可篡改等特點,確保了信息的真實性。但該方案在具體實現過程中仍存在一定問題和挑戰需要解決。如讓電信、聯通等運營商共享海量數據、共同維護方案的運行。解決上述問題,對方案進一步落地具有重要意義。對區塊鏈技術在疫情健康碼方面的應用提出了設計方案,希望能對當前健康碼存在的痛點提出新的解決思路,也希望對接下來區塊鏈的應用研究做一些啟發和建議。 在后續工作中,還將繼續完成健康碼智能合約的邏輯需求,并將區塊鏈和移動端開發相結合,進一步實現健康碼方案的可靠性與多適用性。1.3 相關研究
2 系統架構模型
2.1 業務模型

2.2 系統技術架構

3 模塊功能與合約設計
3.1 前端設計
3.2 合約屬性設計


3.3 合約功能實現
4 實驗分析
4.1 方案可行性


4.2 其他方案分析

5 結束語