王秀利, 江曉舟, 李 洋
(中央財經大學 信息學院,北京 100081)
對企業而言,數據越來越有價值,甚至已經上升到戰略核心地位.企業關注的重點也從如何利用數據轉向如何保護數據.傳統的集中式存儲存在許多安全隱患,若防火墻被攻克或數據泄露,將導致大范圍數據丟失,而且也不利于企業內部多層級的訪問控制需求和監督管理.區塊鏈以數據難偽造、難篡改和可追溯引起了學術界和產業界的廣泛關注[1],成為解決上述問題的關鍵技術.以比特幣等數字貨幣為代表的區塊鏈 1.0[2]解決了去中心化等問題,但仍存在不足之處:(1) 交易完全透明且等待時間過長;(2) 在設計之初,有部分功能以規避監管為目的,并不適用于企業內部與行業內部;(3) 賬戶加密通常使用傳統的非對稱加密方式,在加密貨幣一對一的交易場景下可以提供很高的安全性,但對于企業內部場景,不便于靈活地訪問控制,也不便于密鑰的管理與保存.因此,傳統區塊鏈并不適合直接應用于企業.
對行業而言,同行業中的各個企業往往有合作與競爭的雙重關系——既需要各個企業數據共享來完成整個行業版圖的繪制,又需要保護好自己企業的數據.另外,各行業通常都有國家部門進行監管,如何在保證有效監管的同時又保護好各自的數據,成為了亟待解決的問題.
為解決上述問題,本文結合現實場景,分為企業內部與企業之間兩部分,利用屬性基加密(attribute-based encryption,簡稱ABE)對區塊鏈進行改進,提出一種新的企業內部訪問控制與企業之間數據安全共享模型.
區塊鏈是利用加密鏈式區塊結構來驗證與存儲數據、利用分布式節點共識算法來生成和更新數據、利用智能合約來編程和操作數據的一種去中心化基礎架構與分布式計算范式[3].比特幣、萊特幣是典型的公有鏈,所有節點中立、開放,并不適用于企業內部與行業內部.同時,由于所有節點都參與投票,交易的確認和區塊的形成速度都非常慢.以比特幣為例,每分鐘確認7筆交易,每10分鐘生成一個區塊[4](為了確保安全,通常需要等待6個區塊生成,即 1小時完成交易確認),這在很多行業內是無法接受的.與公有鏈對應的是許可鏈,即只有被許可的節點才能參與投票、記賬,其所有節點都在企業或行業內部,數量相對較少,因此響應速度較快.私有鏈、聯盟鏈都屬于許可鏈.
區塊鏈通常使用單鏈結構,將賬目、合約、交易等信息全部放在一條鏈上,所有參與計算的節點都在該鏈上投票以保證一致性.而這既沒有保護隱私,又因大量冗余數據造成響應遲緩,平行區塊鏈[5]應運而生.文獻[6,7]提出了雙鏈結構,所有參與的機構分享元數據及協議,但不分享數據.所有參與的機構都可以與其他機構交易,而保證隱私性.以此設計出兩類區塊鏈:(1) 僅存儲賬戶信息和交易后的信息,但不執行交易的賬戶區塊鏈;(2) 僅存儲對交易有用的信息并且執行相關交易的交易區塊鏈.這極大地提高了整個區塊鏈的運行效率,同時,將賬戶自身變動與交易信息變動相分離,增加數據管理的靈活性.其所使用的雙鏈結構主要用于金融領域,交易依然是一對一進行,未對原有非對稱密碼體制進行改動.
將區塊鏈應用于數據共享,業內已有實踐.如 Enigma[8,9]是一個分散的計算平臺,擁有隱私性與可拓展性等特點.通過安全多方計算,其數據查詢以分布式方式計算,任何一個節點都不能完整地訪問數據.通過脫鏈存儲技術,將區塊鏈與分布式散列表[10]相關聯,在區塊鏈上僅保存數據存放的地址.MedRec框架[11]將智能合約與訪問控制相結合進行自動化的權限管理,實現了對不同組織的分布式醫療數據的整合和權限管理.
非對稱加密[12]是保證眾多加密貨幣安全交易的基礎之一,它包含2個密鑰,即公鑰和私鑰.系統先以某種密鑰生成算法(如SHA256 Hash算法[13]、Base58轉換),將輸入經過計算得出私鑰(一串固定長度的字符串),然后采用另一個算法(如 Secp256k1橢圓曲線算法[14])分解私鑰生成公鑰,此過程是不可逆的.非對稱加密在區塊鏈中有兩種用途:(1) 數據加密,用信息接收者的公鑰對發送的信息進行加密,接收者以自己的私鑰解密;(2) 數字簽名,信息發送者以自己的密鑰對信息哈希值加密(簽名),接收者以發送者公鑰解密后與原文哈希進行比對,用以確認此信息確實由發送者發送,達到不可偽造和不可抵賴目的.
區塊鏈使用的橢圓曲線非對稱加密機制雖然可以提供很高的安全性,但其密鑰不可更改,且每個賬戶都要有單獨的密鑰.另外,加密貨幣只限于兩個賬戶之間的交易,因此不存在權限管理問題.而在企業內部,這種加密方式難以滿足大量員工對數據的多層級訪問控制.
ABE[15-17]以屬性為公鑰,將密文、私鑰與屬性相關聯,能更加靈活地表示訪問控制策略.ABE有以下優點:(1) 加密時只需要根據成員屬性加密消息,而不需要關心群體中成員的數量和身份,降低了數據加密開銷,也保護了成員隱私;(2) 只有符合密文屬性要求的群體成員才能解密消息,不符合屬性要求的成員無法解密,從而保證了數據安全;(3) 用戶密鑰與隨機多項式或隨機數相關,不同用戶的密鑰無法聯合,防止了用戶的串謀攻擊;(4) 支持基于屬性的靈活訪問控制策略,可以實現屬性的與、或、非等門限操作.因此,ABE在細粒度訪問控制、隱私保護等方面具有良好的應用前景.
使用樹狀圖表示訪問控制策略,以T表示.樹中葉結點表示屬性,非葉結點表示與、或等邏輯門限.設U={A1,A2,…,An}是系統中的屬性集合,leaves(T)表示T中所有葉結點集合.設numv為v的子結點數,kv(1≤kv≤numv)為v的門限值,以att(v)表示與結點v有關的屬性.給定一個屬性集U和訪問控制策略樹Tv,如下定義函數F(U,Tv).
· 若v是葉結點,當且僅當att(v)∈U時,F(U,Tv)=1;

