李紅衛(wèi) ,葉飛躍 ,陳 丹
(1.江蘇理工學院計算機工程學院 常州 213001;2.江蘇理工學院云計算與智能信息處理常州市重點實驗室 常州 213001)
云計算的發(fā)展極大地滿足了客戶對計算的需求,云存儲的應用使得用戶可以將數(shù)據(jù)存儲在云中,以一種靈活、按需的方式使用和管理云中的數(shù)據(jù)。云存儲的使用不但減輕了用戶對存儲管理的負擔,而且對數(shù)據(jù)的訪問不再受限于地理位置,并可降低硬件、軟件、人力資源等方面的投資成本[1]。但云存儲的安全性與可靠性仍是制約云存儲服務快速發(fā)展的關(guān)鍵問題。這主要體現(xiàn)在兩方面:一是云服務提供商(cloud service provider,CSP)能否有效地保證數(shù)據(jù)的完整性。例如,由于管理不當或設備故障造成數(shù)據(jù)損壞或丟失時,CSP能否盡快恢復數(shù)據(jù)。二是來自敵手的攻擊,敵手可以通過某種途徑篡改數(shù)據(jù),CSP能否及時發(fā)現(xiàn)并恢復數(shù)據(jù)。另外,敵手還可以從用戶訪問數(shù)據(jù)的模式中間接地獲知用戶的操作信息[2]。例如,敵手獲知用戶對數(shù)據(jù)的訪問為某一序列時將做出某項決策,當類似的訪問序列再次出現(xiàn)時,敵手可以推測到用戶的活動。本文從云存儲中數(shù)據(jù)的可恢復性和隱藏數(shù)據(jù)訪問模式展開研究,提出了證明數(shù)據(jù)的可持有性,實現(xiàn)數(shù)據(jù)的可恢復性,并且隱藏了數(shù)據(jù)的訪問模式。
Juels和Kaliski[3]最先提出了可恢復性證明(proof of retrievability,POR),并提出基于哨兵的方案。其基本思想是先對原文件F加密,再用糾錯碼對加密后的文件F’進行編碼形成文件F”,然后在F”中隨機選取若干哨兵,每一個哨兵可監(jiān)測一部分數(shù)據(jù),并將這些哨兵的值存儲在客戶端,然后把文件F”存儲在云端??蛻艨梢岳蒙诒|(zhì)詢服務器,驗證文件的可恢復性。與此同時,Ateniese等人[4]提出了可證明數(shù)據(jù)擁有 (provable data possession,PDP)模型,并提供了基于RSA模指運算構(gòu)造同態(tài)標簽以實現(xiàn)數(shù)據(jù)持有性證明。這兩種模型的主要區(qū)別是PDP只驗證了數(shù)據(jù)是否完整,而沒有考慮遭到破壞后的數(shù)據(jù)是否可恢復。在他們研究的基礎上,又有很多研究者提出了一些改進方法和新的方案[5~9]。其中,陳蘭香[9]提出一種基于同態(tài)散列的數(shù)據(jù)持有性證明方法,利用同態(tài)散列算法的同態(tài)性,即兩數(shù)據(jù)塊之和的散列值與它們散列值的乘積相等,驗證數(shù)據(jù)的持有性。但這兩種模型有一個共同缺點,它們只考慮了數(shù)據(jù)的持有性或可恢復性,沒有對客戶訪問數(shù)據(jù)模式進行隱藏,使得敵手可以跟蹤客戶對數(shù)據(jù)訪問的模式,從中獲取信息。另外,在POR模型中,如果數(shù)據(jù)所在的磁盤存儲塊受到物理損傷,或敵手大量篡改數(shù)據(jù),即使使用糾錯碼也無法恢復原有數(shù)據(jù)。
Goldreich最早提出 ORAM (oblivious random access machine),并與Ostrovsky[10]提出了隱藏客戶對存儲器的訪問模式以防止軟件逆向工程。隨著云計算的發(fā)展,ORAM在云存儲隱私保護方面也有著重要的應用[11]。在參考文獻[10]中提出的最有效的算法是金字塔形分層算法,它對數(shù)據(jù)所占用的存儲塊按金字塔形狀管理,該算法分為訪問和洗牌兩個階段。訪問階段又分為讀和寫兩部分,在讀部分,ORAM順序讀取金字塔形第1層所有盒子中的數(shù)據(jù)塊,然后再讀其他每一層中的某一個盒子(由散列函數(shù)決定)中的數(shù)據(jù)塊。在整個讀過程中,如果找到了目標數(shù)據(jù)塊,則后繼選擇啞元塊讀取。寫部分比較簡單,對目標塊進行處理后寫入第1層中的空位置即可。但由于客戶的每一次請求都會將數(shù)據(jù)塊寫入第1層,當?shù)?層放滿數(shù)據(jù)塊后需要將第1層和第2層的數(shù)據(jù)塊重新排列后存放到第2層中,第1層清空。類似地,在第2i次數(shù)據(jù)訪問之后,第i層的數(shù)據(jù)塊和第i+1層的數(shù)據(jù)塊重新排列后存儲到第i+1層,前i層清空,這個過程稱作洗牌。洗牌是分層算法中最復雜的階段,它是該算法性能的瓶頸。洗牌的關(guān)鍵操作是無關(guān)地排序數(shù)據(jù)塊。若采用AKS網(wǎng)絡排序算法時,平均時間復雜度為O(clog3N),若采用巴切排序算法時,平均時間復雜度為O(dlog4N)(c>>d)。在洗牌階段若客戶訪問數(shù)據(jù),客戶可能會等待較長時間。因此,這樣的算法若應用于實際環(huán)境中則無法讓人容忍它的低效率。許多研究者[11~16]在分層算法的基礎上又提出了一些新的算法,旨在降低存儲空間占有量和平均訪問時間復雜度。但這些算法均由訪問和洗牌兩個階段構(gòu)成,洗牌仍是算法的瓶頸。
本文提出一種ORAM結(jié)構(gòu),在需要少量客戶端存儲空間和線性級服務器存儲容量的情況下,把洗牌過程均攤到每次訪問操作中,使得對服務器的訪問時間可保持在常量級。同時結(jié)合同態(tài)散列算法驗證數(shù)據(jù)的可持有性并利用副本實現(xiàn)數(shù)據(jù)的可恢復性。
ORAM模型機可以隱藏客戶對服務器的訪問模式,即除客戶外,其他任何角色每次看到客戶對數(shù)據(jù)的訪問序列都是相似的。本文假定ORAM模型機是由可信任的客戶端和不可信的服務器端構(gòu)成。
假設客戶文件是由N個數(shù)據(jù)塊組成,每個數(shù)據(jù)塊在服務器端存儲兩份,并增加2N個啞元塊使得敵手觀察客戶的訪問模式時無法確認哪個是真實的數(shù)據(jù)塊。在本方案中總共需要4N個服務器存儲塊,利用隨機均勻函數(shù)將2N個數(shù)據(jù)塊映射到4N個存儲塊中,剩余存儲塊存放啞元塊。
為了提高數(shù)據(jù)存儲的可靠性,可將一個大數(shù)據(jù)文件分割成若干大小為S個存儲塊的文件存儲。由于客戶的一個數(shù)據(jù)塊在服務器中有兩個備份,且隨機均勻地分布在不同的文件中,當一個文件損壞時,該文件中的所有數(shù)據(jù)塊均可從其他的文件中恢復。
在客戶端設置BufM和BufA兩個緩沖器,兩張數(shù)據(jù)表SerMap[4N]和 PosMap[N]。
BufM是一個可存放6個存儲塊的緩沖器。采用FIFO算法對BufM進行管理,將每次客戶所訪問的數(shù)據(jù)塊存放到該緩沖器中。
BufA的大小與BufM相等,每次讀/寫數(shù)據(jù)塊時,將隨機讀的數(shù)據(jù)塊和啞元塊存放到該緩沖器中;當客戶是寫操作時,會把一個備份放到該緩沖器中;當BufM滿時會將其中一個最久未用的數(shù)據(jù)塊移到BufA中,以保證每次客戶在訪問云存儲時,BufM至少有一個空閑塊。如果BufA不滿則用啞元塊填滿。最后將BufA中的數(shù)據(jù)塊寫回云存儲器中。
數(shù)據(jù)表SerMap描述存儲在服務器上各數(shù)據(jù)塊的屬性,每次訪問服務器時均需要調(diào)整該表內(nèi)容,以適應ORAM的變化。該表有6個域,分別是FlagD、FlagA、Fresh、PdpG[8]、PdpA[8]和 PdpH[8]。FlagD 為數(shù)據(jù)塊標識,其值為1表示該塊為數(shù)據(jù)塊,否則為啞元塊。FlagA標識存儲塊最近是否被訪問過。每當一個存儲塊讀到緩沖器中時,設置該塊對應的FlagD為0;FlagA為1,表示該存儲塊為啞元塊且最近被訪問過。當一個數(shù)據(jù)塊被寫入服務器時,會隨機找一個最近沒被訪問過的啞元塊寫入,并修改該塊對應的FlagD為1。在查找啞元塊的過程中,若其對應的FlagA為1,則修改其值為0,以便下次查找到該塊時能被選中。Fresh表示服務器存儲塊的新鮮度,初值為隨機數(shù),用于數(shù)據(jù)的加解密,在對存儲塊的每次讀操作后其值加 1;PdpG[8]、PdpA[8]和 PdpH[8]與驗證 數(shù)據(jù)的持有性有關(guān),參見第3節(jié)。
數(shù)據(jù)表PosMap表示用戶數(shù)據(jù)塊在服務器中存放的位置映射,每次讀寫數(shù)據(jù)塊時均需對該表進行修改。該表有3個域,分別是SaveF、Addr1和Addr2。Addr1和Addr2分別表示一個數(shù)據(jù)塊在服務器中的兩個備份位置,也是數(shù)據(jù)表SerMap的索引。SaveF表示數(shù)據(jù)塊存放在服務器/本地的標識,當其值為0時,表示數(shù)據(jù)塊的兩個備份都在服務器中存放;當其值為1或2時,表示數(shù)據(jù)塊在BufM中,且一個備份在服務器上 (SaveF=1時,Addr2有效,SaveF=2時,Addr1有效);當其值為3時,表示數(shù)據(jù)塊同時在BufM和BufA中,且服務器中的備份失效。
本文借鑒參考文獻[9]選擇同態(tài)散列算法驗證數(shù)據(jù)的持有性。假設在存儲塊大小為128 KB的空間中隨機選取8個片段,每個片段4 KB。用1 024×8矩陣表示8個片段則為:
其中 bi=(bi,0,bi,1,…,bi,1023)(0≤i≤7)表示片段,bi,j∈Zp(0≤i≤7,0≤j≤1 023),Zp是以足夠大的正素數(shù) p 為模的有限域,兩個片段相加規(guī)則定義為:
同態(tài)散列計算過程如下。
(1)計算每個片段的散列值
其中,g=(g0,g1,…,g7)是 1×8 的向量,gi∈Zp(0≤i≤7)。
(2)所有片段的散列值構(gòu)成一個1×8的向量h
(3)散列同態(tài)性質(zhì)
在存儲數(shù)據(jù)塊時,先對數(shù)據(jù)塊進行加密處理后,隨機產(chǎn)生向量g,在數(shù)據(jù)塊中任意選擇8個位置a(數(shù)據(jù)片段的起始位置),并計算各片段的散列值h。最后將g、a和h分別保存到 SerMap表中的 PdpG[8]、PdpA[8]和 PdpH[8]數(shù)組中。
可以選擇3種方法對數(shù)據(jù)進行持有性證明:客戶自己審計;服務器審計;第三方審計。以服務器審計為例介紹審計步驟。
算法1 審計算法 Boolean Audit(M)
輸入:M,對服務器中M個數(shù)據(jù)塊進行驗證
輸出:布爾值,若為真則表示審計通過,否則失敗
Boolean Audit(M)
(1)for(i=0;i (2)u=RandBlock();//隨機選擇一個存儲塊號 (3) Addr1=SerMap[u].PdpA[Rand()];//在 SerMap[u]表項中隨機選擇一個片段的起止 (4) Addr2=SerMap[u].PdpA[Rand()];//在 SerMap[u]表項中隨機選擇另一個片段的起止 (5) value=Challenge(u/S,u%S,//對云存儲文件[u/S]中的第u%S塊進行質(zhì)詢 SerMap[u].PdpG,Addr1,Addr2);//向量 g和兩個片段地址 (6) if (value!=SerMap[u].PdpH.Addr1*SerMap[u].PdpH.Addr2){//判斷驗證是否失敗 (7) Alert(u,“Bad”);//失敗時,發(fā)出警報 (8) return false;} (9)} (10)return true//驗證成功,返回 算法1隨機選擇M個存儲塊進行驗證,由質(zhì)詢函數(shù)Challenge()向服務器提出質(zhì)詢,服務器根據(jù)提供的參數(shù)計算兩個片段之和的散列值,并返回該值。如果該值與本地儲存的兩個片段的散列值之乘積相等則說明數(shù)據(jù)是完整的,驗證成功。否則,說明數(shù)據(jù)塊已遭到破壞,需要報警處理并從另一個備份中恢復數(shù)據(jù)。 每次審計均隨機選擇M個數(shù)據(jù)塊進行驗證,而N遠大于M,所以,每次審計時選擇相同序列的數(shù)據(jù)塊的概率極小,并且,在驗證某一個數(shù)據(jù)塊時僅向服務器提供向量a中的任意兩個地址,服務器無法一次獲取a中的所有地址。另外,在ORAM模型中,所訪問過的存儲塊將會動態(tài)地遷移到新的位置,需要重新計算該塊的向量g和a,因此,服務器很難偽造各存儲塊的審計結(jié)果,系統(tǒng)安全性可以得到保障。 客戶讀/寫數(shù)據(jù)塊只需執(zhí)行LookUp()即可,通過LookUp()可以隱藏數(shù)據(jù)的訪問模式。 算法 2 void LookUp(op,u,data) 輸入:op,表示客戶對服務器的訪問操作,read/write u,表示客戶需要訪問的數(shù)據(jù)塊 data,客戶數(shù)據(jù)存儲地址 輸出:無 void LookUp(op,u,data) (1)RandRead(data);//隨機從服務器讀一個數(shù)據(jù)塊,并存放到BufA中 (2)RandRead(DUMMY);//隨機讀一個啞元塊,并存放到BufA中 (3)if(ExistBuf(u)){//如果 u 已在 BufM/BufA 中 (4)RandRead (DUMMY);//則隨機讀一個啞元塊,并存放到BufA中 (5)RemoveBuf(u);//將u從 BufA/BufM 移出 (6)}else Read(u);//否則讀指定的數(shù)據(jù)塊u (7)if(op==write){//如果是寫操作 (8)copy(data,u);//將數(shù)據(jù)復制到u中,修改 PosMap中第u表項中的 SaveF為 3;//并將 Addr1、Addr2所指SerMap對應項中的FlagD設置為0。 (9)copy(data,BufA);將 data 復制到 BufA 中的一個緩沖區(qū)中,以備寫入云存儲中 (10)}else copy(u,data); (11)EnterBufM(u);//將 u插入 BufM 的隊尾 (12)RandRead(DATA);//隨機從服務器讀取一個客戶數(shù)據(jù)塊,并存放到BufA中 (13)RandRead (DUMMY);//隨機讀一個啞元塊,并存放到BufA中 (14)Update();//將數(shù)據(jù)塊和啞元塊寫入服務器 (15)return 在該算法中步驟(1)和步驟(11)任意讀兩個客戶數(shù)據(jù)塊,步驟(2)和步驟(12)任意讀兩個啞元塊。當所需要訪問的數(shù)據(jù)塊不在BufM或BufA中時,則讀取并放到BufM的隊尾,否則隨機讀一個啞元塊,并將數(shù)據(jù)塊從BufM或BufA中移出再插入BufM的隊尾。 當op是寫操作時,則將內(nèi)容寫入u緩沖區(qū)中 (步驟(8)),并將一個備份存放到 BufA(步驟(9))中。步驟(14)將BufA中的存儲塊寫回服務器,實現(xiàn)數(shù)據(jù)的更新。 RandRead()可隨機讀取一個數(shù)據(jù)塊/啞元塊,Read(u)讀取指定的數(shù)據(jù)塊u,在讀數(shù)據(jù)塊或啞元塊后,需要調(diào)整兩張數(shù)據(jù)表PosMap和SerMap的相關(guān)內(nèi)容,并且,每讀一個存儲塊,都可以選擇使用驗證數(shù)據(jù)的可持有性。 在Update算法中,當BufM已滿時,則將最久未用的數(shù)據(jù)塊移入BufA中,以保證在每次執(zhí)行LookUp操作之前,BufM中最少有一個緩沖區(qū)是空的。在執(zhí)行LookUp操作時,最多有6個數(shù)據(jù)塊/啞元塊進入BufA中,可能是3個數(shù)據(jù)塊和3個啞元塊的組合,也可能是4個數(shù)據(jù)塊和2個啞元塊的組合;最多有1個數(shù)據(jù)塊進入BufM中。Update只將BufA中的內(nèi)容寫入服務器。Update算法描述如下。 算法3 淘汰數(shù)據(jù)塊算法void Update(void) void Update(void) (1)if(BufM滿)將最久未用緩沖區(qū)數(shù)據(jù)移到BufA中; (2)if(BufA 未滿)以啞元塊填滿; (3)for(i=0;i<6;i++)給 BufA 中的每一個緩沖區(qū)隨機分配一個標簽; (4)對BufA中的緩沖區(qū)按標簽值大小排序,形成一個新的緩沖序列; (5)for(i=0;i<6;i++){//為 BufA 中的 6個數(shù)據(jù)塊/啞元塊尋找存儲位置 (6)在SerMap中隨機找一個最近未被訪問過的啞元塊x,即FlagA值為0的啞元塊,若FlagA值為1時,將其值設置為0,繼續(xù)隨機查找下一個啞元塊; (7)if(BufA[i]是數(shù)據(jù)塊) 設BufA[i]對應的數(shù)據(jù)塊號為u,訪問PosMap中第u表項,若SaveF的值為 1或2,則用有效項Addr2或Addr1減去x,若其值的絕對值小于S,則轉(zhuǎn)到步驟(6)重新選擇啞元塊x,此步可保證客戶數(shù)據(jù)塊的兩個備份存放在不同的文件中;否則,若 SaveF的值為 3,則修改 Addr1或 Addr2為x,且修改SaveF為1或2;否則,修改Addr1或Addr2為x,且修改SaveF為0; (8)加密,產(chǎn)生向量g及隨機選取片段地址a,計算其散列值,然后將數(shù)據(jù)塊寫入文件[x/S]的第[x%S]塊中,修改SerMap中第x表項中的FlagD為1,F(xiàn)lagA為1,將向量g、片段的起止地址a及其散列值存入相應位置;} (9)return 假定一個存儲塊大小為128 KB,需要服務器的存儲容量是實際數(shù)據(jù)量的4倍,當數(shù)據(jù)文件很大時,客戶端數(shù)據(jù)結(jié)構(gòu)所需容量是服務器存儲容量的0.07%左右??蛻裘吭L問一個數(shù)據(jù)塊,均需要讀/寫11塊服務器的存儲塊,其中讀5次寫6次。 安全定義[11]:設 y=((op1,u1,data1),(op2,u2,data2),…,(opM,uM,dataM))是客戶請求訪問某一數(shù)據(jù)塊時ORAM訪問服務器存儲塊的一個序列,其長度為M。其中op表示R(讀)或W(寫)操作,u表示服務器虛擬存儲地址,data表示客戶存儲器地址,當op為read操作時,data指從服務器讀取的數(shù)據(jù)存放在客戶端的地址,當op為write操作時,data指寫往服務器的數(shù)據(jù)在客戶端存放的地址。用A(y)=(op1,op2,…,opM)表示客戶訪問服務器的操作序列。如果對于任何兩個客戶訪問序列y和y’,只要其長度相等,訪問服務器的操作序列一樣,對任何人(除客戶本人)來說 A(y)和 A(y’)都是在計算上不可區(qū)分的,則稱該ORAM結(jié)構(gòu)是安全的。 本文客戶訪問服務器的操作序列是A(y11)=(R1,R2,R3,R4,R5,W6,W7,W8,W9,W10,W11),客戶不論是讀還是寫數(shù)據(jù)塊,其訪問服務器的操作均為A(y11),因此,本文所提ORAM結(jié)構(gòu)是安全的。 在LookUp算法中,數(shù)據(jù)塊u在服務器上的存儲位置是隨機分布的,讀取u和4次隨機讀服務器存儲操作混在一起,敵手很難辨認哪一塊是客戶需要的,并且敵手很難知道下一次它將存放在哪一個位置。在訪問服務器的過程中不會出現(xiàn)剛被存儲到服務器上的數(shù)據(jù)塊又要被訪問的現(xiàn)象。因為,每個數(shù)據(jù)塊都有兩個備份,如果在訪問中發(fā)現(xiàn)所訪問的數(shù)據(jù)塊是剛剛寫入服務器的數(shù)據(jù)塊,則可以通過訪問該數(shù)據(jù)塊的另一個備份來獲取數(shù)據(jù)塊。因此,敵手無法從訪問服務器的序列中獲取有用的信息,系統(tǒng)是安全的。 本文提出的常量級訪問模式僅需占用線性級服務器存儲容量,實現(xiàn)無關(guān)訪問服務器。將大的文件分割成小文件存放,每個數(shù)據(jù)塊都有兩個備份,且存放在不同的文件中,使得數(shù)據(jù)的可恢復性得到保障。利用同態(tài)散列算法實現(xiàn)數(shù)據(jù)可持有性證明。但該方法需要占用客戶端存儲空間,當數(shù)據(jù)文件超大時,所需客戶存儲空間也隨著增大,因此,需要進一步探索減少客戶端存儲空間的使用量。 1 Wang C,Ren K,Lou W J,et al.Toward publicly auditable secure cloud data storage services.IEEE Network,2010,24( 4):19~24 2 李紅衛(wèi),古春生,白鳳娥.安全訪問外包數(shù)據(jù)的研究.電子技術(shù)應用,2013,39(7):54~56 3 Uels A,Kaliski B S.Pors:proofs of retrievability for large files.Proceedings of the 14th ACM Conference on Computer and Communications Security,Alexandria,USA,2007:584~597 4 Ateniese G,Burns R,Curtmolar R,etal.Provable data possession at untrusted stores.Proceedings of the 14th ACM Conference on Computer and Communications Security,Alexandria,USA,2007:598~609 5 Shacham H,Waters B.Compact Proofs of Retrievability.Proceedings of Asiacrypt’08,Melbourne,Australia,2008 6 Dodis Y,Vadhan S P,Wichs D.Proofs of retrievability via hardness amplitication.Proceedings of the 6th Theory of Cryptography Conference,San Francisco,2009:109~127 7 朱巖,王懷習,胡澤行等.數(shù)據(jù)可恢復性的零知識證明.中國科學:信息科學,2011,41(10):1227~1237 8 梁彪,曹宇佶,秦中元等.云計算下的數(shù)據(jù)存儲安全可證明性綜述.計算機應用研究,2012,29(7):2416~2421 9 陳蘭香.一種基于同態(tài)Hash的數(shù)據(jù)持有性證明方法.電子與信息學報,2011,33(9):2199~2204 10 Goldreich O,Ostrovsky R.Software protection and simulation on oblivious RAMs.Journal of the ACM,1996,43(3):431~473 11 Elaine S T H,Chan H,Stefanov E,et al.Oblivious RAM with O((logn)3) worst-case cost.Proceedings of the 17th International Conference on the Theory and Application of Cryptology and Information Security,Seoul,South Korea,2011 12 Pinkas B,Reinman T.Oblivious ram revisited.Proceedings of CRYPTO,California,USA,2010 13 Goldreich O.Towards a theory of software protection and simulation by oblivious RAMs.Proceedings of STOC 1987,New York,1987 14 Damgard I,Meldgaard S,Nielsen J B.Perfectly secure oblivious RAM without random oracles.Proceedings of TCC 2011,Rhode Island,USA,2011 15 Goodrich M T,Mitzenmacher M.Privacy-preserving access of outsourced data via oblivious ram simulation. Automata,Languages and Programming,2011(5) 16 Kushilevitz E,Lu S,Ostrovsky R.On the(in) security of hash-based oblivious ram and a new balancing scheme.Proceedings of SODA,Kyoto Japan,20125 訪問模式
5.1 LookUp算法
5.2 Update算法
5.3 性能與安全分析
6 結(jié)束語