何佩, 鄭文斌, 池曉金, 蔡怡挺, 姚紅靜
(1.西北工業(yè)大學(xué) 計(jì)算機(jī)學(xué)院, 陜西 西安 710072; 2.國網(wǎng)浙江省電力有限公司溫州供電公司, 浙江 溫州 325000)
隨著電力物聯(lián)網(wǎng)發(fā)展及能源數(shù)字化轉(zhuǎn)型,電力邊緣智能終端的適用場(chǎng)景不斷拓展,構(gòu)建具備邊緣側(cè)智能感知及分析處理能力的電力邊緣智能終端已成為數(shù)字化電網(wǎng)的迫切需要和必然發(fā)展趨勢(shì)[1]。電網(wǎng)作為國家重大信息安全基礎(chǔ)設(shè)施,此時(shí)面向終端數(shù)據(jù)存儲(chǔ)和交換的信息安全成為用戶日益關(guān)注的焦點(diǎn)之一。
應(yīng)用中大容量存儲(chǔ)設(shè)備存在著重大的安全隱患,例如非授權(quán)用戶能夠隨意非法讀取并復(fù)制存儲(chǔ)于該大容量設(shè)備中的明文數(shù)據(jù)。此外,大容量設(shè)備與外部設(shè)備連接過程中,攻擊者能夠輕易截獲此過程中的數(shù)據(jù)。因此,結(jié)合當(dāng)前電力物聯(lián)網(wǎng)智能終端設(shè)備操作系統(tǒng)采用文件系統(tǒng)進(jìn)行信息存儲(chǔ)和共享的典型應(yīng)用場(chǎng)景,研究文件同步和共享過程中的安全性問題,即開展用戶身份的認(rèn)證以及存儲(chǔ)設(shè)備中明文數(shù)據(jù)的保護(hù)至關(guān)重要。
文件同步和共享過程的安全性包含機(jī)密性和完整性兩方面,機(jī)密性涉及密態(tài)文件的同步和統(tǒng)一訪問控制等技術(shù),完整性涉及對(duì)數(shù)據(jù)中心存儲(chǔ)文件完整性的驗(yàn)證技術(shù)[2]。傳統(tǒng)的消息認(rèn)證碼(MAC)、數(shù)字簽名以及確定一個(gè)最新版本文件而直接全覆蓋、對(duì)文件進(jìn)行無損壓縮等方法存在帶寬占用量大、壓縮程度有限等不足使其均不可取。為此,論文針對(duì)電力物聯(lián)網(wǎng)智能終端設(shè)備通信資源受限的特點(diǎn),研究一種面向電力物聯(lián)網(wǎng)終端設(shè)備數(shù)據(jù)存儲(chǔ)和交換行為的輕量級(jí)身份認(rèn)證與數(shù)據(jù)保護(hù)方法。通過設(shè)計(jì)動(dòng)態(tài)證明存儲(chǔ)系統(tǒng)(DyPoS)[3-6]建立了基于文件系統(tǒng)實(shí)現(xiàn)信息的安全存儲(chǔ)與共享的機(jī)制。即在文件同步到中心服務(wù)器時(shí)保證文件的機(jī)密性與完整性。為了防止加解密機(jī)制占用過多邊緣計(jì)算資源,對(duì)于文件的修改、再次同步時(shí)僅加密傳輸修改部分,而不需要加密和傳輸整個(gè)文件,從而降低計(jì)算和傳輸開銷。
證明存儲(chǔ)的目的是要由物聯(lián)網(wǎng)終端發(fā)起驗(yàn)證數(shù)據(jù)中心存儲(chǔ)文件的完整性,即驗(yàn)證所有的分塊都如實(shí)存儲(chǔ)[7]。證明存儲(chǔ)的做法是終端隨機(jī)選擇一些分塊索引發(fā)送給數(shù)據(jù)中心,選擇的分塊索引數(shù)量稱為挑戰(zhàn)塊數(shù)。數(shù)據(jù)中心將這些挑戰(zhàn)的數(shù)據(jù)塊和驗(yàn)證這些數(shù)據(jù)塊會(huì)用到的認(rèn)證結(jié)構(gòu)信息作為認(rèn)證器返回給終端。終端驗(yàn)證這些數(shù)據(jù)塊,如果是完整的,則以一定的概率認(rèn)為文件是如實(shí)存儲(chǔ)的[8]。
圖1 證明存儲(chǔ)過程示例
由以上描述可知,實(shí)現(xiàn)高效證明存儲(chǔ)的關(guān)鍵是建立一個(gè)新的認(rèn)證結(jié)構(gòu),即同態(tài)認(rèn)證樹HAT(homomorphic authenticated tree)。HAT是一個(gè)二叉樹,其中每個(gè)葉節(jié)點(diǎn)對(duì)應(yīng)一個(gè)數(shù)據(jù)塊。
盡管HAT對(duì)數(shù)據(jù)塊的數(shù)量沒有任何限制,為了描述簡單,假設(shè)數(shù)據(jù)塊的數(shù)量n等于完整的二叉樹中的葉子節(jié)點(diǎn)的數(shù)量。因此,對(duì)于文件F=(m1,m2,m3,m4)(其中,mi表示文件的第i塊),可以構(gòu)建如圖2a)所示的樹。
圖2 基于樹的認(rèn)證結(jié)構(gòu)
HAT中的每個(gè)節(jié)點(diǎn)都由一個(gè)四元組vi=(i,li,vi,ti)表示。i是節(jié)點(diǎn)的唯一索引,根節(jié)點(diǎn)的索引是1,索引從上到下,從左到右增加。li表示可以從第i個(gè)節(jié)點(diǎn)到達(dá)的葉節(jié)點(diǎn)的數(shù)量。vi是第i個(gè)節(jié)點(diǎn)的版本號(hào)。ti代表第i個(gè)節(jié)點(diǎn)的標(biāo)簽。
終端隨機(jī)選擇分塊索引發(fā)送給數(shù)據(jù)中心。同時(shí),終端采用路徑搜索[9]和兄弟搜索[10]獲取數(shù)據(jù)塊和驗(yàn)證這些數(shù)據(jù)塊用到的認(rèn)證結(jié)構(gòu)信息。
1) 路徑搜索過程(見附錄算法1)
定義路徑搜素ρt←P(T,t),即以文件的HAT標(biāo)記T和塊索引t為輸入,輸出從根節(jié)點(diǎn)到該文件第t個(gè)塊對(duì)應(yīng)的葉子節(jié)點(diǎn)的路徑中的節(jié)點(diǎn)的索引集合。T中的第i個(gè)節(jié)點(diǎn)的唯一索引表示為一個(gè)四元組vi=(i,li,vi,ti)。
為每個(gè)合法塊索引l初始化2個(gè)輔助變量,其中it定義其根是T中第it個(gè)節(jié)點(diǎn)的子樹,ordt指示該子樹中相應(yīng)葉子節(jié)點(diǎn)的位置。支持多路徑搜索的過程如下:
(1) 初始化路徑ρ和狀態(tài)S。
(2) 對(duì)于T的每個(gè)級(jí)別,通過廣度優(yōu)先搜索循環(huán)計(jì)算每個(gè)塊索引l在ρ中的節(jié)點(diǎn)。
2) 兄弟搜索過程(見附錄算法2)
定義兄弟搜素ψ←Sibling(ρ),將路徑ρ作為輸入,輸出路徑ρ中所有節(jié)點(diǎn)的兄弟節(jié)點(diǎn)的索引集,即輸出其余兄弟中最左邊的節(jié)點(diǎn)集合。
兄弟搜索的過程如下:
(1) 初始化兄弟集合ψ和輔助集合Q。
(2) 確定ρ中節(jié)點(diǎn)的多少個(gè)“孩子”出現(xiàn)在ρ行。
a) 若為2個(gè),將2個(gè)“孩子”從ρ中移除,并將右側(cè)的“孩子”插入Q。
b) 若為1個(gè),則從ρ刪除這個(gè)“孩子”,并將其插入兄弟集合ψ。
由此,數(shù)據(jù)中心向終端返回存儲(chǔ)的數(shù)據(jù)塊和認(rèn)證結(jié)構(gòu)信息,終端將采用2種搜索方法獲得的數(shù)據(jù)塊和認(rèn)證結(jié)構(gòu)信息對(duì)比驗(yàn)證,如果這些數(shù)據(jù)塊是完整的,則以一定的概率認(rèn)為文件是如實(shí)存儲(chǔ)的。
1) 防碰撞散列函數(shù)
對(duì)于散列函數(shù)H:{0,1}*→{0,1}*,如果找到滿足H(x)=H(y)的2個(gè)不同值x和y的概率是可以忽略的,那么它是抗碰撞的。
2) 確定性對(duì)稱加密
加密算法將密鑰k和明文m作為輸入,并輸出密文。使用符號(hào)Enck(m)來表示加密算法。
3) 基于散列的消息認(rèn)證碼
基于散列的消息認(rèn)證碼HMAC:{0,1}*×{0,1}*→{0,1}*是一個(gè)確定性函數(shù),它取一個(gè)密鑰k和一個(gè)輸入x,輸出一個(gè)值y。定義HMACk(x)def=HMAC(k,x)。
4) 偽隨機(jī)函數(shù)
偽隨機(jī)函數(shù)f:{0,1}*×{0,1}*→{0,1}*是一個(gè)確定性函數(shù),它取一個(gè)密鑰k和一個(gè)值x,并輸出一個(gè)與同一輸入x的真正隨機(jī)函數(shù)無法區(qū)分的值y。定義fk(x)def=f(k,x)。
5) 偽隨機(jī)置換
偽隨機(jī)置換π:{0,1}*×[1,n]→[1,n}是一個(gè)確定性函數(shù),它取一個(gè)密鑰k和一個(gè)整數(shù)x,其中1≤x≤n,并輸出一個(gè)值y(其中1≤y≤n)與同一輸入x的真正隨機(jī)排列無法區(qū)分。定義πk(x)def=π(k,x)。
6) 密鑰導(dǎo)出函數(shù)
密鑰導(dǎo)出函數(shù)KDF:{0,1}*×{0,1}*→{0,1}*是一個(gè)確定性函數(shù),可以從2個(gè)秘密值中派生出一個(gè)密鑰。
1) 終端運(yùn)行初始化算法(id,e)←Init(1λ,F)計(jì)算:
e←H(F), id←H(e)
然后,終端發(fā)送id給數(shù)據(jù)中心作為文件的標(biāo)識(shí)。
2) 假設(shè)文件F=(m1,…,mn),終端首先調(diào)用編碼算法(C,T)←Encode(e,F),生成分塊密文和認(rèn)證結(jié)構(gòu),過程如下:
①生成一個(gè)隨機(jī)密鑰k←{0,1}|e|,并計(jì)算r←k⊕e。
②計(jì)算加密密鑰ke←KDF(k,0)。對(duì)于每個(gè)塊mt(1≤t≤n)計(jì)算ct←Encke(mt)。
③對(duì)F構(gòu)建一個(gè)HAT,此時(shí)HAT中的標(biāo)簽未被賦值。
④計(jì)算αs←KDF(k,1),kc←KDF(k,2)和αc←KDF(k,3)。通過算法3,用(c1,…,cn)計(jì)算HAT中所有葉節(jié)點(diǎn)的標(biāo)簽。
⑤基于葉節(jié)點(diǎn)標(biāo)簽,通過算法4計(jì)算HAT中所有非葉節(jié)點(diǎn)的標(biāo)簽。
⑥計(jì)算ω←HMACe(t1)。
⑦令C={c1,…,cn}和T=(r,αs,Γ,ω,N),其中Γ={τ1,…,τn},N={ν1,v2,…}是所有HAT節(jié)點(diǎn)的集合。
上傳階段結(jié)束時(shí),終端將C和T上傳到數(shù)據(jù)中心,并僅在本地存儲(chǔ)e。
3) 檢測(cè)下載文件之前數(shù)據(jù)中心保存文件的完整性。終端和數(shù)據(jù)中心S交互地運(yùn)行檢查協(xié)議res∈{0,1}←Check〈S(C,T),U(e)〉檢查數(shù)據(jù)中心文件的完整性,過程如下:
①U選擇b∈[1,n],κ∈{0,1}λ,并發(fā)送(b,κ)到S。
②對(duì)于每個(gè)j(1≤j≤b),S計(jì)算tj←πk(b)。然后,數(shù)據(jù)中心調(diào)用算法5中的響應(yīng)算法,其中I={t1,…,tb},并將文件證明resp和(r,v1,ω)發(fā)送給U。
③U計(jì)算k←r⊕e,αs←KDF(k,1),kc←KDF(k,2)和αc←KDF(k,3)。然后驗(yàn)證v1,并調(diào)用算法6中的驗(yàn)證算法來完成驗(yàn)證。若驗(yàn)證成功則輸出1,否則輸出0。
4) 終端通過調(diào)用更新協(xié)議res∈{〈e*,(C*,T*)〉,⊥}←Update〈U(e,ι,m,OP),S(C,T)〉來任意更新文件。如修改塊、插入一些塊、刪除一些塊等。
5) 終端將文件的更新塊和基于HAT更新節(jié)點(diǎn)上傳到數(shù)據(jù)中心,終端計(jì)算更新后的元數(shù)據(jù)e*并通過檢查協(xié)議驗(yàn)證更新的塊。
結(jié)合某地方電力公司的電力物聯(lián)網(wǎng)平臺(tái),建立一個(gè)由智能終端模擬開發(fā)板和數(shù)據(jù)中心服務(wù)器構(gòu)成的測(cè)試系統(tǒng),如圖3所示?;谠撓到y(tǒng)的測(cè)試過程如下:
圖3 測(cè)試環(huán)境
1) 啟動(dòng)2個(gè)服務(wù)程序,運(yùn)行在服務(wù)器上的2個(gè)服務(wù)程序分別監(jiān)聽4 000端口和8 000端口,如圖4所示。遍歷文件系統(tǒng),選擇一個(gè)要同步的文件shangchuan.txt,文件內(nèi)容圖5所示。
圖4 啟動(dòng)服務(wù)程序
圖5 文件內(nèi)容
2) 服務(wù)程序1收到文件名,查詢數(shù)據(jù)庫未找到該文件,通知終端上傳整個(gè)文件,如圖6所示。終端上傳原文件的整個(gè)文件給服務(wù)程序2,服務(wù)程序2收到原文件,保存并更新數(shù)據(jù)庫,如圖7所示。
圖6 通知終端上傳文件
圖7 保存并更新數(shù)據(jù)庫
3) 首次同步完成,終端上修改文件shangchuan.txt,即在文件后加入一些內(nèi)容,再次選擇shangchuan.txt。服務(wù)程序1收到文件名,查詢數(shù)據(jù)庫發(fā)現(xiàn)本地已有shangchuan.txt文件并對(duì)文件分塊計(jì)算簽名,生成簽名文件sig并發(fā)送給終端,如圖8所示。
圖8 已有文件計(jì)算過程
4) 終端收到sig文件,利用本地的shangchuan.txt文件計(jì)算輕量,并將輕量文件上傳給服務(wù)程序2。服務(wù)程序2收到終端發(fā)來的輕量文件,與本地shangchuan.txt的舊版本文件一起計(jì)算新文件,如圖9所示。
圖9 計(jì)算新文件過程
5) 輕量更新與驗(yàn)證完成。更新的性能展示通過終端將性能數(shù)據(jù)發(fā)送到服務(wù)器的數(shù)據(jù)庫中,由界面展示出更新的各項(xiàng)數(shù)據(jù),如更新類型、文件名、文件大小、sig文件大小、傳輸文件大小以及更新時(shí)間。32M文件更新8M(25%)時(shí)的性能如圖10所示。
圖10 性能展示
由此可見:
1) 32 MB文件進(jìn)行8 kB分塊時(shí),認(rèn)證結(jié)構(gòu)大小較Merkle樹[12]對(duì)比方案減少26.7%;挑戰(zhàn)120個(gè)塊,DyPoS較Merkle樹[12]對(duì)比方案響應(yīng)用時(shí)減少57.3%,驗(yàn)證用時(shí)減少50%。
2) 加密文件修改內(nèi)容18%時(shí),更新該加密文件的計(jì)算負(fù)載降低68.4%,時(shí)延降低68.9%;加密文件修改內(nèi)容25%時(shí),更新該加密文件的計(jì)算負(fù)載降低60%,時(shí)延降低61.2%。
文件同步技術(shù)是電力物聯(lián)網(wǎng)應(yīng)用的關(guān)鍵技術(shù)之一?;谕綍r(shí)傳輸2個(gè)文件版本之間不同的文件數(shù)據(jù),而重用相同部分的思想,通過對(duì)密文形成壓縮標(biāo)簽的方式對(duì)數(shù)據(jù)中心存儲(chǔ)內(nèi)容進(jìn)行效驗(yàn),無需下載完整密文文件,在保障安全的前提下可以有效降低文件內(nèi)容完整性效驗(yàn)的性能開銷。針對(duì)標(biāo)簽的驗(yàn)證問題,設(shè)計(jì)了輕量快速更新密文的存儲(chǔ)方法,提出了同態(tài)認(rèn)證樹HAT的新型認(rèn)證結(jié)構(gòu),與傳統(tǒng)的認(rèn)證結(jié)構(gòu)相比,有效地減少了終端生成認(rèn)證結(jié)構(gòu)時(shí)間,降低了校驗(yàn)數(shù)據(jù)內(nèi)容時(shí)的通信開銷和計(jì)算開銷。
附錄
算法1路徑搜索算法
1: procedure Path(T,I)
2: forι∈Ido
3: ifι>l1then
4: return 0
5:iι←1,ordι←ι
6:ρ←{1},S←TRUE
7: whileSdo
8:S←FALSE
9: forι∈Ido
10: ifliι=1 then
11: continue
12: else ifordι≤l2iιthen
13:iι←2iι
14: else
15:ordι←ordι←l2iι,iι←2iι+1
16:ρ←ρ∪{iι}
17: ifιiι>1 then
18:S←TRUE
19: returnρ
算法2兄弟搜索算法
1: procedure Sibling(ρ)
2:ψ←φ,ρ←ρ{1},ρ←φ,i←1
3: whileρ≠φ∨ρ≠φdo
4: if 2i∈ρthen
5:i←2i,ρ←ρ{i}
6: ifi+1∈ρthen
7:ρ←ρ∪{(i+1,FALSE)},ρ←ρ{i+1}
8: else
9:ρ←ρ∪{(i+1,TRUE)}
11: else if 2i+1∈ρthen
12:i←2i+1,ρ←ρ{i},ψ←ψ∪{i-1}
13: else ifρ≠φthen
14: pop the last inserted (α,β) inρ
15:i←α
16: ifβ=TRUE then
17:ψ←ψ∪{i}
21: returnψ
算法3葉子節(jié)點(diǎn)標(biāo)簽生成算法
1: procedure LeafTag(αs,kc,αc,cι,iι,liι,νiι)
2:τι←αscι
3:tiι←fkc(iι‖liι‖νiι)+αcτι
4: returnτι,tiι
算法4非葉子節(jié)點(diǎn)標(biāo)簽生成算法
1: procedure NonLeafTag(kc,i,li,νi)
2:τ2i←t2i-fkc(2i‖l2i‖ν2i)
3:τ2i+1←t2i+1-fkc(2i+1‖l2i+1‖ν2i+1)
4: returnti←fkc(i‖li‖νi)+τ2i+τ2i+1
算法5響應(yīng)算法
1: procedure Response(I)
2:ρ←PATHT,I,ψ←Siblingρ
3:c←0,t←0
4: forι∈Ido
5:c←c+cι
6: fori∈ψdo
7:t←t+ti
8: returnresp←(c,t,{νiι|ι∈I},{(i,li,ui)|i∈ψ})
算法6驗(yàn)證算法
1: procedure Verify(αs,kc,αc,ν1,I,resp)
2:ctr←1,τ←0
3: forι∈Ido
4: whilectr<ιdo
5: pop the first element in {(i,li,νi)|i∈ψ}
6:ctr←ctr+li,τ←τ+fkc(i‖li‖νi)
7: ifctr≠ιthen
8: return 0
9: else
10:ctr←ctr+1
11: for (i,li,νi)∈{(i,li,νi)|i∈ψ} do
12:ctr←ctr+li,τ←τ+fkc(i‖li‖νi)
13: ifctr≠n+1 then
14: return 0
15: else ift+fkc(1‖l1‖ν1)-τ+αsαcc≠t1then
16: return 0
17: else
18: return 1