簡體   English   中英

AWS S3 - Etag Sha256 而不是 Md5

[英]AWS S3 - Etag Sha256 instead of Md5

我想使用 Sha256 作為我的對象的校驗和。 但看起來,亞馬遜在 ETag 中使用了 md5。

有什么解決方法嗎?

從 2022-02-25 開始,這是可能的。 S3 現在具有校驗和檢索 function GetObjectAttributes功能:

新 – 用於 Amazon S3 的附加校驗和算法 | AWS 新聞博客

校驗和檢索——新的GetObjectAttributes function 返回 object 和(如果適用)每個部分的校驗和。

此 function 支持 SHA-1、SHA-256、CRC-32 和 CRC-32C,用於檢查傳輸的完整性。

我很高興他們現在有了 MD5 的可悲選擇的替代方案,MD5 對於任何特定的東西都不是最佳選擇,並且很久以前就因為其他目的而被破壞了。 另請參閱How to get the md5sum of a file on Amazon's S3 中關於MD5 方法的怪癖的相關討論。

[雖然我正在討論用於各種目的的哈希,但請注意,對於哈希表查找和其他具有一些基本隨機性和安全屬性的情況,一個很好的哈希是HighwayHash: Fast strong hash functions: SipHash/HighwayHash ]

不幸的是,沒有直接的方法可以讓 S3 將 SHA256 用於 ETag。 您可以使用 S3 元數據作為解決方法。 為此,您可以自己計算 SHA256 校驗和,並使用用戶定義的 S3 對象元數據為每次上傳設置它。 用戶定義的元數據只是一組可以分配給對象的鍵值對。 你必須在你設置校驗和PUT你的對象,並比較在GET / HEAD對象。

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

AWS - 對象鍵和元數據

請參考: 如何計算 S3 文件內容的 SHA-256 校驗和

可以通過Java中的以下步驟來實現:

  1. 獲取 S3 對象的 InputStream

InputStream inputStream = amazonS3.getObject(bucket, file).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; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM