(閩北職業(yè)技術(shù)學院 信息與工程系,福建 南平 353000)
隨著網(wǎng)絡存儲應用越來越廣泛[1],傳統(tǒng)的文件上傳模式,遇到大文件上傳時,容易造成服務器負載過大,同時,將文件以明文的方式存儲在服務器,或簡單的進行加密處理,一旦服務器遭遇黑客攻擊,文件被非法竊取導致文件信息泄漏,其后果嚴重。因此,對如何有效減輕文件上傳過程中服務器的負載,提高文件存儲安全性的研究具有一定的先進性和實際應用價值。文獻[2]中提出了一種文件分割上傳的思路,文件分割塊大小固定,針對服務器負載與分割上傳耗時的沖突解決不夠靈活,沒有對文件分割上傳的實現(xiàn)及文件類型驗證進行說明。本文提出了一種基于HTML5、AJAX的文件分割上傳方法,該方法使用HTML5中的File對象對文件進行分割,文件分割尺寸根據(jù)文件大小在區(qū)間范圍內(nèi)動態(tài)設置,降低服務器負載的同時,優(yōu)化了分割上傳的時間消耗,使用FormData對象進行文件異步上傳,提升上傳過程用戶體驗,在服務器端讀取文件頭信息對比驗證文件類型,防止惡意上傳。文獻[3]中提出了文件加密分割、離散云存儲,其核心是將文件加密分割后分散存儲在多個云服務端,在客戶端軟件中實現(xiàn)文件塊獲取、解密、重組。該方案要求用戶同時擁有多個云服務,且要求云服務開放文件讀取接口,普及難度較大。文獻[4]中提出了二次分割的新型文件分割技術(shù),將分割后的文件塊再次分割成數(shù)量相同的N個子塊,根據(jù)相同編號拼接成最終的N個文件塊,雖然打亂了文件順序,但在加密環(huán)節(jié)不夠深入,二次分割規(guī)則一旦被破解,文件安全難以保障。結(jié)合文獻[3-4]中的優(yōu)點,并充分考慮實際應用中的可行性與易用性,在本文的文件分割上傳基礎上,針對文件存儲安全提出了一種將文件加密、分割、分散存儲的方法。該方法使用AES算法結(jié)合動態(tài)密鑰對文件進行加密、分割、分散存儲,使用RSA算法加密密鑰,由用戶保存私鑰,在下載時解密、合并文件,以二進制流分塊輸出的方法,并結(jié)合AES算法CPU加速和內(nèi)存安全防護,進行性能提升與安全防護。
File對象,繼承了Blob對象的屬性和方法,可以將上傳的文件通過slice方法進行本地分割,還擴展了一些新的屬性[5]。File對象的主要屬性及方法,見表1。
表1 File對象主要屬性及方法
文件大?。╢ileSize)可通過File對象的size屬性獲得。分割塊大小(cutSize)的設置需要綜合考慮分塊數(shù)量、服務器網(wǎng)速、服務器配置、并發(fā)用戶預估峰值、客戶端網(wǎng)速等因素。分割塊越小,則塊數(shù)越多,會增加上傳處理時間,分割塊太大,會影響分割上傳的效果。為了平衡分割塊大小與分割塊數(shù),增強文件分割的時效性、穩(wěn)定性,提出了分割塊大小的區(qū)間范圍優(yōu)先于預設塊數(shù)的原則,對文件的分割塊大小進行區(qū)間范圍內(nèi)的動態(tài)設置。cutSize取值的相關(guān)參數(shù),見表2。
表2 cutSize取值的相關(guān)參數(shù)
根據(jù)分割塊大小區(qū)間優(yōu)先于預設塊數(shù)的原則,cutSize的取值為:
分割塊數(shù)(blockCount)與文件大小、分割塊大小之間的關(guān)系為:
以表2的參考值為例,隨著上傳文件大小的變化,分割塊大小、分割塊數(shù)的變動走勢,如圖1所示。
圖1 分割塊大小、分割塊數(shù)走勢圖
分割塊索引(blockIndex)、 分割塊的起始位置(start)、分割塊的終止位置(end),則每一個分割塊的分割起止位置值為:
XMLHttpRequest Level 2新增FormData接口。可以利用FormData對象組裝一組用 XMLHttpRequest發(fā)送請求的鍵/值對,還可以使用FormData對象異步上傳文件[6]。Jquery中的ajax方法封裝了異步的實現(xiàn),上傳文件時,需要將processData屬性、contentType屬性的值設置為false,否則會造成文件上傳失敗。
HTTP使用的是無連接協(xié)議,為了服務器能夠識別出上傳的文件、分割塊順序、是否上傳完畢,要求異步提交的數(shù)據(jù)中包含文件唯一標識、分割塊索引、分割塊數(shù)。上傳的文件最終經(jīng)過加密后分散存儲,為了安全,未加密的原文件在加密操作后執(zhí)行刪除,并使用數(shù)據(jù)庫存儲文件的分散路徑。文件的唯一標識由服務器端生成,為了提高效率,可在服務器端處理第一個分割塊時生成,并在回調(diào)結(jié)果中返回,供后繼的分割塊使用。文件分割上傳過程,如圖2所示。
圖2 文件分割上傳流程圖
為了避免非法文件類型上傳到服務器,需要對上傳的文件類型進行驗證。JS中File對象的type屬性雖然可以獲得文件的MIME類型,但基于JS的文件類型判斷不可靠。由于使用文件分割、異步上傳,在服務器端通過ContentType屬性獲取文件塊的文件類型,得到的結(jié)果都是application/octetstream,無法區(qū)分不同的文件類型。經(jīng)研究發(fā)現(xiàn),文件的第一個分割塊中包含了文件頭信息,因此,可以使用文件頭比對的方法來識別文件的類型。
客戶端自定義方法PostFile(file,blockIndex)對文件分割上傳進行操作,遍歷上傳每一個分割塊,需要遞歸調(diào)用PostFile方法,為了進一步提高遞歸調(diào)用性能,采用了尾遞歸實現(xiàn)[7]。在ASP.NET中,服務器端可以使用一般處理程序進行實現(xiàn),服務器端需要驗證用戶身份,避免非法用戶惡意上傳。
將本文的文件分割上傳方法與普通的文件上傳方法進行實驗對比,通過服務器性能分析器對文件上傳過程中的主要參數(shù)進行監(jiān)測,發(fā)現(xiàn)文件分割上傳能夠有效降低服務器內(nèi)存負載,特別是在大文件上傳時,效果更加明顯。在2G的內(nèi)存環(huán)境下,上傳510M的文件,對內(nèi)存對象的Pages/sec、Available MBytes進行實驗對比,如圖3所示。
圖3 分割上傳與普通上傳對比(Pages/sec)
對實驗結(jié)果進行分析,分割上傳時,Pages/sec的平均值4.099、峰值203.993,可用內(nèi)存穩(wěn)定,上傳所發(fā)費的時間較多。普通上傳時,Pages/sec的平均值284.135、峰值10607,867,峰值出現(xiàn)在文件上傳結(jié)束時,峰值持續(xù)時間較長,可用內(nèi)存快速下降,之后快速回升,上傳所發(fā)費的時間較少。文件分割上傳所發(fā)費的時間較多,可通過調(diào)整表2中的分塊最小值、分塊最大值、預設塊數(shù),來實現(xiàn)性能和時間上的一個平衡。實驗表明,本文所提出的文件分割上傳方案能夠有效降低服務器負載、性能穩(wěn)定、設置靈活。
在本文的文件分割上傳基礎上,對文件加密存儲進行研究。主要包括加密方案的設計、算法的選擇、性能的分析與安全防護。
在文獻[3-4]的基礎上,提出改進的文件加密存儲方案,改進后的文件加密存儲及解密下載過程,如圖4~5所示。
圖4 文件加密存儲流程圖
圖5 文件解密下載流程圖
RSA算法在公開密鑰加密和電子商業(yè)中應用普及。AES算法適合用于大數(shù)據(jù)加密,加密、解密速度快[8],AES的詳細說明請參見FIPS 197[9],已被全世界廣泛使用。針對RSA算法不適合大數(shù)據(jù)加密、AES算法密鑰管理不安全的問題,可以有機融合兩種算法進行取長補短[10-11]。因此,文件數(shù)據(jù)量較大,對加密速度有要求,使用AES算法加密,加密的密鑰使用RSA算法加密,方便密鑰管理。
文件的加密分割、分散存儲、解密合并,使用自定義類Crypto進行封裝實現(xiàn)。類Crypto的主要成員,如表3所示。
表3 類Crypto的主要成員
改進后的加密存儲方案,主要優(yōu)點表現(xiàn)如下:
(1)文件分割上傳:降低上傳過程服務器端負載,對瀏覽器的支持也更好。
(2)文件分散存儲:隨機分散存儲文件,提高非法獲取完整文件的難度??梢栽谕慌_服務器分散存儲,也可以在多個存儲設備分散存儲,可根據(jù)項目需求靈活設置。
(3)隨機生成文件加密密鑰:每一個文件的加密密鑰都不一樣,所有文件需要單獨破解,較使用同一密鑰加密,破解難度大大提升。
(4)密鑰加密存儲:提升了加密密鑰的存儲安全。
(5)公鑰隔離存儲:公鑰單獨存儲,更安全。
(6)私鑰的一部分由用戶保存:私鑰是解密文件的最后一環(huán),一部分由用戶保存,提高了私鑰存儲安全性的同時,也降低了私鑰存儲對用戶的依賴性。
(7)二進制文件流分塊輸出:降低服務器負載。
改進后的文件加密存儲方案,增加了少量的時間開銷與成本投入,為了進一步增強私鑰存儲的安全性,對私鑰進行分散管理[12],讓系統(tǒng)用戶只保存私鑰的一部分,較大程度的提高了文件存儲的安全性。
方案中RSA算法用于對密鑰進行加密,雖然速度較慢,但密鑰數(shù)據(jù)量不多。AES算法用于對文件數(shù)據(jù)進行加密,其性能是關(guān)鍵。針對AES算法的三種密鑰長度,進行文件加密速度測試,如圖6所示。使用256位的密鑰相比128位密鑰,其耗時增加40%左右,加密100 MB的文件,時間只相差0.6秒。其耗時增加可以接受,為了提升安全性,方案中的AES算法密鑰使用256位。
2010年,Intel發(fā)布了支持AES加速的CPU。對于非并行模式的 AES操作,如CBC加密,AES_NI可以獲得2到3倍的性能,對于并行模式的AES操作,如CBC解密、CTR,AES_NI可以獲得10X的性能[13]。方案中的服務器使用支持AES加速的CPU。
圖6 文件加密時間對比
針對RSA算法的攻擊方法,主要是基于大數(shù)因數(shù)分解,已公開破譯的密鑰長度是768位。采用消除密鑰中模n的分布方法,可以成功避免公鑰和私鑰中出現(xiàn)n,防止攻擊者通過因子分解法分解出公鑰中n的因子,推導出解密密鑰,采用三因子的加密算法,加大了分解的困難性[14]。將傳統(tǒng)RSA改進為四素數(shù)RSA的基礎上,再運用數(shù)學變換進行參數(shù)替換,消除了在公鑰中對傳輸兩個隨機素數(shù)的乘積n的需要,引入了一個新的參數(shù)x代替原參數(shù)n[15]。為了提升密鑰被破譯的難度,方案中的RSA算法使用2048位密鑰。
針對AES算法的攻擊手段主要包括:線性及差分分析、相關(guān)性分析、代數(shù)分析、立方體分析和旁路攻擊,旁路攻擊包括:電磁輻射分析、時序分析、差分故障分析、功耗分析。上海交大郁昱教授、以色列特拉維夫大學的Daniel Genkin等研究人員使用旁路攻擊成功破解了AES加密。實際應用中,服務器環(huán)境的配置很重要,如:防止內(nèi)存頁被交換至硬盤、限制硬件對內(nèi)存的訪問權(quán)限等,才能更好的保障文件存儲的安全。AES算法只有在極特殊的環(huán)境下才能被破解,AES256在當前的計算機體系結(jié)構(gòu)下,還沒有實質(zhì)性的破解威脅。
異步文件分割上傳,降低了服務器負載,通過對分割塊大小使用區(qū)間范圍內(nèi)的動態(tài)設置,兼顧了分割上傳的時效性與穩(wěn)定性。使用AES算法結(jié)合動態(tài)密鑰加密文件并分割、分散存儲,并配套支持AES加速的CPU,提升了加密、解密過程的性能。對加密密鑰再次使用RSA算法加密,私鑰的一部分由系統(tǒng)用戶保存,保障了密鑰存儲的安全性。本文所提出的基于HTML5、AJAX的文件分割上傳、加密存儲方案,貫穿了文件的上傳、加密、解密、下載全過程,經(jīng)實際應用與測試,性能穩(wěn)定并能有效的降低服務器負載、提升文件存儲的安全性。