我希望在我的对象的校验和中使用Sha256。但是看起来,亚马逊在ETag中使用md5。有什么解决办法吗?
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]
PUT
对象时,必须设置校验和,并在获取/头部对象时进行比较。使用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; }InputStream inputStream = amazonS3.getObject(bucket, file).getObjectContent();