Kesalahan dapat terjadi selama transfer data antara klien dan server. Object Storage Service (OSS) mengembalikan nilai pemeriksaan redundansi siklik 64-bit (CRC-64) untuk objek yang diunggah. Anda dapat membandingkan nilai yang dikembalikan dengan nilai CRC-64 yang dihitung secara lokal untuk memverifikasi integritas data.
Informasi latar belakang
OSS menghitung nilai CRC-64 untuk objek yang baru diunggah dan menyimpan hasilnya sebagai metadata objek. Header respons mencakup x-oss-hash-crc64ecma, yang menentukan nilai CRC-64. CRC 64-bit ini dihitung berdasarkan algoritma CRC-64/XZ.
OSS tidak menghitung nilai CRC-64 untuk objek yang diunggah sebelum fitur ini tersedia. Akibatnya, tidak ada nilai CRC-64 yang dikembalikan saat Anda mengambil objek tersebut.
Catatan penggunaan
Operasi PutObject, AppendObject, PostObject, dan MultipartUploadPart mengembalikan nilai CRC-64. Setelah pengunggahan selesai, Anda dapat mengambil nilai CRC-64 dari server dan membandingkannya dengan nilai yang dihitung secara lokal.
Saat memanggil operasi CompleteMultipartUpload, nilai CRC-64 untuk objek lengkap hanya dikembalikan jika semua bagiannya memiliki nilai CRC-64. Jika ada bagian yang tidak memiliki nilai CRC-64, nilai CRC-64 untuk objek lengkap tidak dikembalikan. Sebagai contoh, jika suatu bagian diunggah sebelum fitur ini tersedia, maka bagian tersebut tidak akan memiliki nilai CRC-64.
Operasi GetObject, HeadObject, dan GetObjectMeta mengembalikan nilai CRC-64 objek, jika tersedia. Setelah operasi GetObject selesai, Anda dapat mengambil nilai CRC-64 dari server dan membandingkannya dengan nilai yang dihitung secara lokal.
CatatanPermintaan GET dengan header Range mengembalikan nilai CRC-64 dari seluruh objek.
Untuk operasi salin, seperti CopyObject dan UploadPartCopy, objek atau bagian baru tidak dijamin memiliki nilai CRC-64.
Contoh
Berikut adalah kode Python yang memberikan contoh cara memverifikasi integritas data menggunakan nilai CRC-64.
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
import crcmod
import random
import string
from oss2.models import PartInfo
# Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode sampel ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# Tentukan titik akhir untuk wilayah tempat bucket berada. Sebagai contoh, jika bucket berada di wilayah China (Hangzhou), atur titik akhir ke https://oss-cn-hangzhou.aliyuncs.com.
# Tentukan nama bucket di yourBucketName.
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName')
# Buat fungsi pemeriksaan CRC-64.
do_crc64 = crcmod.mkCrcFun(0x142F0E1EBA9EA3693, initCrc=0, xorOut=0xffffffffffffffff, rev=True)
# Periksa CRC-64 dan cetak hasilnya.
def check_crc64(local_crc64, oss_crc64, msg="periksa crc64"):
if local_crc64 != oss_crc64:
print("{0} periksa crc64 gagal. lokal:{1}, oss:{2}.".format(msg, local_crc64, oss_crc64))
return False
else:
print("{0} periksa crc64 berhasil.".format(msg))
return True
# Hasilkan string acak dengan panjang tertentu.
def random_string(length):
return ''.join(random.choice(string.ascii_lowercase) for i in range(length))
# Hasilkan string acak bernama konten dengan panjang 1024.
content = random_string(1024)
# Atur jalur objek.
key = 'normal-key'
# Verifikasi PutObject.
result = bucket.put_object(key, content)
oss_crc64 = result.headers.get('x-oss-hash-crc64ecma', '')
local_crc64 = str(do_crc64(oss2.to_bytes(content)))
check_crc64(local_crc64, oss_crc64, "unggah objek")
# Verifikasi GetObject.
result = bucket.get_object(key)
oss_crc64 = result.headers.get('x-oss-hash-crc64ecma', '')
local_crc64 = str(do_crc64(result.resp.read()))
check_crc64(local_crc64, oss_crc64, "dapatkan objek")
# Verifikasi UploadPart dan Lengkapi.
part_info_list = []
key = "multipart-key"
result = bucket.init_multipart_upload(key)
upload_id = result.upload_id
part_1 = random_string(1024 * 1024)
result = bucket.upload_part(key, upload_id, 1, part_1)
oss_crc64 = result.headers.get('x-oss-hash-crc64ecma', '')
local_crc64 = str(do_crc64(oss2.to_bytes(part_1)))
# Periksa integritas data bagian 1 yang diunggah.
check_crc64(local_crc64, oss_crc64, "unggah bagian objek 1")
part_info_list.append(PartInfo(1, result.etag, len(part_1)))
part_2 = random_string(1024 * 1024)
result = bucket.upload_part(key, upload_id, 2, part_2)
oss_crc64 = result.headers.get('x-oss-hash-crc64ecma', '')
local_crc64 = str(do_crc64(oss2.to_bytes(part_2)))
# Periksa integritas data bagian 2 yang diunggah.
check_crc64(local_crc64, oss_crc64, "unggah bagian objek 2")
part_info_list.append(PartInfo(2, result.etag, len(part_2)))
result = bucket.complete_multipart_upload(key, upload_id, part_info_list)
oss_crc64 = result.headers.get('x-oss-hash-crc64ecma', '')
local_crc64 = str(do_crc64(oss2.to_bytes(part_2), do_crc64(oss2.to_bytes(part_1))))
# Periksa apakah objek akhir di OSS konsisten dengan file lokal.
check_crc64(local_crc64, oss_crc64, "lengkapi objek")Dukungan SDK OSS
Beberapa SDK OSS mendukung pemeriksaan integritas data CRC-64 untuk unggah dan unduhan. Lihat tabel berikut untuk contohnya.
SDK | Dukungan CRC | Contoh |
Java SDK | Ya | |
Python SDK | Ya | |
PHP SDK | Tidak | Tidak ada |
C# SDK | Tidak | Tidak ada |
C SDK | Ya | |
JavaScript SDK | Tidak | Tidak ada |
Go SDK | Ya | |
Ruby SDK | Tidak | Tidak ada |
iOS SDK | Ya | |
Android SDK | Ya |