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

Object Storage Service:OSS SDK for Pythonを使用してクライアント側の暗号化を設定する

最終更新日:Dec 09, 2024

クライアント側の暗号化が有効になっている場合、オブジェクトはOSS (Object Storage Service) にアップロードされる前にローカルで暗号化されます。 オブジェクトを復号化できるのは、顧客マスターキー (CMK) の所有者だけです。 クライアント側の暗号化は、データ送信および保存中のデータセキュリティを強化します。

免責事項

  • クライアント側の暗号化を使用する場合は、CMKの整合性と有効性を確保する必要があります。 不適切なメンテナンスのためにCMKが誤って使用されたり失われたりした場合、復号化の失敗によって引き起こされるすべての損失と結果に対して責任があります。

  • 暗号化されたデータをコピーまたは移行する場合、オブジェクトメタデータの整合性と有効性に責任があります。 暗号化されたメタデータが正しくないか、不適切なメンテナンスのために失われた場合、データの復号化の失敗によって引き起こされるすべての損失と結果に対して責任があります。

シナリオ

  • 機密性の高いデータ: 個人を特定できる情報 (PII) 、金融取引記録、健康データ、およびその他の機密性の高いデータについては、データがローカル環境を離れる前にデータを暗号化して、送信中に傍受されても元のデータが効果的に保護されるようにすることができます。

  • コンプライアンス要件: 医療保険の相互運用性および説明責任法 (HIPAA) や一般データ保護規則 (GDPR) などの特定の業界および規制では、サードパーティのプラットフォームに保存されているデータの厳密な暗号化管理が必要です。 CMKはユーザーによって管理され、ネットワーク経由で送信されたり、クラウドサービスプロバイダーに公開されたりしないため、クライアント側の暗号化はこれらのコンプライアンス要件を満たすのに役立ちます。

  • 完全な暗号化制御: 企業または開発者は、暗号化アルゴリズムの選択、CMKの管理およびローテーションなど、暗号化プロセスを完全に制御したい場合があります。 この場合、クライアント側の暗号化を使用して、許可されたユーザーのみがデータを復号化およびアクセスできるようにすることができます。

  • クロスリージョンデータ移行のセキュリティ: クライアント側の暗号化は、クロスリージョンデータ移行の前後でデータを暗号化された状態に維持するのに役立ちます。 これは、インターネット上のデータ伝送のセキュリティを増幅する。

使用上の注意

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

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

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

背景情報

クライアント側の暗号化では、オブジェクトに対して対称暗号化を実行するために、オブジェクトごとにランダムなデータキーが生成されます。 クライアントはCMKを使用してランダムデータキーを暗号化します。 暗号化されたデータキーは、オブジェクトメタデータの一部としてアップロードされ、OSSサーバーに保存されます。 暗号化されたオブジェクトがダウンロードされると、クライアントはCMKを使用してランダムデータキーを復号し、復号されたデータキーを使用してオブジェクトを復号します。 データのセキュリティを確保するために、CMKはクライアントでのみ使用され、ネットワーク経由で送信されたり、サーバーに保存されたりすることはありません。

暗号化方法

クライアント側の暗号化には、次の2種類のCMKを使用できます。

  • KMSマネージドCMK

    Key Management Service (KMS) で管理されているCMKをクライアント側の暗号化に使用する場合、OSS SDK for PythonにCMK IDを指定する必要があります。

  • 自分で管理するRSAベースのCMK

    自分で管理するCMKをクライアント側の暗号化に使用する場合は、CMKの公開鍵と秘密鍵をOSS SDK for Pythonにパラメーターとして送信する必要があります。

上記の暗号化方法を使用して、データ漏洩を防ぎ、クライアント上のデータを保護できます。 データが漏洩しても、他の人がデータを復号することはできません。

詳細については、「OSS開発者ガイド」の「クライアント側暗号化」をご参照ください。

クライアント側暗号化V2 (推奨)

