余海波 陳 潔 張 凱
1(華東師范大學 上海 200062)2(上海電力大學 上海 200090)
過去人們習慣于將文件或數據存儲在本地硬盤或磁盤上。但是,隨著互聯網技術的發展,信息分享和交換變得更加的頻繁,需要存儲的數據呈現出幾何級數的增長形勢,本地存儲難以滿足用戶需求。為了處理這些大規模的數據,企業和個人用戶都選擇借助于云平臺來擴大終端的存儲能力,即通過云存儲方式來存取自己的文件或數據。
云存儲[1]相比傳統數據存儲方式,是基于云計算[2]的發展而衍生出的新興存儲方式。以用戶的視角來看,在云服務器中存儲數據可以帶來以下好處:減少了本地存儲、維護和管理的成本;消除了對數據的訪問受地理位置的限制;避免了在建設基礎設施的大量投資和在人力資源上的巨大成本。
然而,把數據存儲到不受信任的第三方服務器上,可能會導致一些數據安全隱患的出現。一方面是云服務器會面臨著來自內部和外部的惡意攻擊,從而威脅到存儲數據的隱私性;另一方面,用戶將數據上傳到云服務器后,對數據的控制權隨之減弱,甚至可能會失去,存儲數據是否一直保持完整難以驗證。因此,數據的隱私性和完整性是云存儲方式的兩個關鍵問題。為了解決數據隱私問題,傳統的解決方式是把用戶數據在通過特定的加密算法進行加密后,然后再上傳到云服務器上[3];為了解決數據完整性的問題,傳統的解決方式是在云存儲服務架構的框架中引入一個假設的可信第三方(Trusted Third Party,TTP)[4-5]。基于TTP的云存儲服務架構如圖1所示。TTP的作用就是作為用戶與云服務器間的媒介,完成數據的完整性驗證。

圖1 基于TTP的云存儲服務架構
在引入TTP的傳統方案中,數據完整性的驗證結果將完全依賴于一個假設的可信第三方,而現實應用中幾乎不存在完全可信的第三方。因此,如何不依賴任何可信第三方實現云存儲中數據的完整性證明成了一個有價值的問題。
區塊鏈作為比特幣系統[6]的底層技術,隨著比特幣的成功而得到人們的廣泛關注。區塊鏈也被稱為分布式賬本數據庫,與傳統數據庫相比,區塊鏈技術的優勢在于它提供了去中心化、匿名性、可審計、防篡改的特性。這些特性使得它逐漸被廣泛地應用于生活中[7-8]。
本文提出一種基于區塊鏈的云存儲方案。其中數據的完整性驗證不依賴于任何可信第三方,只要用戶客戶端和云服務器的多輪互動即可完成,并且驗證結果是完全可信的。同時,通過區塊鏈的匿名性和防篡改特性,在創建的交易過程中不會暴露與數據和用戶相關的任何隱私信息,攻擊者也難以對區塊鏈上的數據進行篡改,從而保證數據的隱私不會受到威脅。
區塊鏈中包含有兩個重要的數據結構,且它們都是基于哈希值的。一個是哈希鏈,它是由不同的區塊通過指針鏈接起來所形成的;另一個是梅克爾樹,它是樹狀的數據結構,作用是把每個區塊內的不同交易的哈希值存儲到葉子結點上,并基于葉子結點的哈希值進行計算,生成根結點哈希值。
區塊鏈中的哈希鏈是以區塊作為結點,各結點間通過指針進行鏈接。任何結點中的數據修改都不會導致整個鏈的改變。任何新產生的區塊要加入到鏈上,必須先通過共識機制的驗證。也正是這樣,才實現了區塊鏈上的數據不可修改和可審計的功能。區塊鏈結構如圖2所示。

圖2 區塊鏈結構
區塊鏈由創世塊開始,下一個塊的生成需要對創世塊進行哈希計算,得到的結果作為下一個區塊的輸入,一直這樣循環下去,從而形成一條哈希鏈。
區塊頭和區塊體是區塊的兩個重要組成部分,每部分保存了不同的基本元素信息[9]。區塊的數據結構如表1所示。

