【问题标题】:Amazon S3 Deduplication?Amazon S3 重复数据删除?
【发布时间】:2017-09-17 07:01:53
【问题描述】:

我目前正在编写一个视频共享网站。对于上传,我使用的是 PHP。我注意到当我上传视频时,S3 会获取文件的 MD5 哈希值。我想知道 S3 是否进行任何重复数据删除。我上传了几个相同的文件,但没有看到任何内容表明 S3 知道它们是相同的,或者至少它正在做任何事情。

我应该自己实现吗?我有一个 MySQL 数据库,用于存储所有视频信息。如果它们相同,我可以对所有视频进行哈希处理并提供以前上传的文件。我可以简单地做md5(tmp-file-here)。这似乎是合适的,因为 S3 已经在使用 md5。但是,与针对诸如 BLAKE2 之类的优化的东西相比,md5 速度较慢。我应该这样做吗?最好的方法是什么?

【问题讨论】:

  • 误报的风险是什么,也就是说,我们说两个文件是重复的,而它们不是?

标签: php amazon-s3 hash duplicates md5


【解决方案1】:

S3 不会公开任何内部重复数据删除的证据。如果您要上传 500 个相同的文件,每个文件 1 GB,则需要为存储 500 GB 付费。

因此,如果您想考虑对上传的内容进行重复数据删除,则需要推出自己的解决方案,但请考虑以下几点:

标准的 md5 哈希算法并不是 S3 在 ETags 上使用的唯一算法。它还使用嵌套 md5 算法进行分段上传,对于大于 5 GB 的上传是必需的,对于较小的文件是可选的,并且作为不同数量的部分上传的两个相同文件不会具有相同的 ETag。 (在 HTTP 中,ETag 的范围是单个资源,并且它只有一个单向约束:如果资源更改,它的 ETag 必须更改,但不同的 ETag 不一定通信信息。S3 比这更严格,但 ETag 不是完美的重复数据删除密钥)。

但重要的是,MD5 不足以或不足以进行重复数据删除。 MD5 现在在大多数情况下都被认为是损坏的,因为可以设计碰撞。 MD5 仅对剩下的一个目的才真正有效:验证该 blob 的先前已知 MD5 哈希值是否意外损坏了该 blob 数据。它对于确定数据块是否故意损坏几乎没有价值。导致相同 MD5 哈希的意外损坏的几率非常低,但可以设计故意的冲突。 SHA-1 在实践中也很容易受到proven 的攻击。

由于您将对象位置存储在数据库中,因此您可以灵活地无需立即解决此问题。 S3 存储的低成本(约 23 美元/TB/月)使您不太可能发现这是一个值得追求的目标,至少在一段时间内,如果您这样做了,那么您可以使用任何有意义的算法决定你需要它 - 扫描对象以寻找相同大小的对象,然后比较这些对象以查看它们是否确实相同,并相应地更新数据库,清除欺骗。

另一个选项(我已经成功使用的选项)是使用存储桶版本控制,并使用基于其内容的 SHA-256 的密钥实际存储对象。如果您覆盖一个对象并启用版本控制,您仍然可以访问该对象的所有不同版本,但任何下载该对象但未指定版本 ID 的人都将收到最新的上传。如果需要,您可以在采取措施(使用不同的算法)后定期清除这些旧对象,以确保您没有找到具有 SHA-256 冲突的两个不同对象。 (如果您确实发现了具有 SHA-256 冲突的不同对象,那么您就会出名。)

【讨论】:

  • 也许 perkeep.org 带有 S3 后端是您想要的?将是 SHA224 并且有一些其他的好东西。
  • 是的,这是很久以前的事了。从那时起,现在存在许多具有 S3 兼容性的出色解决方案来解决这个问题,这对我来说不是问题。至于散列,如果有人对我认为滚动/编码的最佳解决方案感兴趣,那将是块的 blake2 散列(而不是完整文件)。
猜你喜欢
  • 2018-01-21
  • 2015-01-16
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 2022-11-05
  • 2010-09-06
  • 2012-09-10
  • 1970-01-01
相关资源
最近更新 更多