文件加密之后下载时间变长


最近在一个项目中用到CipherInputStream / CipherOutputStream对用户通过http上传的文件进行加密存储,上传之后加密没有任何问题,但是在解密之后下载时发现即使是本地测试也要等好长时间才能下载完成,下载代码肯定出现了问题。

        文本使用CipherInputStream加密,加密使用AES算法,使用CBC模式填充,代码如下:

</pre><pre name="code" class="java">     Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
     c.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(new byte[16]));
使用填充保证不会丢失最后(文件大小模16)的字节数。

但在解密时设置http协议实体头部ContentLength时,设为

response.setContentLength((int)file.length());
file表示加密过之后的文件,所以file的大小不一定为源文件的大小(当源文件的大小能被16整除时才相等)。

由于response ContentLength 的长度和实体的长度不一致,导致下载完解密之后的文件后,浏览器仍保持链接去等待下载剩余的字节直到http协议超时。这就是下载加密文件时间比较长的原因。

暂时想到的解决办法有两个:

1. 先把解密后的文件保存为临时文件,然后下载这个临时文件。

2. 上传时保存文件的大小,下载时 把ContentLength设置为这个大小。

根据需求,本项目已保存了每次上传的文件大小,顾采用第二种方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值