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