表1 區塊的數據結構
區塊頭的字段含義:
(1) 版本號:區塊的版本信息。
(2) 上一區塊哈希值:基于父區塊頭進行哈希計算生成的哈希值,存儲到當前區塊的區塊頭中。
(3) 梅克爾樹:基于一個區塊中全部交易生成的256位哈希值。
(4) 時間戳:新區塊打包時的時間。
(5) 困難值:表示某個區塊的難度級別。
(6) 隨機數:調整挖礦難度。
區塊體的字段含義:
(1) 交易數量:某區塊中存在的交易數目。
(2) 交易列表:具體的交易記錄,非空。
梅克爾樹(Merkle)是區塊鏈中的第二個基于哈希值的數據結構,它通過樹狀的形式把某個區塊中全部交易的哈希值保存著。若要驗證某個交易在一個特定的塊中,通過樹內路徑就可以完成驗證。
梅克爾樹結構:樹中最底層的不同葉子結點存儲著不同交易對應的哈希值;非葉子結點的值都是基于其相應子結點的哈希值相加再通過哈希算法計算而得到的;沿著樹內路徑自底向上進行計算,最終計算出的值即是根節點所對應的哈希值。梅克爾樹結構的優勢就在于只需要驗證根節點的哈希值就能完成全部葉子結點的完整性認證。梅克爾樹結構如圖3所示。

圖3 梅克爾樹結構
梅克爾樹的計算過程如下:
假設某區塊共8個交易(T1-T8),每筆交易對應于一個SHA256校驗值。要計算父結點的值,需要將其不同子結點的哈希值進行相加,再對相加的結果進行SHA256計算,求出的值即為父結點對應的值。計算過程自底向上進行類推,最終得到的哈希值即為根節點H0的值。按照上面的方式進行計算,便會形成一棵二元梅克爾樹。圖3中,所有葉子結點(H7-H14)保存著交易(T1-T8)的實際哈希值;內部結點(H1-H6)保存著由孩子結點生成的哈希值。所有內部結點形成的路徑組合是驗證葉子結點完整性的校驗路徑可能性,因此它們也被稱為路徑哈希值。在本文方案中,為了實現對存儲數據提供完整性證明,梅克爾樹葉子結點保存是對數據塊通過SHA256算法進行計算所得到的哈希值。
基于區塊鏈的云存儲方案的框架如圖4所示。

圖4 系統框架圖
基于區塊鏈的云存儲方案框架圖中存在如下幾個實體:
(1) 用戶:用戶實體,負責將本地文件或數據上傳到云服務器上。
(2) 區塊鏈:記錄交易的實體。
(3) 云服務器:存儲文件塊的實體。存儲用戶上傳的數據塊。
在圖4的框架下,首先需要將用戶的文件或數據在本地進行劃分,文件或數據塊的大小保持相同,再對生成的塊通過加密算法進行加密,最后上傳這些塊到云服務器中。利用區塊鏈技術,作為用戶和云存儲服務提供商的交易機制,保存存儲數據塊的位置索引和一些額外信息到交易中。我們在此架構中選擇使用隨機文件塊放置策略[10],而不是選擇多文件副本放置策略[11-12],這不僅能夠減少存儲的壓力,也方便用戶可以從云服務器中快速檢索文件并減少分布式存儲網絡的負擔。另外,通過梅克爾樹驗證存儲文件的數據完整性時,先利用云服務器上存儲的梅克爾樹結構生成新的樹根root,將其發送到區塊鏈上進行比較,這與文獻[13]不同,后者是在區塊鏈上通過執行預設的智能合約生成root再進行對比,前者進一步減少了云服務器與區塊鏈間的通信,從而更加高效。
用戶上傳文件到云服務器可以分為:
(1) 將文件劃分成大小相等的塊(不足的用0進行填充),對文件和所有文件塊進行加密。
(2) 對加密文件和全部加密文件塊根據SHA256算法進行計算得到相應的哈希值。
(3) 利用步驟(2)中的所有加密文件塊的哈希值構造梅克爾樹。
(4) 存儲步驟(3)中的梅克爾樹的樹根哈希值root到區塊鏈上。
(5) 用戶客戶端上傳所有加密文件塊以及公共梅克爾哈希樹到云存儲服務器中。
(6) 云存儲服務器返回所有文件塊位置索引URL給用戶客戶端。
文件上傳的流程設計如圖5所示。

