クライアント側の暗号化とは、データを 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 が指定されていない場合、このパラメーターは生成されません。 | いいえ |
ユーザー自己管理方式でファイルのアップロードおよびダウンロード
ユーザー自己管理方式を使用してファイルをアップロードおよびダウンロードできます。ソースコードは次のとおりです。
# -*- 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 = b’a’ * 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 によって管理される方式でファイルのアップロードおよびダウンロード
- 前提条件
- Alibaba Cloud KeyManagementService (KMS) サービスが有効になっています。
- リージョンの秘密鍵の ID が生成されています。
- カスタム認証ポリシーが作成されています(操作順: )、このポリシーは対応するユーザーに関連付けられています。
次の形式を参照してカスタムポリシーを作成します。
{
“Version”: “1”,
“Statement”: [
{
“Effect”: “Allow”,
“Action”: [
“kms:CreateKey”,
“kms:GenerateDataKey”,
“kms:ListKeys”,
“kms:Encrypt”,
“kms:Decrypt”
],
“Resource”: [
“acs:kms:<yourRegion>:<yourloginUserId>:key/“
]
}
]
}
- サンプルコード
# -*- 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 = b’a’ * 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)