如何加密一个超100G的大文件
1. 一些背景
最近在学响应式编程的时候,偶然在知乎上看到一个新闻,说的是有人的icloud数据丢失了,那我在想,能否把自己的icloud数据定期导出然后进行加密,备份到某些云盘当中,找着找着发现Bouncy Castle
Bouncy Castle是一个开源的加密和密码学库,旨在为Java和C#开发者提供安全的编程工具。它提供了一系列密码学算法、协议和工具,包括对称加密、非对称加密、数字签名、消息摘要、证书操作等
而BC加密的代码似乎只是单线程的,对于小文件的加密还好,如果是大文件加密的时候,就会直接内存溢出。
那么能否使用响应式编程分段加密一个大文件的内容?解密的时候则反之,对加密后的内容分段解密,按照顺序写入同一个文件即可。
2. 怎么做呢
我想到以前写netty
的时候有玩过 RandomAccessFile
,可以对一个文件分割成多个ChunkFile
,这段记忆的来源于几年前在某家公司做端对端文件传输的时候用到过这个。
那么使用RandomAccessFile
把单个文件读取为多个ChunkFile
,然后进行加密,加密后转base64编码,则完成了加密的步骤。
这是主要的流程,当中使用响应式编程框架project-reactor更加方便处理多个线程任务,对不同的ChunkFile
进行加密,最后按照顺序写入文件。而对字节数组进行base64编码后,会导致最后生成的文件变大1.x
倍左右,所以最后可以再加个能对base64编码后的文本压缩的方法,再得到最后的文件,减少文件的体积。
wooow,想的就觉得很有意思~~(自我感觉)~~,这样以后所有的隐私文件都能这样处理,甚至上传到notion上,notion可是支持无限容量上传的,不过会限制单个文件在5G以内,这个嘛我们也是有办法解决的,写入文件的时候再做分片好了,限制单个分片文件的大小。
下面章节内容中包含的代码,你可以在我的github中找到,并直接使用CipherUtilTest
的encryptBigFile
方法先玩玩简单的功能,这个类包含了所有功能的unit test,可以尝试一下加密一个文件,然后又还原一个文件。