O Object Storage Service (OSS) retorna um valor CRC-64 para cada objeto enviado. Compare esse valor com um valor CRC-64 calculado localmente para verificar a integridade da transmissão de dados.
Como funciona
O OSS calcula um valor CRC-64 para cada objeto enviado com base no padrão ECMA-182, armazena o valor como metadados do objeto e o retorna no cabeçalho de resposta x-oss-hash-crc64ecma.
Objetos enviados antes da disponibilidade do suporte a CRC-64 não possuem um valor CRC-64. As solicitações para esses objetos não retornam um valor CRC-64.
Notas de uso
-
PutObject, AppendObject, PostObject e MultipartUploadPart retornam um valor CRC-64. Após a conclusão do envio, compare o valor CRC-64 retornado pelo servidor com o valor calculado localmente.
-
MultipartComplete retorna o valor CRC-64 do objeto inteiro apenas se todas as partes tiverem um valor CRC-64. Por exemplo, se uma parte foi enviada antes da disponibilidade do suporte a CRC-64, nenhum valor CRC-64 será retornado para essa parte ou para o objeto completo.
-
GetObject, HeadObject e GetObjectMeta retornam o valor CRC-64 do objeto, caso exista. Após uma chamada GetObject, compare o valor CRC-64 retornado pelo servidor com o valor calculado localmente.
NotaUma solicitação GET com um cabeçalho Range ainda retorna o valor CRC-64 do objeto inteiro.
-
Objetos criados por operações de cópia, como CopyObject e UploadPartCopy, podem não ter um valor CRC-64.
Exemplos
O exemplo a seguir em Python mostra como verificar a integridade dos dados com CRC-64.
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
import crcmod
import random
import string
from oss2.models import PartInfo
# Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com.
# Specify the name of the bucket.
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'yourBucketName')
# Create a CRC-64 verification function.
do_crc64 = crcmod.mkCrcFun(0x142F0E1EBA9EA3693, initCrc=0, xorOut=0xffffffffffffffff, rev=True)
# Verify the CRC-64 values and display the result.
def check_crc64(local_crc64, oss_crc64, msg="check crc64"):
if local_crc64 != oss_crc64:
print("{0} check crc64 failed. local:{1}, oss:{2}.".format(msg, local_crc64, oss_crc64))
return False
else:
print("{0} check crc64 ok.".format(msg))
return True
# Generate a random string of the specified length.
def random_string(length):
return ''.join(random.choice(string.ascii_lowercase) for i in range(length))
# Generate a random string with a length of 1024.
content = random_string(1024)
# Specify the path of the object.
key = 'normal-key'
# Verify data integrity for a PutObject operation.
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, "put object")
# Verify data integrity for a GetObject operation.
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, "get object")
# Verify data integrity for parts and the final object.
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)))
# Check the integrity of part 1.
check_crc64(local_crc64, oss_crc64, "upload_part object 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)))
# Check the integrity of part 2.
check_crc64(local_crc64, oss_crc64, "upload_part object 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))))
# Check whether the final object uploaded to OSS is identical to the local file.
check_crc64(local_crc64, oss_crc64, "complete object")
SDKs do OSS compatíveis
A tabela a seguir lista o suporte dos SDKs do OSS ao CRC-64.
|
SDK |
Suporte a CRC |
Exemplo |
|
OSS SDK for Java |
Sim |
|
|
OSS SDK for Python |
Sim |
|
|
OSS SDK for PHP |
Não |
Nenhum |
|
OSS SDK for C# |
Não |
Nenhum |
|
OSS SDK for C |
Sim |
|
|
OSS SDK for JavaScript |
Não |
Nenhum |
|
OSS SDK for Go |
Sim |
|
|
OSS SDK for Ruby |
Não |
Nenhum |
|
OSS SDK for iOS |
Sim |
|
|
OSS SDK for Android |
Sim |