重要
  • クライアント側の暗号化は、サイズが5 GBを超えるオブジェクトのマルチパートアップロードをサポートします。 マルチパートアップロードを使用してオブジェクトをアップロードする場合、オブジェクトの合計サイズとパーツサイズを指定する必要があります。 最後の部分を除く各部分のサイズは同じで、16バイトの倍数でなければなりません。

  • ローカルクライアントで暗号化されたオブジェクトをアップロードすると、オブジェクトのメタデータは暗号化されて保護され、CopyObjectなどの操作を呼び出して変更することはできません。

  • クライアント側暗号化に関連するオブジェクトメタデータ

    パラメーター

    説明

    必須 / 任意

    x-oss-meta-client-side-encryption-key

    暗号化されたデータキー。 暗号化されたデータキーは、RSAベースのCMKまたはKMS管理CMKを使用して暗号化され、Base64でエンコードされた文字列です。

    x-oss-meta-client-side-encryption-start

    データ暗号化のためにランダムに生成された初期化ベクトル。 初期化ベクトルは、RSAベースのCMKまたはKMS管理CMKを使用して暗号化され、Base64でエンコードされた文字列です。

    x-oss-meta-client-side-encryption-cek-alg

    データの暗号化に使用されるアルゴリズム。

    x-oss-meta-client-side-encryption-wrap-alg

    データキーの暗号化に使用されるアルゴリズム。

    x-oss-meta-client-side-encryption-matdesc

    JSON形式のコンテンツ暗号化キー (CEK) の説明。

    不可

    x-oss-meta-client-side-encryption-unencrypted-content-length

    暗号化前のデータの長さ。 content-lengthを指定しない場合、このパラメーターは生成されません。

    不可

    x-oss-meta-client-side-encryption-unencrypted-content-md5

    暗号化前のデータのMD5ハッシュ。 content-md5を指定しない場合、このパラメーターは生成されません。

    不可

    x-oss-meta-client-side-encryption-data-size

    マルチパートアップロードを使用してアップロードするオブジェクトの合計サイズ。

    条件付き (マルチパートアップロードに必要)

    x-oss-meta-client-side-encryption-part-size

    マルチパートアップロードで指定されたパーツサイズ。

    条件付き (マルチパートアップロードに必要)

  • クライアント側暗号化用のバケットを作成する

    オブジェクトを暗号化してアップロードする前、またはクライアントでオブジェクトをダウンロードして復号する前に、バケットインスタンスを初期化する必要があります。 バケットの操作を呼び出して、オブジェクトをアップロードまたはダウンロードできます。 クライアント側の暗号化では、CryptoBucketクラスはBucketクラスから操作を継承します。 バケットインスタンスを初期化するのと同じ方法で、パラメータを設定してCryptoBucketインスタンスを初期化できます。

    • 自分で管理するRSAベースのCMKを使用して、オブジェクト暗号化用のCryptoBucketインスタンスを初期化する

      重要

      RSAベースのCMKを使用する場合は、CMKを自分で管理する必要があります。 CMKの損失またはCMKデータの損傷は、復号化の失敗を引き起こす可能性があります。 KMSによって管理されるCMKを使用することを推奨します。 RSAベースのCMKを使用して暗号化を実行する必要がある場合は、CMKデータをバックアップすることをお勧めします。

      次のサンプルコードは、自分が管理するRSAベースのCMKを使用してオブジェクト暗号化用にCryptoBucketインスタンスを初期化する方法の例を示しています。

      # -*- coding: utf-8 -*-
      import os
      import oss2
      from oss2.credentials import EnvironmentVariableCredentialsProvider
      from oss2.crypto import RsaProvider
      
      # 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())
      
      # If you want to only decrypt objects, specify only the private key. 
      # key_pair = {'private_key': 'yourPrivateKey'}
      # If you want to only encrypt objects, specify only the public key. 
      # key_pair = {'public_key': 'yourPublicKey'}
      # If you want to encrypt and decrypt objects, you must specify both the public key and the private key. 
      key_pair = {'private_key': 'yourPrivateKey', 'public_key': 'yourPublicKey'}
      
      # 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. 
      endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
      # Specify the region in which the bucket is located. Example: cn-hangzhou This parameter is required if you use the V4 signature algorithm.
      region = "cn-hangzhou"
      
      # Specify the name of the bucket. 
      bucket = oss2.CryptoBucket(auth, endpoint, 'yourBucketName',
                                 crypto_provider=RsaProvider(key_pair), region=region)
      
    • KMSが管理するCMKを使用してオブジェクト暗号化のためにCryptoBucketインスタンスを初期化する

      次のサンプルコードは、KMSが管理するCMKを使用してオブジェクト暗号化用にCryptoBucketインスタンスを初期化する方法の例を示しています。

      # -*- coding: utf-8 -*-
      import os
      import oss2
      from oss2.crypto import AliKMSProvider
      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())
      kms_provider = AliKMSProvider(auth, 'yourRegion', 'yourCMKID')
      
      # 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. 
      endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
      # Specify the region in which the bucket is located. Example: cn-hangzhou This parameter is required if you use the V4 signature algorithm.
      region = "cn-hangzhou"
      
      # Specify the name of the bucket. 
      bucket = oss2.CryptoBucket(auth, endpoint, 'yourBucketName', crypto_provider=kms_provider, region=region)
      
    • 複数のCMKの使用と管理

      異なるCMKを使用して、バケットにアップロードされたオブジェクトを暗号化したり、同じバケットからダウンロードされたオブジェクトを復号したりできます。 CMKに異なる説明を指定し、CMKとその説明をバケットに関する暗号化関連情報に追加できます。 データが復号化されると、OSS SDK for Pythonは説明に基づいてCMKを自動的に照合します。 次のサンプルコードは、複数のCMKを提供する方法の例を示しています。

      # -*- coding: utf-8 -*-
      import os
      import oss2
      from oss2.crypto import RsaProvider
      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())
      
      # Create an RSA-based key pair. 
      key_pair_1 = {'private_key': 'yourPrivateKey_1', 'public_key': 'yourPublicKey_1'}
      mat_desc_1 = {'key1': 'value1'}
      
      # Create another RSA-based key pair. 
      key_pair_2 = {'private_key': 'yourPrivateKey_2', 'public_key': 'yourPublicKey_2'}
      mat_desc_2 = {'key2': 'value2'}
      
      provider = RsaProvider(key_pair=key_pair_2, mat_desc=mat_desc_2)
      # Add the description of key_pair_1 to the provider. 
      encryption_materials = oss2.EncryptionMaterials(mat_desc_1, key_pair=key_pair_1)
      provider.add_encryption_materials(encryption_materials)
      
      # 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. 
      endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
      # Specify the region in which the bucket is located. Example: cn-hangzhou This parameter is required if you use the V4 signature algorithm.
      region = "cn-hangzhou"
      
      # Use the provider to initialize a CryptoBucket instance. Then, you can download the object data that is encrypted by using a CMK whose description is mat_desc_1. 
      crypto_bucket = oss2.CryptoBucket(auth, endpoint, 'yourBucketName', crypto_provider=provider, region=region)
      
  • 簡単なアップロードとダウンロードでクライアント側の暗号化を実行する

    次のサンプルコードは、KMSが管理するCMKを使用して、単純アップロードでオブジェクトをアップロードするときにオブジェクトを暗号化し、オブジェクトをダウンロードするときにオブジェクトを復号化する方法の例を示しています。

    # -*- coding: utf-8 -*-
    import os
    import oss2
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    from oss2.crypto import RsaProvider
    from oss2.cryptoimportAliKMSProvider
    
    # 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())
    
    kms_provider = AliKMSProvider(auth, 'yourRegion', 'yourCMKID')
    # 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. 
    endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
    # Specify the region in which the bucket is located. Example: cn-hangzhou This parameter is required if you use the V4 signature algorithm.
    region = "cn-hangzhou"
    bucket = oss2.CryptoBucket(auth, endpoint, 'yourBucketName', crypto_provider=kms_provider, region=region)
    
    key = 'motto.txt'
    content = b'a' * 1024 * 1024
    filename = 'download.txt'
    
    
    # Upload the object. 
    bucket.put_object(key, content, headers={'content-length': str(1024 * 1024)})
    
    # Download the object from OSS to the local memory. 
    result = bucket.get_object(key)
    
    # Check data consistency between the content of the downloaded object and that of the object before upload. 
    content_got = b''
    for chunk in result:
        content_got += chunk
    assert content_got == content
    
    # Download the object from OSS to a local path. 
    result = bucket.get_object_to_file(key, filename)
    
    # Check data consistency between the content of the downloaded object and that of the object before upload. 
    with open(filename, 'rb') as fileobj:
        assert fileobj.read() == content
  • マルチパートアップロードでクライアント側の暗号化を実行する

    説明
    • マルチパートアップロードタスクが中断され、プロセスが終了すると、マルチパートアップロードタスクのコンテキストが失われる可能性があります。 マルチパートアップロードタスクが中断され、オブジェクトを再アップロードする場合は、オブジェクト全体を再アップロードする必要があります。

    • OSSで再開可能アップロードの操作を呼び出して、大きなオブジェクトをアップロードすることを推奨します。 これにより、マルチパートアップロードタスクのコンテキストをローカルクライアントに保存できるため、アップロードタスクが中断されてもコンテキストを保持できます。

    次のサンプルコードは、KMS管理CMKを使用して、マルチパートアップロードを使用してアップロードするオブジェクトを暗号化する方法の例を示しています。

    # -*- coding: utf-8 -*-
    import os
    import oss2
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    from oss2.crypto import RsaProvider
    from oss2.cryptoimportAliKMSProvider
    
    # 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())
    
    kms_provider = AliKMSProvider(auth, 'yourRegion', 'yourCMKID')
    # 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. 
    endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
    # Specify the region in which the bucket is located. Example: cn-hangzhou This parameter is required if you use the V4 signature algorithm.
    region = "cn-hangzhou"
    bucket = oss2.CryptoBucket(auth, endpoint, 'yourBucketName', crypto_provider = kms_provider, region=region)
    
    """
    Perform client-side encryption in multipart upload
    """
    # Initiate a multipart upload task. 
    part_a = b'a' * 1024 * 100
    part_b = b'b' * 1024 * 100
    part_c = b'c' * 1024 * 100
    multi_content = [part_a, part_b, part_c]
    
    parts = []
    data_size = 100 * 1024 * 3
    part_size = 100 * 1024
    multi_key = "test_crypto_multipart"
    
    # Initialize the context of the multipart upload task when you use client-side encryption. 
    context = models.MultipartUploadCryptoContext(data_size, part_size)
    res = bucket.init_multipart_upload(multi_key, upload_context=context)
    upload_id = res.upload_id
    
    # In this example, the parts are uploaded in sequence. Multipart upload supports multiple parallel threads to accelerate the upload. 
    for i in range(3):
        # The context values cannot be modified. If the values in context are modified, data upload fails. 
        result = bucket.upload_part(multi_key, upload_id, i + 1, multi_content[i], upload_context=context)
        parts.append(oss2.models.PartInfo(i + 1, result.etag, size=part_size, part_crc=result.crc))
    
    # Complete the multipart upload task. 
    result = bucket.complete_multipart_upload(multi_key, upload_id, parts)
    
    # Check data consistency between the content of the downloaded object and that of the object before upload. 
    result = bucket.get_object(multi_key)
    content_got = b''
    for chunk in result:
        content_got += chunk
    assert content_got[0:102400] == part_a
    assert content_got[102400:204800] == part_b
    assert content_got[204800:307200] == part_c
  • 再開可能アップロードでクライアント側の暗号化を実行する

    次のサンプルコードは、自分で管理するRSAベースのCMKを使用して、再開可能なアップロードを使用してアップロードするオブジェクトを暗号化する方法の例を示しています。

    # -*- coding: utf-8 -*-
    import os
    import oss2
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    from  oss2.crypto import RsaProvider
    
    key = 'motto.txt'
    content = b'a' * 1024 * 1024 * 100
    file_name_put = 'upload.txt'
    
    # Write the data included in content to the file. 
    with open(file_name_put, 'wb') as fileobj:
        fileobj.write(content)
    
    # 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())
    
    # Initialize a CryptoBucket instance and use the RSA-based CMK to perform client-side encryption. This encryption method supports only uploads and downloads of entire objects. 
    # If you use OSS SDK for Python 2.9.0 or later, we recommend that you do not use LocalRsaProvider to initialize the CryptoBucket instance. 
    # bucket = oss2.CryptoBucket(auth,'yourEndpoint', 'yourBucketName', crypto_provider=LocalRsaProvider())
    
    # If you want to only decrypt objects, specify only the private key. 
    # key_pair = {'private_key': 'yourPrivateKey'}
    # If you want to only encrypt objects, specify only the public key. 
    # key_pair = {'public_key': 'yourPublicKey'}
    # If you want to encrypt and decrypt objects, you must specify both the public key and the private key. 
    key_pair = {'private_key': 'yourPrivateKey', 'public_key': 'yourPublicKey'}
    
    # 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. 
    endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
    # Specify the region in which the bucket is located. Example: cn-hangzhou This parameter is required if you use the V4 signature algorithm.
    region = "cn-hangzhou"
    
    # Initialize a CryptoBucket instance. If you set upload_contexts_flag to True, you do not need to configure parameters for the multipart upload context when you call the upload_part operation. 
    bucket = oss2.CryptoBucket(auth, endpoint, 'yourBucketName',
                               crypto_provider=RsaProvider(key_pair), region=region)
    
    # In this example, the value of multipart_threshold is set to 10 * 1024 * 1024. The default multipart upload threshold is 10 MB. Specify a value based on your scenario. 
    # multipart_threshold specifies the object size threshold for using multipart upload. If the object size exceeds the threshold, multipart upload is used. If the object size is smaller than the threshold, we recommend that you call put_object to upload the object. 
    # part_size specifies the part size in multipart upload. The default part size is 10 MB. 
    # num_threads specifies the number of parallel upload threads. Default value: 1. 
    oss2.resumable_upload(bucket, key, file_name_put, multipart_threshold=10 * 1024 * 1024, part_size=1024 * 1024, num_threads=3)
  • 再開可能なダウンロードでクライアント側の暗号化を実行する

    次のサンプルコードは、KMSが管理するCMKを使用して、再開可能ダウンロードでダウンロードするオブジェクトを復号化する方法の例を示しています。

    # -*- coding: utf-8 -*-
    import os
    import oss2
    from oss2.crypto import RsaProvider
    from oss2.cryptoimportAliKMSProvider
    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())
    
    key = 'motto.txt'
    content = b'a' * 1024 * 1024 * 100
    file_name_get = 'download.txt'
    
    kms_provider = AliKMSProvider(auth, 'yourRegion', 'yourCMKID')
    
    endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
    # Specify the region in which the bucket is located. Example: cn-hangzhou This parameter is required if you use the V4 signature algorithm.
    region = "cn-hangzhou"
    bucket = oss2.CryptoBucket(auth, endpoint, 'yourBucketName', crypto_provider=kms_provider, region=region)
    
    
    # Download an object by using resumable download. 
    oss2.resumable_download(bucket, key, file_name_get, multiget_threshold=10 * 1024 * 1024, part_size=1024 * 1024, num_threads=3)
    
    # Check data consistency between the content of the downloaded object and that of the object before upload. 
    with open(file_name_get, 'rb') as fileobj:
        assert fileobj.read() == content
    

