クライアント側の暗号化とは、データを OSS に送信する前に、クライアント側で暗号化することです。

完全なサンプルコードについては、GitHub をご参照ください。

データ暗号化キーを保存する方法は 2 つあります。

  • ユーザー自己管理(RSA)
  • KMS によって管理

上記の 2 つの暗号化方法を使用すると、秘密鍵漏洩を効果的に保止し、クライアントのデータセキュリティを保護することができます。データ漏洩が発生したとしても、元のデータを復号化できません。

クライアント側暗号化の詳細については、開発者ガイドの Introduction to client-side encryption SDK をご参照ください。

暗号化されたメタ情報

パラメータ 説明 必須かどうか
x-oss-meta-oss-crypto-key 暗号化された秘密鍵。 RSA 暗号化後の base64 でエンコードされた文字列です。 はい
x-oss-meta-oss-crypto-start ランダムに生成された暗号化データの初期値。RSA 暗号化後の base64 でエンコードされた文字列です。 はい
x-oss-meta-oss-cek-alg データの暗号化アルゴリズム。値は AES / GCM / NoPadding です。 はい
x-oss-meta-oss-wrap-alg データ秘密鍵の暗号化アルゴリズム。値は rsa と kms です。 はい
x-oss-meta-oss-matdesc JSON 形式コンテンツの暗号化秘密鍵(CEK)の説明です。まだ有効になっておりません。 いいえ
x-oss-meta-unencrypted-content-length 暗号化される前のデータの長さ。content-length が指定されていない場合、このパラメーターは生成されません。 いいえ
x-oss-meta-unencrypted-content-md5 暗号化される前のデータの MD5。MD5 が指定されていない場合、このパラメーターは生成されません。 いいえ

ユーザー自己管理方式でファイルのアップロードおよびダウンロード

ユーザー自己管理方式を使用してファイルをアップロードおよびダウンロードできます。ソースコードは次のとおりです。

  1. # -*- coding: utf-8 -*-
    import os
    import oss2 from oss2.crypto
    import LocalRsaProvider
    # プライマリアカウントの AccessKey は、すべての API にアクセスできるため、非常に危険です。API アクセスや日常の運用保守に、RAM アカウントを作成して使用することを強く推奨します。https://ram.console.aliyun.com にログインして RAM アカウントを作成してください。
    auth = oss2.Auth(‘<yourAccessKeyId>’, ‘<yourAccessKeySecret>’)
    # ストレージスペースを作成し、ユーザー自己管理(RSA)方式で暗号化を行います。この方式は、ファイル全体のアップロードとダウンロード操作のみをサポートします。
    bucket = oss2.CryptoBucket(auth,’<yourEndpoint>’,
    ‘<yourBucketName>’, crypto_provider=LocalRsaProvider())
    key = motto.txt
    content = ba * 1024 * 1024
    filename = download.txt
    # ファイルのアップロード
    bucket.put_object(key, content, headers={‘content-length’: str(1024 1024)})
    # ファイルのダウンロード
    result = bucket.get_object(key)
    # 検証
    content_got = b’’
    for chunk in result:
    content_got += chunk
    assert content_got == content
    # OSSファイルをローカルファイルにダウンロード
    result = bucket.get_object_to_file(key, filename)
    # 検証
    with open(filename, rb’) as fileobj:
    assert fileobj.read() == content
    os.remove(filename)

KMS によって管理される方式でファイルのアップロードおよびダウンロード

  • 前提条件
    1. Alibaba Cloud KeyManagementService (KMS) サービスが有効になっています。
    2. リージョンの秘密鍵の ID が生成されています。
    3. カスタム認証ポリシーが作成されています(操作順:コンソール > Resource Access Management (RAM) > 権限付与ポリシー管理 > カスタマイズ権限付与ポリシー > 権限付与ポリシーを作成)、このポリシーは対応するユーザーに関連付けられています。

    次の形式を参照してカスタムポリシーを作成します。

    1. {
      Version”: 1”,
      Statement”: [
      {
      Effect”: Allow”,
      Action”: [
      kms:CreateKey”,
      kms:GenerateDataKey”,
      kms:ListKeys”,
      kms:Encrypt”,
      kms:Decrypt
      ],
      Resource”: [
      acs:kms:<yourRegion>:<yourloginUserId>:key/

      ]
      }
      ]
      }
  • サンプルコード
    1. # -*- coding: utf-8 -*-
      import os
      import oss2
      from oss2.crypto import AliKMSProvider
      # Alibaba Cloud プライマリアカウントの AccessKey はすべての API にアクセスできるため、非常に危険です。API アクセスや日常の運用保守に、RAM アカウントを作成して使用することを強く推奨します。 https://ram.console.aliyun.com にログインして RAM アカウントを作成してください。
      auth = oss2.Auth(‘<yourAccessKeyId>’, ‘<yourAccessKeySecret>’)
      # ストレージスペースを作成し、KMS によって管理される方式で暗号化します。この方式は、ファイル全体のアップロードとダウンロード操作のみをサポートします。
      bucket = oss2.CryptoBucket(auth,’<yourEndpoint>’,
      liusiman123456’,crypto_provider=AliKMSProvider(‘<yourAccessKeyId>’,
      ‘<yourAccessKeySecret>’, ‘<yourRegion>’, ‘<yourCMK>’, 1234’))
      key = motto.txt
      content = ba * 1024 * 1024
      filename = download.txt
      # ファイルのアップロード
      bucket.put_object(key, content, headers={‘content-length’: str(1024 * 1024)})
      # ファイルのダウンロード
      result = bucket.get_object(key)
      # 验证
      content_got = b’’
      for chunk in result:
      content_got += chunk
      assert content_got == content
      # OSSファイルをローカルファイルにダウンロード
      result = bucket.get_object_to_file(key, filename)
      # 验证
      with open(filename, rb’) as fileobj:
      assert fileobj.read() == content
      os.remove(filename)