Nilai ETag dalam Object Storage Service (OSS) mengidentifikasi apakah konten suatu objek telah berubah — nilai tersebut tidak selalu sama dengan Hash MD5 objek tersebut. Jangan gunakan nilai ETag untuk memverifikasi integritas data.
Verifikasi integritas unggahan dengan Content-MD5
Untuk memastikan bahwa objek yang diunggah sesuai dengan file lokal Anda, sertakan header Content-MD5 dalam permintaan unggah. OSS menghitung Hash MD5 dari objek yang diterima dan membandingkannya dengan nilai Content-MD5 yang Anda berikan. Unggahan hanya berhasil jika kedua nilai tersebut cocok. Meskipun penyertaan header ini bersifat opsional, hal ini memungkinkan Anda memverifikasi integritas data sebagai bagian dari proses unggah.
Header Content-MD5 harus disertakan dalam perhitungan signature. Jika nilai header tidak sesuai dengan signature, OSS akan mengembalikan error SignatureDoesNotMatch. Untuk detailnya, lihat Sertakan signature dalam header Authorization.
Hitung nilai Content-MD5
Nilai Content-MD5 adalah digest MD5 biner dari badan permintaan yang telah di-encode Base64 — bukan encoding Base64 dari string heksadesimal.
Contoh berikut menggunakan string 0123456789 untuk mengilustrasikan pendekatan yang benar dan salah.
Perhitungan yang benar
Hitung Hash MD5 dari data untuk mendapatkan digest biner 128-bit.
Lakukan encode Base64 terhadap digest biner tersebut.
>>> import base64, hashlib
>>> hash = hashlib.md5()
>>> hash.update("0123456789") # Python 3: hash.update(b"0123456789")
>>> base64.b64encode(hash.digest())
'eB5eJF1ptWaXm4bijSPyxw=='hash.digest() mengembalikan digest biner 128-bit:
>>> hash.digest()
'x\x1e^$]i\xb5f\x97\x9b\x86\xe2\x8d#\xf2\xc7'Perhitungan yang salah
Kesalahan umum adalah melakukan encode Base64 terhadap string heksadesimal 32 karakter, bukan terhadap digest biner. Hal ini menghasilkan nilai Content-MD5 yang salah.
# hash.hexdigest() mengembalikan string heksadesimal 32 karakter — jangan gunakan ini untuk Content-MD5.
>>> hash.hexdigest()
'781e5e245d69b566979b86e28d23f2c7'
# Melakukan encode Base64 terhadap string heksa menghasilkan nilai yang salah:
>>> base64.b64encode(hash.hexdigest())
'NzgxZTVlMjQ1ZDY5YjU2Njk3OWI4NmUyOGQyM2YyYzc='