AWS S3 - Etag Sha256 替代 Md5

8
我希望在我的对象的校验和中使用Sha256。但是看起来,亚马逊在ETag中使用md5。有什么解决办法吗?

2
请注意,etag并不总是md5,而是由原始原始数据的块组成的一些aws特定哈希(例如,对于多部分上传)。您可以在本地生成此哈希,但格式并没有真正记录或稳定用于客户端使用;最好使用自己的哈希作为元数据。假设API正确上传它,并使用您的sha256验证下载。http://docs.aws.amazon.com/AmazonS3/latest/API/RESTCommonResponseHeaders.html 另请参见https://dev59.com/Cmct5IYBdhLWcg3wULzo#19896823 - michael
3个回答

12
截至2022-02-25, S3现在有了一个Checksum检索功能GetObjectAttributes

新功能——Amazon S3的额外Checksum算法 | AWS News Blog

Checksum检索 - 新的GetObjectAttributes函数返回对象的Checksum和(如果适用)每个部分的Checksum。

此功能支持 SHA-1,SHA-256,CRC-32 和 CRC-32C 以检查传输的完整性。

我很高兴他们现在提供了替代MD5的选择,因为MD5不适合特定用途,而且早在其他用途上就已经被破解了。请参阅相关讨论,了解他们的MD5方法的一些特殊情况:如何在Amazon's S3上获取文件的md5sum

[当谈到各种目的的哈希时,请注意,对于哈希表查找和其他具有基本随机性和安全属性的情况,推荐使用HighwayHash:快速强大的哈希函数:SipHash/HighwayHash]


6
很遗憾,目前没有直接的方法可以让S3使用SHA256作为ETag。您可以使用S3元数据作为解决方法。为此,您可以自己计算SHA256校验和,并使用用户定义的S3对象元数据将其设置为每个上传的对象。用户定义的元数据只是一组键值对,您可以分配给您的对象。当您PUT对象时,必须设置校验和,并在获取/头部对象时进行比较。
有关更多信息,请参阅S3文档: AWS - 对象键和元数据

谢谢您的回复。我希望有另一种解决方案。使用此解决方案,S3本身不会计算sha256哈希值。因此,在上传后的文件验证过程中,结果并不是真正可信的;) - MarcJohnson
1
也许我找到了另一个解决方案。您认为通过AWS Lambda函数计算哈希并将其保存为用户定义的s3对象元数据是可能的吗?由于哈希是在服务器端计算的,因此这个解决方案是可靠的。 - MarcJohnson
@MarcJohnson,你成功让你上面提到的关于通过AWS Lambda实现用户定义的sha256元数据的解决方案工作了吗?如果是的话,我很想知道你的解决方案,如果可以,请分享一下? - BenKoshy

-2
请参考:如何计算S3文件内容的SHA-256校验和 在Java中,可以通过以下步骤实现:
  1. 获取S3对象的InputStream

InputStream inputStream = amazonS3.getObject(bucket, file).getObjectContent();

使用MessageDigest和DigestInputStream类进行SHA-256哈希。 public static String getHash(InputStream inputStream, String algorithm) { try { MessageDigest messageDigest = MessageDigest.getInstance(algorithm); DigestInputStream digestInputStream = new DigestInputStream(inputStream, messageDigest); byte[] buffer = new byte[4096]; int count = 0; while (digestInputStream.read(buffer) > -1) { count++; } log.info("总共读取: " + count); MessageDigest digest = digestInputStream.getMessageDigest(); digestInputStream.close(); byte[] md5 = digest.digest(); StringBuilder sb = new StringBuilder(); for (byte b: md5) { sb.append(String.format("%02X", b)); } return sb.toString().toLowerCase(); } catch (Exception e) { log.error(e); } return null; }

5
但这需要下载文件。 - Balazs Gunics

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接