圖5 文件上傳流程設計
創建交易就是為了將關于文件的信息(而不是文件本身)永久保存在區塊鏈上,也便于對文件的完整性進行驗證。創建的交易中保存的相關信息如圖6所示。

圖6 區塊體中的交易信息
可以看出,存儲用戶ID、用戶IP、文件哈希值、所有文件塊的URLs等信息到創建的交易中,而不是將文件塊本身存儲到區塊鏈中。值得注意的是,每個用戶客戶端都會擁有區塊鏈中所有交易的副本,并且這些交易信息的字節大小相對于用戶客戶端的硬盤存儲空間來講完全可以忽略不計,因此這樣既可以為用戶節約大量的存儲空間,也使得攻擊者幾乎不可能對區塊鏈上的存儲信息進行任何的篡改。另一方面,因為只有文件塊URLs和哈希值存儲在區塊鏈上,攻擊者無法從區塊鏈上獲得有關存儲數據和用戶的任何其他信息,從而對數據和用戶進行了良好的隱私保護。
文件完整性驗證流程設計如圖7所示。

圖7 完整性驗證流程設計
為了實現文件完整性的檢測,需要進行以下幾個步驟:
(1) 用戶客戶端發送挑戰數si到云服務器(表示對第i文件塊進行驗證)。
(2) 云服務器對文件塊i和si挑戰數進行SHA256計算,生成哈希摘要j。
(3) 云服務器根據哈希摘要j,利用服務器上存儲的梅克爾樹結構生成新的梅克爾樹根值root’。
(4) 云服務器發送新的梅克爾樹根值root’到區塊鏈上。
(5) 比較root’和區塊鏈上存儲的root。若相等,則存儲的文件完整;反之,則文件已經被破壞。
(6) 區塊鏈將步驟(5)得到的驗證結果返回給用戶客戶端。
為了驗證研究方案的可行性及高效性,通過實驗模擬了客戶端和云服務器,區塊鏈系統由以太坊實現。在實驗中,將4 GB大小的文件劃分成不同數量的塊,且保持每個文件塊大小一致。然后,對梅克爾樹生成時間和完整性驗證時間與文件塊數量之間的關系進行測驗。相應的實驗結果分別對應于圖8和圖9。

圖8 梅克爾樹生成時間與文件塊數量之間的關系

圖9 數據完整性驗證時間與文件塊數量之間的關系
由圖8可以看出,隨著對相同文件劃分的文件塊越來越多,梅克爾樹的葉子結點相應增加,梅克爾樹的生成時間也增加。從圖9可知,文件塊數量增加,數據完整性的驗證時間也隨之增加,但是仍然能在較短時間內完成數據驗證,這是可以接受的。
隨著云存儲的廣泛應用,如何確保數據的完整性和隱私性得到了廣泛的關注。本文將區塊鏈技術引入到云存儲系統中,對傳統的云存儲架構進行改進,提出一種基于區塊鏈的云存儲方案,有效地解決了這兩個問題。首先,利用區塊鏈中的梅克爾樹屬性對存儲數據的完整性進行驗證,使得驗證過程不經過任何可信第三方,解決了數據完整性問題。其次,由于區塊鏈的匿名性,并在數據存儲的過程對文件或數據進行加密并進行分塊,將所有分塊存儲到云服務器上,有效保證數據的隱私性。同時,通過文件塊的冗余存儲也有助于對已破壞的文件或數據進行恢復。