クライアント側暗号化V1 (推奨しない)

説明
  • クライアント側の暗号化V1は、PutObjectを呼び出して5 GB未満のオブジェクトのアップロードのみをサポートします。 マルチパートアップロード、再開可能アップロード、および再開可能ダウンロード操作はサポートされていません。

  • CryptoBucketクラスの操作を呼び出してオブジェクトをアップロードした後、CopyObjectなどの操作を呼び出してオブジェクトメタデータを変更することはできません。 メタデータが修正された場合、データは復号化されない可能性がある。

  • OSS SDK for Pythonのみがクライアント側暗号化V1をサポートしています。 他のプログラミング言語のOSS SDKは、クライアント側暗号化V1を使用してアップロードされたデータを復号できません。

  • Python V2.11.0以降のOSS SDKは、クライアント側暗号化V2をサポートしています。 クライアント側暗号化V2は、クライアント側暗号化V1よりも多くの機能を提供する。 OSS SDK for Pythonを最新バージョンにアップグレードすることを推奨します。

  • クライアント側暗号化に関連するオブジェクトメタデータ

    パラメーター

    説明

    必須 / 任意

    x-oss-meta-oss-crypto-key

    暗号化されたデータキー。 暗号化されたデータキーは、RSAベースのCMKを使用して暗号化され、Base64でエンコードされた文字列です。

    x-oss-meta-oss-crypto-start

    データ暗号化のためにランダムに生成された初期値。 値は、RSAベースのCMKを使用して暗号化され、Base64でエンコードされた文字列です。

    x-oss-meta-oss-cek-alg

    データの暗号化に使用されるアルゴリズム。

    x-oss-meta-oss-wrap-alg

    データキーの暗号化に使用されるアルゴリズム。

    x-oss-meta-oss-matdesc

    JSON形式のコンテンツ暗号化キー (CEK) の説明。 このパラメータは有効になりません。

    不可

    x-oss-meta-unencrypted-content-length

    暗号化前のデータの長さ。 content-lengthを指定しない場合、このパラメーターは生成されません。

    不可

    x-oss-meta-unencrypted-content-md5

    暗号化前のデータのMD5ハッシュ。 content-md5を指定しない場合、このパラメーターは生成されません。

    不可

  • 自分で管理するRSAベースのCMKを使用して、オブジェクトのアップロードとダウンロードのクライアント側暗号化を実行します

    次のサンプルコードでは、RSAベースのCMKを使用してオブジェクトを暗号化し、ダウンロードするオブジェクトをアップロードおよび復号化する方法の例を示します。

    # -*- coding: utf-8 -*-
    import os
    import oss2
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    from oss2.crypto import LocalRsaProvider
    
    # 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. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. 
    endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
    # Specify the region in which the bucket is located. Example: cn-hangzhou This parameter is required if you use the V4 signature algorithm.
    region = "cn-hangzhou"
    # Initialize a CryptoBucket instance and use the RSA-based CMK to perform client-side encryption. This encryption method supports only uploads and downloads of entire objects. 
    bucket = oss2.CryptoBucket(auth, endpoint, 'yourBucketName', crypto_provider=LocalRsaProvider(), region=region)
    
    key = 'motto.txt'
    content = b'a' * 1024 * 1024
    filename = 'download.txt'
    
    
    # Upload the object. 
    bucket.put_object(key, content, headers={'content-length': str(1024 * 1024)})
    
    # Download the object from OSS to the local memory. 
    result = bucket.get_object(key)
    
    # Check data consistency between the content of the downloaded object and that of the object before upload. 
    content_got = b''
    for chunk in result:
        content_got += chunk
    assert content_got == content
    
    # Download the object from OSS to a local path. 
    result = bucket.get_object_to_file(key, filename)
    
    # Check data consistency between the content of the downloaded object and that of the object before upload. 
    with open(filename, 'rb') as fileobj:
        assert fileobj.read() == content

関連ドキュメント

クライアント側暗号化の完全なサンプルコードについては、『GitHub』をご参照ください。