Amazon web services AWS S3-Etag Sha256代替Md5
我想将Sha256用于对象的校验和。 但看起来,亚马逊在ETag中使用了md5Amazon 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
有什么解决方法吗?不幸的是,没有直接的方法让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验证下载。另请参见,但这需要下载文件。