有效地加密大型流(> 1 TB)

时间:2018-10-01 21:00:24

标签: java encryption

Encrypting large streams to be sent via Amazon S3

我正在尝试解决相同的问题,但我偶然发现了一个问题:> 4 GB的文件开始播放时,线程在最后挂起。而且,管道流可能真的很慢。.

我当时正在考虑用缓冲流替换它们,但是我仅将InputStream作为参数,并且返回了加密的InputStream。缓冲流需要基础流(而且我缺少OutputStream)。因此,如果不是出于上述原因,此处的管道流将是一个不错的选择。

此外,手动启动该线程是一个好主意吗?改用ExecutorService怎么办?

1 个答案:

答案 0 :(得分:0)

这是我对mentioned thread中您的设计的个人看法。如前所述,您正在加密,因此我认为您的加密方法不合适。

在上述线程中,您使用的CBC模式绝对不适用于流加密。如果您要发送的实际上是流,我建议使用流加密模式,例如CTR或流加密算法(尽管建议使用前者)。

如果使用流模式,则可以动态地独立加密/解密内容的每个部分。因此,您甚至可以拆分内容并将内容分几部分发送,而不是1个大文件。另外,在流模式下,密文大小等于纯文本大小,因此在加密之前您将知道结果大小。

关于挂起的线程,我想可能也是由于加密算法所致。如果您在线程上发布时使用AES/CBC/NoPadding密码,您只能加密其大小为AES块大小(16字节)的倍数的数据。发生这种情况是因为您使用的是没有任何填充机制的分组密码模式。我想您的加密应该在您的普通数据(流)大小不是16字节的倍数时挂起,而不是在数据大小非常大时挂起。如果确实是您的问题,那么更改为流密码模式也应该可以解决此问题。