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