基于HTML5、AJAX的文件分割上传与加密存储研究
2018-09-21
(闽北职业技术学院 信息与工程系,福建 南平 353000)
随着网络存储应用越来越广泛[1],传统的文件上传模式,遇到大文件上传时,容易造成服务器负载过大,同时,将文件以明文的方式存储在服务器,或简单的进行加密处理,一旦服务器遭遇黑客攻击,文件被非法窃取导致文件信息泄漏,其后果严重。因此,对如何有效减轻文件上传过程中服务器的负载,提高文件存储安全性的研究具有一定的先进性和实际应用价值。文献[2]中提出了一种文件分割上传的思路,文件分割块大小固定,针对服务器负载与分割上传耗时的冲突解决不够灵活,没有对文件分割上传的实现及文件类型验证进行说明。本文提出了一种基于HTML5、AJAX的文件分割上传方法,该方法使用HTML5中的File对象对文件进行分割,文件分割尺寸根据文件大小在区间范围内动态设置,降低服务器负载的同时,优化了分割上传的时间消耗,使用FormData对象进行文件异步上传,提升上传过程用户体验,在服务器端读取文件头信息对比验证文件类型,防止恶意上传。文献[3]中提出了文件加密分割、离散云存储,其核心是将文件加密分割后分散存储在多个云服务端,在客户端软件中实现文件块获取、解密、重组。该方案要求用户同时拥有多个云服务,且要求云服务开放文件读取接口,普及难度较大。文献[4]中提出了二次分割的新型文件分割技术,将分割后的文件块再次分割成数量相同的N个子块,根据相同编号拼接成最终的N个文件块,虽然打乱了文件顺序,但在加密环节不够深入,二次分割规则一旦被破解,文件安全难以保障。结合文献[3-4]中的优点,并充分考虑实际应用中的可行性与易用性,在本文的文件分割上传基础上,针对文件存储安全提出了一种将文件加密、分割、分散存储的方法。该方法使用AES算法结合动态密钥对文件进行加密、分割、分散存储,使用RSA算法加密密钥,由用户保存私钥,在下载时解密、合并文件,以二进制流分块输出的方法,并结合AES算法CPU加速和内存安全防护,进行性能提升与安全防护。
1 文件分割上传
1.1 文件分割
File对象,继承了Blob对象的属性和方法,可以将上传的文件通过slice方法进行本地分割,还扩展了一些新的属性[5]。File对象的主要属性及方法,见表1。
表1 File对象主要属性及方法
文件大小(fileSize)可通过File对象的size属性获得。分割块大小(cutSize)的设置需要综合考虑分块数量、服务器网速、服务器配置、并发用户预估峰值、客户端网速等因素。分割块越小,则块数越多,会增加上传处理时间,分割块太大,会影响分割上传的效果。为了平衡分割块大小与分割块数,增强文件分割的时效性、稳定性,提出了分割块大小的区间范围优先于预设块数的原则,对文件的分割块大小进行区间范围内的动态设置。cutSize取值的相关参数,见表2。
表2 cutSize取值的相关参数
根据分割块大小区间优先于预设块数的原则,cutSize的取值为:
分割块数(blockCount)与文件大小、分割块大小之间的关系为:
以表2的参考值为例,随着上传文件大小的变化,分割块大小、分割块数的变动走势,如图1所示。
图1 分割块大小、分割块数走势图
分割块索引(blockIndex)、 分割块的起始位置(start)、分割块的终止位置(end),则每一个分割块的分割起止位置值为:
1.2 异步上传文件
XMLHttpRequest Level 2新增FormData接口。可以利用FormData对象组装一组用 XMLHttpRequest发送请求的键/值对,还可以使用FormData对象异步上传文件[6]。Jquery中的ajax方法封装了异步的实现,上传文件时,需要将processData属性、contentType属性的值设置为false,否则会造成文件上传失败。
HTTP使用的是无连接协议,为了服务器能够识别出上传的文件、分割块顺序、是否上传完毕,要求异步提交的数据中包含文件唯一标识、分割块索引、分割块数。上传的文件最终经过加密后分散存储,为了安全,未加密的原文件在加密操作后执行删除,并使用数据库存储文件的分散路径。文件的唯一标识由服务器端生成,为了提高效率,可在服务器端处理第一个分割块时生成,并在回调结果中返回,供后继的分割块使用。文件分割上传过程,如图2所示。
图2 文件分割上传流程图
为了避免非法文件类型上传到服务器,需要对上传的文件类型进行验证。JS中File对象的type属性虽然可以获得文件的MIME类型,但基于JS的文件类型判断不可靠。由于使用文件分割、异步上传,在服务器端通过ContentType属性获取文件块的文件类型,得到的结果都是application/octetstream,无法区分不同的文件类型。经研究发现,文件的第一个分割块中包含了文件头信息,因此,可以使用文件头比对的方法来识别文件的类型。
客户端自定义方法PostFile(file,blockIndex)对文件分割上传进行操作,遍历上传每一个分割块,需要递归调用PostFile方法,为了进一步提高递归调用性能,采用了尾递归实现[7]。在ASP.NET中,服务器端可以使用一般处理程序进行实现,服务器端需要验证用户身份,避免非法用户恶意上传。
1.3 分割上传实验分析
将本文的文件分割上传方法与普通的文件上传方法进行实验对比,通过服务器性能分析器对文件上传过程中的主要参数进行监测,发现文件分割上传能够有效降低服务器内存负载,特别是在大文件上传时,效果更加明显。在2G的内存环境下,上传510M的文件,对内存对象的Pages/sec、Available MBytes进行实验对比,如图3所示。
图3 分割上传与普通上传对比(Pages/sec)
对实验结果进行分析,分割上传时,Pages/sec的平均值4.099、峰值203.993,可用内存稳定,上传所发费的时间较多。普通上传时,Pages/sec的平均值284.135、峰值10607,867,峰值出现在文件上传结束时,峰值持续时间较长,可用内存快速下降,之后快速回升,上传所发费的时间较少。文件分割上传所发费的时间较多,可通过调整表2中的分块最小值、分块最大值、预设块数,来实现性能和时间上的一个平衡。实验表明,本文所提出的文件分割上传方案能够有效降低服务器负载、性能稳定、设置灵活。
2 文件加密存储方案研究
在本文的文件分割上传基础上,对文件加密存储进行研究。主要包括加密方案的设计、算法的选择、性能的分析与安全防护。
2.1 文件加密存储改进
在文献[3-4]的基础上,提出改进的文件加密存储方案,改进后的文件加密存储及解密下载过程,如图4~5所示。
图4 文件加密存储流程图
图5 文件解密下载流程图
RSA算法在公开密钥加密和电子商业中应用普及。AES算法适合用于大数据加密,加密、解密速度快[8],AES的详细说明请参见FIPS 197[9],已被全世界广泛使用。针对RSA算法不适合大数据加密、AES算法密钥管理不安全的问题,可以有机融合两种算法进行取长补短[10-11]。因此,文件数据量较大,对加密速度有要求,使用AES算法加密,加密的密钥使用RSA算法加密,方便密钥管理。
文件的加密分割、分散存储、解密合并,使用自定义类Crypto进行封装实现。类Crypto的主要成员,如表3所示。
表3 类Crypto的主要成员
改进后的加密存储方案,主要优点表现如下:
(1)文件分割上传:降低上传过程服务器端负载,对浏览器的支持也更好。
(2)文件分散存储:随机分散存储文件,提高非法获取完整文件的难度。可以在同一台服务器分散存储,也可以在多个存储设备分散存储,可根据项目需求灵活设置。
(3)随机生成文件加密密钥:每一个文件的加密密钥都不一样,所有文件需要单独破解,较使用同一密钥加密,破解难度大大提升。
(4)密钥加密存储:提升了加密密钥的存储安全。
(5)公钥隔离存储:公钥单独存储,更安全。
(6)私钥的一部分由用户保存:私钥是解密文件的最后一环,一部分由用户保存,提高了私钥存储安全性的同时,也降低了私钥存储对用户的依赖性。
(7)二进制文件流分块输出:降低服务器负载。
改进后的文件加密存储方案,增加了少量的时间开销与成本投入,为了进一步增强私钥存储的安全性,对私钥进行分散管理[12],让系统用户只保存私钥的一部分,较大程度的提高了文件存储的安全性。
2.2 性能分析与提升
方案中RSA算法用于对密钥进行加密,虽然速度较慢,但密钥数据量不多。AES算法用于对文件数据进行加密,其性能是关键。针对AES算法的三种密钥长度,进行文件加密速度测试,如图6所示。使用256位的密钥相比128位密钥,其耗时增加40%左右,加密100 MB的文件,时间只相差0.6秒。其耗时增加可以接受,为了提升安全性,方案中的AES算法密钥使用256位。
2010年,Intel发布了支持AES加速的CPU。对于非并行模式的 AES操作,如CBC加密,AES_NI可以获得2到3倍的性能,对于并行模式的AES操作,如CBC解密、CTR,AES_NI可以获得10X的性能[13]。方案中的服务器使用支持AES加速的CPU。
图6 文件加密时间对比
2.3 算法攻击与防护
针对RSA算法的攻击方法,主要是基于大数因数分解,已公开破译的密钥长度是768位。采用消除密钥中模n的分布方法,可以成功避免公钥和私钥中出现n,防止攻击者通过因子分解法分解出公钥中n的因子,推导出解密密钥,采用三因子的加密算法,加大了分解的困难性[14]。将传统RSA改进为四素数RSA的基础上,再运用数学变换进行参数替换,消除了在公钥中对传输两个随机素数的乘积n的需要,引入了一个新的参数x代替原参数n[15]。为了提升密钥被破译的难度,方案中的RSA算法使用2048位密钥。
针对AES算法的攻击手段主要包括:线性及差分分析、相关性分析、代数分析、立方体分析和旁路攻击,旁路攻击包括:电磁辐射分析、时序分析、差分故障分析、功耗分析。上海交大郁昱教授、以色列特拉维夫大学的Daniel Genkin等研究人员使用旁路攻击成功破解了AES加密。实际应用中,服务器环境的配置很重要,如:防止内存页被交换至硬盘、限制硬件对内存的访问权限等,才能更好的保障文件存储的安全。AES算法只有在极特殊的环境下才能被破解,AES256在当前的计算机体系结构下,还没有实质性的破解威胁。
3 结束语
异步文件分割上传,降低了服务器负载,通过对分割块大小使用区间范围内的动态设置,兼顾了分割上传的时效性与稳定性。使用AES算法结合动态密钥加密文件并分割、分散存储,并配套支持AES加速的CPU,提升了加密、解密过程的性能。对加密密钥再次使用RSA算法加密,私钥的一部分由系统用户保存,保障了密钥存储的安全性。本文所提出的基于HTML5、AJAX的文件分割上传、加密存储方案,贯穿了文件的上传、加密、解密、下载全过程,经实际应用与测试,性能稳定并能有效的降低服务器负载、提升文件存储的安全性。