Amazon web services AWS S3-Etag Sha256代替Md5

Amazon web services AWS S3-Etag Sha256代替Md5,amazon-web-services,amazon-s3,Amazon Web Services,Amazon S3,我想将Sha256用于对象的校验和。 但看起来,亚马逊在ETag中使用了md5 有什么解决方法吗?不幸的是,没有直接的方法让S3将SHA256用于ETag。您可以使用S3元数据作为解决方法。为此,您可以自己计算SHA256校验和,并使用用户定义的S3对象元数据为每次上载设置它。用户定义的元数据只是可以分配给对象的一组键值对。当放入对象并在获取对象上比较时,必须设置校验和 S3文档中提供了更多信息: 请参阅: 可以通过以下步骤在Java中实现: 获取S3对象的InputStream InputSt

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


有什么解决方法吗?

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

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

请参阅:

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

  • 获取S3对象的InputStream
  • InputStream InputStream=amazonS3.getObject(bucket, getObjectContent()

  • 对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;
    }
    

  • 谢谢你的回复。我希望有另一个解决办法。使用此解决方案,sha256哈希不会由S3本身计算。因此,上传后的文件验证过程并不可靠;)也许我找到了另一个解决办法。您认为可以通过AWS Lambda函数计算哈希并将其保存为用户定义的s3对象元数据吗?这个解决方案是可信的,因为散列是在服务器端计算的。@MarcJohnson您是否设法通过aws lambda使上述解决方案能够运行:用户定义的sha256元数据?我很想知道你的解决方案,如果是的话,请分享?注意,etag甚至不总是md5,而是由原始原始数据块组成的特定于aws的散列(即,用于多部分上传)。您可以在本地生成该文件,但该格式没有真正的文档记录,也不稳定,无法供客户使用;最好使用您自己的哈希作为元数据。假设API正确上传了它,并使用sha256验证下载。另请参见,但这需要下载文件。