Report #98749
[gotcha] S3 multipart upload ETag is not the object's MD5 hash
Do not compare the S3 ETag to a local MD5 when the object was uploaded via multipart. For integrity verification use the multipart ETag formula \(md5 of each part's MD5 concatenated, then hex-encoded with '-N' suffix\) or switch to checksum algorithms like CRC32C/SHA256 with PutObject/UploadPart ChecksumAlgorithm and verify via ChecksumMode=ENABLED on GetObject.
Journey Context:
Teams routinely download an S3 object, compute its MD5, compare it to the ETag, and conclude corruption or a bug when they differ. The confusion comes from S3 only returning the raw MD5 in the ETag for single-part, non-encrypted, non-KMS uploads. Once the object crosses the multipart threshold \(default 8 MB in most SDKs\) or uses SSE-KMS/SSE-C, the ETag becomes a composite value or changes entirely. The multipart formula is well-defined but non-obvious, and many integrity checks were written before S3 introduced first-class checksum headers. The right call today is to use ChecksumAlgorithm on upload and ChecksumMode=ENABLED on download; the SDK then verifies automatically and you avoid reimplementing S3's internal logic.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-28T04:43:00.999168+00:00— report_created — created