【问题标题】:Encrypting large streams( > 1 TB) efficiently有效加密大流(> 1 TB)
【发布时间】:2018-10-02 18:43:08
【问题描述】:

Encrypting large streams to be sent via Amazon S3

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

我正在考虑用缓冲流替换它们,但我只将 InputStream 作为参数,并返回一个加密的 InputStream。缓冲流需要底层流(我缺少一个 OutputStream)。因此,管道流在这里将是一个不错的选择 - 如果不是出于上述原因。

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

【问题讨论】:

  • 这可能是 S3 对象大小的限制吗?这篇文章aws.amazon.com/blogs/aws/amazon-s3-multipart-upload 指出了 5GB 的“旧”对象大小限制和 5TB 的新限制(分段上传)。尝试将输出流写入文件而不是 AWS,以使用本地输出测试实施的限制。 (好的。链接有点旧。)但测试会显示流或 S3 实现的限制。
  • @Konrad 抱歉,我不够具体 - 这不完全是关于 S3,我将这个 sn-p 代码用于其他存储提供商(Azure 等)。文件传输确实有效 - 但是当它第 5 次完成时 - 线程只是挂起。虽然,我很感激你发送的信息,它会很有用 - 谢谢你。
  • 您是否创建了 VM 的线程转储以查看线程被阻塞时线程的内部代码位置。接下来检查源以查看预期会发生什么。

标签: java encryption


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的意见 - 我会做一些研究。但我认为这并不能真正解决挂起线程的问题?
  • @user3285241 更新重播,猜测挂起线程。
  • 如果我改用 AES/ECB/PKCS5Padding 会怎样?
  • 顺便说一句 - 当我上传到 S3 时线程没有挂起,但不能说关于 Azure。
  • @user3285241 如果您使用该填充,应该没问题。
猜你喜欢
  • 2011-06-24
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 2012-04-02
相关资源
最近更新 更多