· 在其他情況下,F(U,Tv)=0.
哈希算法是一個函數,將任意長度的數據作為輸入,都將被映射為固定長度的字符串.同時,它也是一個單向函數,由輸入可以輕易地算出數據的哈希值,卻無法由哈希值逆向推出原數據.
Merkle樹[18]是基于哈希算法的樹型數據結構,每個非葉結點都是其葉結點的哈希值.將數據進行分組哈希,并將生成的新哈希值插入到樹中,如此遞歸,直到只剩最后一個根哈希值.相較于對所有數據打包進行哈希計算而言,這極大減少了工作量.以圖1為例,當加密文件3出現改動時,需要更新哈希值,若不使用Merkle樹,則要把所有4個文件重新哈希;而使用Merkle樹,則只需重新計算哈希值3和6,便可以得到新的根哈希值.
本模型分為5層:存儲層、區塊鏈服務層、API層、鏈上代碼(智能合約)層、應用層,其架構如圖2所示.
· 存儲層:為快速生成檢索區塊,采用鏈下存儲方式,即鏈上只存儲數據地址,原數據經過對稱加密后存儲在底層數據庫,由企業維護.存儲層設在企業內部,其存儲結構可以使數據擁有者在將數據存入時決定數據的訪問控制策略;
· 區塊鏈服務層:分為企業鏈(company blockchain,簡稱CBC)和行業鏈(industry blockchain,簡稱IBC).其中,CBC記錄企業內部的數據存儲地址與變化情況,由企業內部節點共同維護,確保不同節點狀態一致,提供基于屬性的訪問控制服務;IBC記錄行業內部企業之間的數據交換與調用,數據的請求與共享都將記錄在IBC上以便查詢和監管;
· API層:接口用于數據的查詢、區塊廣播、發送等;
· 鏈上代碼層:提供智能合約服務.主要功能是提供屬性基訪問控制,即在CBC與IBC上提供自定義的訪問控制策略,只有滿足特定屬性(或級別)的賬戶才能讀取(或寫入)數據;
· 應用層:提供各種應用程序,如監管系統、查詢系統等.
無論企業內部還是行業內部,都是弱信用環境.因此本模型基于聯盟鏈,即只有被許可的節點才能進行讀寫操作.同時摒棄了公有鏈常用的 POW,POS等共識機制,而是使用信用制,當發現節點有違規寫入垃圾信息或其他作惡行為,則直接將其剔除出整個系統,收回其權限.
整個行業區塊鏈系統由3種節點維護,分別為企業節點、行業節點與邊緣節點,節點之間關系如圖3所示.各自職能如下.
(1) 企業節點:用于維護企業鏈.當新數據達到閾值后,企業節點將數據經過對稱加密后存放至底層數據庫,并將其存放地址和密鑰及Merkle樹一同放到鏈上用于查詢與驗證;
(2) 行業節點:用于維護行業鏈而非企業內部數據,由行業協會或行業內所有企業共同維護,用于確認行業內各企業之間的數據交互(數據交集查詢).行業節點僅維護行業鏈而不屬于任何企業鏈.其主要功能是便于監管機構或行業協會對行業鏈進行監管;
(3) 邊緣節點:同時加入企業內部區塊鏈網絡與行業區塊鏈網絡,用于連接企業鏈與行業鏈,進行數據傳遞.企業鏈與行業鏈使用同一套屬性基加密算法,將授權中心 CA部署在邊緣節點可以提高資源利用率.當某企業在行業鏈上發出數據共享請求時,其他企業邊緣節點上的智能合約自動驗證其訪問權限,并進行交集操作.
整個系統包括企業鏈與行業鏈兩部分,是平行區塊鏈結構:企業鏈負責存儲具體數據的位置索引,行業鏈負責記錄企業之間的數據交集操作.具體如下.
(1) 企業區塊鏈:確保企業內部數據的安全與可追溯.
當緩存區中的數據達到閾值,企業內部節點將其加密后傳輸至底層數據庫中,同時將數據的輸入時間戳、區塊長度及前一個區塊的哈希值作為區塊頭,根據訪問控制樹將數據位置索引、明文形式的訪問控制策略和數據Merkle根加密后打包成塊,存儲至區塊體中,其后上傳至企業鏈上.其數據存儲結構如圖4所示.
(2) 行業區塊鏈:將行業內各企業置于監管之下,并可通過多方計算將所有企業的數據進行統一分析.
與企業鏈中的準備工作相同,每個企業在將數據位置索引上傳至企業鏈時,將行業內其他企業的屬性也納入訪問控制樹中,一個典型的屬性基加密策略樹如圖 5所示.其左支代表對企業的屬性要求,右支代表企業中有權限部門的賬戶要求.只有特定企業中的特定部門才能進行解密.數據請求者在提出數據交集請求時,需將所請求數據與含有自己屬性的令牌一同發布至行業區塊鏈上.所有企業的邊緣節點都將驗證其是否有訪問本企業數據的權限,只有通過權限驗證,邊緣節點才會自動對所請求的數據進行交集操作,并返回給請求企業.由于屬性基訪問控制策略的存在,全行業鏈節點都將記錄這一過程,但只有交易雙方可見交易的細節.另外,對于需要監管者查看所有數據的行業,可直接將監管者屬性列入訪問控制樹左支,即可使其擁有訪問權限.
數據存儲方面,本模型使用了密文存儲與脫鏈存儲來保證數據的安全.
(1) 密文存儲:由于系統主要功能是保護企業內部重要數據,通常是用戶隱私數據、財務數據等,因此底層存儲應采用密文存儲.而直接使用非對稱加密會導致密鑰管理混亂,同時對于大量底層數據而言效率不高.因此,選用對稱加密方式對底層數據進行加密;
(2) 脫鏈存儲:由于區塊鏈處理速度較慢,不適宜將所有數據直接存儲在鏈上,因此使用脫鏈存儲.通過建立分布式散列表,區塊鏈存儲對數據的引用,而非數據本身.數據在存儲時進行加密,并編輯數據訪問控制策略.Merkle樹保證了數據即使沒有存在鏈上,也不能被篡改,且在部分數據變動后可以較小代價更新Merkle根.
該方案由企業鏈與行業鏈兩個相互隔離又可通過邊緣節點相互通信的雙鏈系統組成,其中:企業鏈用于加密存儲企業內部數據的地址,行業鏈則用于記錄行業內部企業之間的數據請求.具體步驟如下.
3.2.1 企業內部訪問控制
(1) 初始化:根據安全參數lλ,由授權中心CA執行產生主私鑰mk和公共參數pp;
(2) 身份注冊:企業內各部門向系統提出注冊申請,獲取其真實身份信息對應的標識UID及屬性集合SU;
(3) 密鑰分發:按照密鑰分發算法KeyGen(mk,SU),CA根據注冊者屬性集U∈SU,計算其屬性私鑰、屬性參數,并由此計算出使用者的私鑰SK,將其通過安全信道發送給使用者保存;
(4) 加密數據:數據上傳者根據訪問者的屬性對數據制定訪問控制策略樹StrGen(SU)→Tcom,隨機生成對稱加密密鑰rs,數據經過對稱加密計算后放入底層數據庫.對稱加密算法可以表示為
(5) 數據上傳:企業節點根據訪問控制策略樹對數據索引地址add、對稱加密密鑰rs進行加密,并將其廣播至區塊鏈.同時,節點生成該數據索引id與鏈上數據的映射,將其放入底層數據庫(不與經對稱加密后的數據一同存放):
(6) 訪問密文:訪問者根據數據索引id在鏈上查得該數據的地址與對稱加密密鑰.若該訪問者沒有權限訪問此數據,則無法得到密鑰rs,無法對索引地址進行解密,也就無法訪問原數據;若該訪問者屬性滿足訪問控制策略樹,則其可以解密得到地址add與密鑰rs,可以至底層數據庫訪問該數據:
3.2.2 行業內部訪問控制
(1) 前4步與企業內部數據訪問控制相同,但在對數據加密時,其訪問控制策略樹不僅考慮企業內部賬戶,還加入行業內其他可進行交集操作的企業屬性SU′,StrGen(SU′)→Tind;
(2) 令牌生成:每個企業生成一個token令牌,包含該企業的權限與屬性信息;
(3) 加密請求:請求數據的企業將需要與其他企業進行交集操作的數據D(d1,d2,d3,…,dn)用訪問控制樹Tind進行加密,使其僅滿足被請求企業的屬性:
(4) 發送交集操作請求:請求數據企業將加密后的數據與自己的令牌一同發送至行業區塊鏈上,所有企業都可以看到并記錄這一消息,并由令牌中的信息判定其來源,但只有符合密文中所包含的訪問控制樹的企業節點可以解密此消息:
(5) 交集操作:由于邊緣節點既是企業鏈的節點,又是行業鏈的節點,被請求方的邊緣節點在完成解密后,可以自動在其內部企業鏈上檢索該數據是否開放給請求方.若接收到的令牌可以滿足交集數據的訪問控制樹,則邊緣節點自動將數據進行交集操作,并通過安全信道返回給請求方:
(6) 上傳區塊鏈確認:當請求方完成交集操作后,全局廣播一條包含此令牌的數據,表明已完成交集操作,其他企業確認后將此行為記錄在行業區塊鏈上.
以A,B,C這3家處于同一個行業鏈中的企業為例.A為數據請求方,B和C為數據共享方.其中,B在企業鏈的訪問控制樹中將本年度1月~3月數據設為對A可操作,而C只共享了一月數據給A.A試圖請求B,C的1月、2月數據用作交集操作,則將自己1月、2月數據經過Enc(D(JanA,FebA))得到cphA,此密文所含訪問控制樹僅B,C可解密.將cphA連同tokenA發送至區塊鏈.B和C都將接收到此信息,但邊緣節點用tokenA嘗試解密各自的1月、2月數據時,只有B能完成操作,則B的邊緣節點將D(JanB,FebB)∩D(JanA,FebA)返回給A,C返回空.在B,C都完成上述操作后,A將自動向區塊鏈廣播一條消息表明已完成交集操作.
假設B在企業鏈的訪問控制樹中將數據d1,d2,d3設為對A可操作,而C只共享d1給A.A向B和C提出d1,d2,d3數據交集申請的具體算法如下.
算法.
1.B,C利用StrGen(SU)分別生成各自的TindB和TindC;
2.B,C分別使用隨機生成的對稱密碼對數據加密:
3.B,C根據各自策略樹對數據地址索引與對稱密碼加密:
4. 數據上鏈:
5.A向B,C發起交集請求,B的邊緣節點將會進行如下操作:
對于C,由于A不滿足C設定的交集訪問權限,因此無法使用Dec算法解密數據,返回null.
6.A在完成上述操作后,將此操作上傳至行業區塊鏈IBC,使行業鏈上的其他企業都記錄下這一操作過程:
表1從數據安全、企業間弱信用環境和數據存儲等方面將本模型與傳統區塊鏈進行對比分析.
隨著區塊鏈的快速發展,越來越多的應用場景被開發出來,其在數據存儲與共享方面的研究與實踐也受到廣泛關注.本文提出一種應用區塊鏈的數據訪問控制與共享模型,用屬性基加密對現有區塊鏈的加密方式、數據存儲方式進行了改進,以滿足數據在企業內部的訪問控制以及企業之間數據共享的需求,達到了細粒度訪問控制與安全共享的目的.其中,脫鏈存儲、非對稱加密與對稱加密相結合的措施已可在Hyperledger Fabric[19]等平臺上實現.

Table 1 Comparative analysis between the model and traditional blockchain表1 本模型與傳統區塊鏈對比分析