Java使用对称加密算法加密大文件内存资源消耗问题

公司要求和外网合作方通信传输文件时要求除使用https以为应用层自己完成一次加密,但java层写得加密方式都需要将文件完整内容读出后再进行加密,这无疑占用内存资源是个大问题,如果文件为10MB即使加密后依然为10MB,则每个并发需要消耗20MB的内存资源(例子中的byteContent和result各占10MB),同时GC也是个较大的负担。如果我对文件进行分片处理每1MB做一次加密,则合作方也需要根据同样的分片规则对文件进行解密后再重组明文文件,这无疑是提高了接入方技术复杂度,技术接入文档也比较难描述清楚,请问有什么方式能降低单个并发线程对内存的资源消耗同时不增加接入技术的复杂度?

Cipher cipher = Cipher.getInstance("AES");// 创建密码器  
byte[] byteContent = IOUtils.toByteArray(fileInputStream);// 获取文件内容
cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化  
byte[] result = cipher.doFinal(byteContent);  // 对文件内容进行加密
阅读 7.6k
1 个回答

使用 CipherOutputStream

Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, key);

InputStream is = new FileInputStream(file);  
CipherOutputStream out = new CipherOutputStream(new FileOutputStream(dest), cipher)

IOUtils.copyLarge(is, out);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题