すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:データ検証

最終更新日:Oct 29, 2024

Object Storage Service (OSS) SDK for Javaは、MD5の検証とCRC-64を使用して、オブジェクトのアップロード、ダウンロード、コピー時にデータの整合性を確保します。

使用上の注意

  • このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba CloudサービスからOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSリージョンとエンドポイントの詳細については、「リージョン、エンドポイント、オープンポート」をご参照ください。

  • このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。

  • このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSTS (Security Token Service) を使用してOSSClientインスタンスを作成する場合は、「初期化」をご参照ください。

MD5検証

オブジェクトのアップロード要求でContent-MD5を設定すると、アップロードされたオブジェクトのMD5ハッシュが計算されます。 計算されたMD5ハッシュがアップロード要求で設定されたMD5ハッシュと異なる場合、InvalidDigestが返されます。 これにより、OSSはオブジェクトのアップロードのデータ整合性を確保できます。 InvalidDigestが返された場合は、オブジェクトを再度アップロードする必要があります。

次のサンプルコードは、PutObject操作でMD5検証を設定する方法の例を示しています。

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 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.ProviderAuthV4(EnvironmentVariableCredentialsProvider())

# Specify the endpoint of the region in which the bucket is located. In this example, the endpoint of the China (Hangzhou) region is used. Specify your actual endpoint.
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# Specify the ID of the region that maps to the endpoint. Example: cn-hangzhou. This parameter is required if you use the signature algorithm V4.
region = "cn-hangzhou"

# Specify the name of your bucket.
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)

# Specify the full path of the object. Do not include the bucket name in the full path. Example: exampledir/exampleobject.txt. 
object_name = 'exampledir/exampleobject.txt'
# Specify the full path of the local file that you want to upload. During upload, the value of this variable is uploaded to OSS. This value can be in any format, such as text, image, video, and audio. 
with open('/Users/test/Desktop/demo.txt', 'rb') as file:
    content = file.read()

# Calculate the MD5 hash of the value based on the actual content. 
content_md5 = oss2.utils.content_md5(content);
print('content_md5', content_md5)

# Include the Content-MD5 header in the upload request. The server verifies the MD5 hash of the uploaded content to ensure the integrity and validity of the uploaded content. 
headers = dict()
headers['Content-MD5'] = content_md5
bucket.put_object(object_name, content, headers=headers)
説明

MD5検証は、put_object、append_object、post_object、およびupload_part操作に使用できます。

CRC-64

データの検証CRC-64を実行するときは、次の項目に注意してください。

説明
  • CRC-64は、put_object、get_object、append_object、およびupload_part操作に使用できます。 デフォルトでは、オブジェクトをアップロードするとCRC-64が有効になります。 クライアントで計算されたCRC-64値がOSSサーバーから返されたCRC-64値と異なる場合、InconsistentErrorが返されます。

  • CRC-64は範囲ダウンロードではサポートされていません。

  • CRC-64はCPUリソースを消費し、アップロードとダウンロードを遅くします。

  • オブジェクトのダウンロードのCRC-64

    次のコードは、オブジェクトをダウンロードするときにCRC-64を実行する方法の例を示しています。

    # -*- coding: utf-8 -*-
    import oss2
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    # 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.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
    
    # Specify the endpoint of the region in which the bucket is located. In this example, the endpoint of the China (Hangzhou) region is used. Specify your actual endpoint.
    endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
    # Specify the ID of the region that maps to the endpoint. Example: cn-hangzhou. This parameter is required if you use the signature algorithm V4.
    region = "cn-hangzhou"
    
    # Specify the name of your bucket.
    bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
    
    # Specify the full path of the object. Do not include the bucket name in the full path. 
    object_name = 'yourObjectName'
    
    # Check whether CRC-64 is enabled by default. 
    print('bucket.enable-crc:',  bucket.enable_crc)
    
    # The value returned by bucket.get_object is a file-like object that can be iterated. 
    object_stream = bucket.get_object(object_name)
    print(object_stream.read())
    
    # You must call read() to read the object from the stream that is returned by get_object before you can calculate the CRC-64 checksum of the object. 
    if object_stream.client_crc != object_stream.server_crc:
      print("The CRC checksum between client and server is inconsistent!")
  • 追加アップロードのCRC-64

    追加アップロードでinit_crcを指定すると、CRC-64はデフォルトで有効になります。

    # -*- coding: utf-8 -*-
    import oss2
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    # 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.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
    
    # Specify the endpoint of the region in which the bucket is located. In this example, the endpoint of the China (Hangzhou) region is used. Specify your actual endpoint.
    endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
    # Specify the ID of the region that maps to the endpoint. Example: cn-hangzhou. This parameter is required if you use the signature algorithm V4.
    region = "cn-hangzhou"
    
    # Specify the name of your bucket.
    bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
    
    object_name = "yourAppendObjectName"
    first_content = "yourFirstContent"
    second_content = "yourSecondContent"
    
    # Specify init_crc in the first append upload. 
    # If init_crc is specified, OSS SDKs perform CRC-64 for the returned results. 
    result = bucket.append_object(object_name, 0, first_content, init_crc=0)
    
    # Specify init_crc in the second append upload. 
    # Set init_crc to the CRC-64 value of the uploaded object. 
    result = bucket.append_object(object_name, result.next_position, second_content, init_crc=result.crc)

関連ドキュメント

MD5の検証とCRC-64に使用される完全なサンプルコードについては、GitHubをご覧ください。