【问题标题】:AWS S3 - Etag Sha256 instead of Md5AWS S3 - Etag Sha256 而不是 Md5
【发布时间】:2017-10-21 19:04:38
【问题描述】:

我想使用 Sha256 作为对象的校验和。 但看起来,亚马逊在 ETag 中使用了 md5。

有什么解决办法吗?

【问题讨论】:

  • 请注意,etag 甚至不总是 md5,而是一些由原始原始数据块组成的特定于 aws 的哈希(即,用于多部分上传)。您可以在本地生成它,但格式没有真正记录或稳定供客户使用;最好使用您自己的哈希作为元数据。假设 API 正确上传,并使用您的 sha256 验证下载。 docs.aws.amazon.com/AmazonS3/latest/API/… 另见stackoverflow.com/questions/12186993/…

标签: amazon-web-services amazon-s3


【解决方案1】:

不幸的是,没有直接的方法可以让 S3 对 ETag 使用 SHA256。您可以使用 S3 元数据作为解决方法。为此,您可以自己计算 SHA256 校验和,并使用用户定义的 S3 对象元数据为每次上传设置它。用户定义的元数据只是一组可以分配给对象的键值对。当您 PUT 您的对象并在 GET/HEAD 对象上进行比较时,您必须设置校验和。

S3 文档中提供了更多信息:

AWS - Object Key and Metadata

【讨论】:

  • 感谢您的回复。我希望,还有另一个解决方案。使用此解决方案,S3 本身不会计算 sha256 哈希。结果,上传后的文件验证过程并不是真正可信的;)
  • 也许我找到了另一个解决方案。您认为可以通过 AWS Lambda 函数计算哈希并将其保存为用户定义的 s3 对象元数据吗?这个解决方案是可信的,因为哈希是在服务器端计算的。
  • @MarcJohnson 您是否设法使上述解决方案正常工作:用户通过 aws lambda 定义的 sha256 元数据?我很想知道您的解决方案,如果可以,请分享?
【解决方案2】:

请参考:How to calculate SHA-256 checksum of S3 file content

在Java中可以通过以下步骤来实现:

  1. 获取 S3 对象的 InputStream

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

  1. 对 SHA-256 哈希使用 MessageDigest 和 DigestInputStream 类

    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("total read: " + 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;
    }
    

【讨论】:

  • 但这需要下载文件。
猜你喜欢
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
相关资源
最近更新 更多