我目前正在编写视频共享网站。对于上传,我使用的是PHP。我注意到,当我上传视频时,S3会获取该文件的MD5哈希值。我想知道S3是否进行了重复数据删除。我上传了几个相同的文件,并没有看到任何内容,表明S3知道它们是相同的,或至少它正在做任何事情。
我应该自己实现吗?我有一个MySQL数据库,我存储所有的视频信息。如果它们是相同的话,我可以对所有视频进行哈希并提供以前上传的文件。我可以做md5(tmp-file-here)
。这似乎是合适的,因为S3已经在使用md5。但是,与针对诸如BLAKE2之类的东西进行优化的东西相比,md5很慢。我应该这样做,最好的方法是什么?
答案 0 :(得分:2)
S3不会暴露任何内部重复数据删除的证据。如果您要上传500个相同的文件,每个文件1 GB,则需要支付500 GB的费用。
因此,如果您想考虑对已上传的内容进行重复数据删除,则需要推出自己的解决方案,但请考虑以下几点:
标准的md5哈希算法并不是S3在ETag上使用的唯一算法。它还使用嵌套的md5算法进行分段上传,这对于上传而言是必需的。对于较小的文件,5 GB和可选项,以及作为不同数量的部件上载的两个相同文件将不具有相同的ETag。 (在HTTP中,ETag的范围是单个资源,它只有一个单向约束:如果资源发生变化,其ETag必须更改,但不同的ETag不会必然进行任何通信信息.S3比这更严格,但ETag不是一个完美的重复数据删除密钥。)
但重要的是,MD5不足以用于重复数据删除。 MD5现在被认为在大多数情况下被破坏,因为可以设计碰撞。 MD5仅对剩下的一个目的非常有效:验证blob数据未被意外从blob的先前已知MD5哈希中损坏。确定数据blob是否故意损坏没什么价值。导致相同MD5哈希的意外损坏的几率是天文数字低,但可以设计故意的冲突。 SHA-1在实践中也是proven易受攻击的。
由于您将对象位置存储在数据库中,因此您可以灵活地立即解决此问题。 S3存储的低成本(约23美元/ TB /月)是这样的,你不太可能发现这是一个值得追求,至少在一段时间内,如果你这样做,那么你可以使用任何有意义的算法决定你需要它 - 扫描寻找相同大小的对象的对象,然后比较这些对象以确定它们是否确实相同,并相应地更新数据库,清理欺骗。
另一个选项 - 我成功使用的一个选项 - 是使用存储桶版本控制,并使用基于其内容的SHA-256的键实际存储对象。如果您覆盖了一个对象并且启用了版本控制,您仍然可以访问该对象的所有不同版本,但是如果没有指定版本ID的任何人下载该对象将收到最新的上载。在采取步骤(使用不同的算法)后,您可以根据需要定期清除这些旧对象,以确保您没有找到两个具有SHA-256冲突的不同对象。 (如果做发现有SHA-256碰撞的不同对象,你就会出名。)