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

Object Storage Service:PHP クライアント側の暗号化

最終更新日:Nov 09, 2025

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

使用上の注意

  • このトピックのサンプルコードでは、中国 (杭州) リージョンのリージョン ID cn-hangzhou を例として使用しています。 デフォルトでは、パブリックエンドポイントが使用されます。 同じリージョン内の他の Alibaba Cloud プロダクトから OSS にアクセスする場合は、内部エンドポイントを使用します。 OSS リージョンとエンドポイント間のマッピングの詳細については、「リージョンとエンドポイント」をご参照ください。

  • クライアント側暗号化を使用する場合は、CMK の整合性と有効性を確保する必要があります。

  • 暗号化されたデータをコピーまたは移行する場合は、オブジェクトメタデータの整合性と有効性について責任を負います。

RSA ベースの CMK をクライアント側暗号化に使用する

RSA ベースの CMK を使用して単純アップロードでオブジェクトを暗号化し、単純ダウンロードでオブジェクトを復号化する

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

<?php

// 依存ライブラリを読み込むために、autoload ファイルを導入します。
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

// データ暗号化操作の RSA 公開鍵を指定します。
const RSA_PUBLIC_KEY = <<<BBB
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCokfiAVXXf5ImFzKDw+XO/UByW
6mse2QsIgz3ZwBtMNu59fR5zttSx+8fB7vR4CN3bTztrP9A6bjoN0FFnhlQ3vNJC
5MFO1PByrE/MNd5AAfSVba93I6sx8NSk5MzUCA4NJzAUqYOEWGtGBcom6kEF6MmR
1EKib1Id8hpooY5xaQIDAQAB
-----END PUBLIC KEY-----
BBB;

// データ復号化操作の RSA 秘密鍵を指定します。
const RSA_PRIVATE_KEY = <<<BBB
-----BEGIN PRIVATE KEY-----
MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKiR+IBVdd/kiYXM
oPD5c79QHJbqax7ZCwiDPdnAG0w27n19HnO21LH7x8Hu9HgI3dtPO2s/0DpuOg3Q
UWeGVDe80kLkwU7U8HKsT8w13kAB9JVtr3cjqzHw1KTkzNQIDg0nMBSpg4RYa0YF
yibqQQXoyZHUQqJvUh3yGmihjnFpAgMBAAECgYA49RmCQ14QyKevDfVTdvYlLmx6
kbqgMbYIqk+7w611kxoCTMR9VMmJWgmk/Zic9mIAOEVbd7RkCdqT0E+xKzJJFpI2
ZHjrlwb21uqlcUqH1Gn+wI+jgmrafrnKih0kGucavr/GFi81rXixDrGON9KBE0FJ
cPVdc0XiQAvCBnIIAQJBANXu3htPH0VsSznfqcDE+w8zpoAJdo6S/p30tcjsDQnx
l/jYV4FXpErSrtAbmI013VYkdJcghNSLNUXppfk2e8UCQQDJt5c07BS9i2SDEXiz
byzqCfXVzkdnDj9ry9mba1dcr9B9NCslVelXDGZKvQUBqNYCVxg398aRfWlYDTjU
IoVVAkAbTyjPN6R4SkC4HJMg5oReBmvkwFCAFsemBk0GXwuzD0IlJAjXnAZ+/rIO
ItewfwXIL1Mqz53lO/gK+q6TR585AkB304KUIoWzjyF3JqLP3IQOxzns92u9EV6l
V2P+CkbMPXiZV6sls6I4XppJXX2i3bu7iidN3/dqJ9izQK94fMU9AkBZvgsIPCot
y1/POIbv9LtnviDKrmpkXgVQSU4BmTPvXwTJm8APC7P/horSh3SVf1zgmnsyjm9D
hO92gGc+4ajL
-----END PRIVATE KEY-----
BBB;

// コマンドラインパラメータの説明を指定します。
$optsdesc = [
    "region" => ['help' => 'バケットが配置されているリージョン。', 'required' => True], // (必須) バケットが配置されているリージョンを指定します。
    "endpoint" => ['help' => '他のサービスが OSS にアクセスするために使用できるドメイン名', 'required' => False], // (オプション) 他のサービスが OSS にアクセスするために使用できるエンドポイントを指定します。
    "bucket" => ['help' => 'バケットの名前', 'required' => True], // (必須) バケットの名前を指定します。
    "key" => ['help' => 'オブジェクトの名前', 'required' => True], // (必須) オブジェクトの名前を指定します。
];

// コマンドラインパラメータを解析するための長いオプションリストを生成します。
$longopts = \array_map(function ($key) {
    return "$key:"; // 各パラメータの末尾にコロン (:) を追加して、値が必要であることを示します。
}, array_keys($optsdesc));

// コマンドラインパラメータを解析します。
$options = getopt("", $longopts); 

// 必須パラメータが構成されているかどうかを確認します。
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help'];
        echo "Error: the following arguments are required: --$key, $help"; // 必須パラメータが構成されていないことを示します。
        exit(1); 
    }
}

// コマンドラインパラメータの値を取得します。
$region = $options["region"]; // バケットが配置されているリージョン。
$bucket = $options["bucket"]; // バケットの名前。
$key = $options["key"]; // オブジェクトの名前。

// 環境変数を使用して AccessKey ID と AccessKey シークレットを読み込みます。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// SDK のデフォルト構成を使用します。
$cfg = Oss\Config::loadDefault();

// 資格情報プロバイダーを指定します。
$cfg->setCredentialsProvider($credentialsProvider);

// リージョンを指定します。
$cfg->setRegion($region);

// エンドポイントが提供されている場合は、エンドポイントを指定します。
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]);
}

// OSSClient インスタンスを作成します。
$client = new Oss\Client($cfg);

// CMK 暗号化を作成し、データ暗号化に RSA 公開鍵を、データ復号化に RSA 秘密鍵を使用します。
$masterCipher = new Oss\Crypto\MasterRsaCipher(
    publicKey: RSA_PUBLIC_KEY, // RSA 公開鍵を指定します。
    privateKey: RSA_PRIVATE_KEY, // RSA 秘密鍵を指定します。
    matDesc: ['tag' => 'value'] // 追加のタグを暗号化します。
);

// クライアント側暗号化のクライアントを作成します。
$eclient = new Oss\EncryptionClient(client: $client, masterCipher: $masterCipher);

// 単純アップロードの PutObjectRequest オブジェクトを作成します。
$putObjRequest = new Oss\Models\PutObjectRequest(bucket: $bucket, key: $key);

// putObject メソッドを使用してローカルファイルをアップロードします。
$putObjResult = $eclient->putObject(request: $putObjRequest);

// 返された結果を表示します。
printf(
    'put object status code:' . $putObjResult->statusCode . PHP_EOL . // 返された HTTP ステータスコード。
    'request id:' . $putObjResult->requestId . PHP_EOL // リクエスト ID。リクエストの一意の識別子です。
);

RSA ベースの CMK を使用してマルチパートアップロードでオブジェクトを暗号化する

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

<?php

// 依存ライブラリを読み込むために、autoload ファイルを導入します。
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

// データ暗号化操作の RSA 公開鍵を指定します。
const RSA_PUBLIC_KEY = <<<BBB
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCokfiAVXXf5ImFzKDw+XO/UByW
6mse2QsIgz3ZwBtMNu59fR5zttSx+8fB7vR4CN3bTztrP9A6bjoN0FFnhlQ3vNJC
5MFO1PByrE/MNd5AAfSVba93I6sx8NSk5MzUCA4NJzAUqYOEWGtGBcom6kEF6MmR
1EKib1Id8hpooY5xaQIDAQAB
-----END PUBLIC KEY-----
BBB;

// データ復号化操作の RSA 秘密鍵を指定します。
const RSA_PRIVATE_KEY = <<<BBB
-----BEGIN PRIVATE KEY-----
MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKiR+IBVdd/kiYXM
oPD5c79QHJbqax7ZCwiDPdnAG0w27n19HnO21LH7x8Hu9HgI3dtPO2s/0DpuOg3Q
UWeGVDe80kLkwU7U8HKsT8w13kAB9JVtr3cjqzHw1KTkzNQIDg0nMBSpg4RYa0YF
yibqQQXoyZHUQqJvUh3yGmihjnFpAgMBAAECgYA49RmCQ14QyKevDfVTdvYlLmx6
kbqgMbYIqk+7w611kxoCTMR9VMmJWgmk/Zic9mIAOEVbd7RkCdqT0E+xKzJJFpI2
ZHjrlwb21uqlcUqH1Gn+wI+jgmrafrnKih0kGucavr/GFi81rXixDrGON9KBE0FJ
cPVdc0XiQAvCBnIIAQJBANXu3htPH0VsSznfqcDE+w8zpoAJdo6S/p30tcjsDQnx
l/jYV4FXpErSrtAbmI013VYkdJcghNSLNUXppfk2e8UCQQDJt5c07BS9i2SDEXiz
byzqCfXVzkdnDj9ry9mba1dcr9B9NCslVelXDGZKvQUBqNYCVxg398aRfWlYDTjU
IoVVAkAbTyjPN6R4SkC4HJMg5oReBmvkwFCAFsemBk0GXwuzD0IlJAjXnAZ+/rIO
ItewfwXIL1Mqz53lO/gK+q6TR585AkB304KUIoWzjyF3JqLP3IQOxzns92u9EV6l
V2P+CkbMPXiZV6sls6I4XppJXX2i3bu7iidN3/dqJ9izQK94fMU9AkBZvgsIPCot
y1/POIbv9LtnviDKrmpkXgVQSU4BmTPvXwTJm8APC7P/horSh3SVf1zgmnsyjm9D
hO92gGc+4ajL
-----END PRIVATE KEY-----
BBB;

// コマンドラインパラメータの説明を指定します。
$optsdesc = [
    "region" => ['help' => 'バケットが配置されているリージョン。', 'required' => True], // (必須) バケットが配置されているリージョンを指定します。
    "endpoint" => ['help' => '他のサービスが OSS にアクセスするために使用できるドメイン名', 'required' => False], // (オプション) 他のサービスが OSS にアクセスするために使用できるエンドポイントを指定します。
    "bucket" => ['help' => 'バケットの名前', 'required' => True], // (必須) バケットの名前を指定します。
    "key" => ['help' => 'オブジェクトの名前', 'required' => True], // (必須) オブジェクトの名前を指定します。
];

// コマンドラインパラメータを解析するための長いオプションリストを生成します。
$longopts = \array_map(function ($key) {
    return "$key:"; // 各パラメータの末尾にコロン (:) を追加して、値が必要であることを示します。
}, array_keys($optsdesc));

// コマンドラインパラメータを解析します。
$options = getopt("", $longopts); 

// 必須パラメータが構成されているかどうかを確認します。
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help'];
        echo "Error: the following arguments are required: --$key, $help"; // 必須パラメータが構成されていないことを示します。
        exit(1); 
    }
}

// コマンドラインパラメータの値を取得します。
$region = $options["region"]; // バケットが配置されているリージョン。
$bucket = $options["bucket"]; // バケットの名前。
$key = $options["key"]; // オブジェクトの名前。

// 環境変数を使用して AccessKey ID と AccessKey シークレットを読み込みます。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// SDK のデフォルト構成を使用します。
$cfg = Oss\Config::loadDefault();

// 資格情報プロバイダーを指定します。
$cfg->setCredentialsProvider($credentialsProvider);

// リージョンを指定します。
$cfg->setRegion($region);

// エンドポイントが提供されている場合は、エンドポイントを指定します。
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]);
}

// OSSClient インスタンスを作成します。
$client = new Oss\Client($cfg);

// CMK 暗号化を作成し、データ暗号化に RSA 公開鍵を、データ復号化に RSA 秘密鍵を使用します。
$masterCipher = new Oss\Crypto\MasterRsaCipher(
    RSA_PUBLIC_KEY, // RSA 公開鍵を指定します。
    RSA_PRIVATE_KEY, // RSA 秘密鍵を指定します。
    ['tag' => 'value'] // 追加のタグを暗号化します。
);

// クライアント側暗号化のクライアントを作成します。
$eclient = new Oss\EncryptionClient($client, $masterCipher);

// マルチパートアップロードリクエストを開始し、パートサイズとオブジェクトの合計サイズを指定します。
$initRequest = new Oss\Models\InitiateMultipartUploadRequest(bucket: $bucket, key: $key);
$initRequest-> cseDataSize=500 * 1024; // オブジェクトの合計サイズを 500 KB に設定します。
$initRequest-> csePartSize=200 * 1024; // 各パートのサイズを 200 KB に設定します。

// initiateMultipartUpload メソッドを使用して、マルチパートアップロードリクエストを開始します。
$initResult = $eclient->initiateMultipartUpload(request: $initRequest);

// マルチパートアップロードタスクの UploadPartRequest オブジェクトを作成します。
$uploadPartRequest = new Oss\Models\UploadPartRequest(bucket: $bucket, key: $key);

// 一時ローカルファイルの名前とパートサイズを指定します。
$bigFileName = "upload.tmp"; // 一時ローカルファイルの名前を指定します。
$partSize=200 * 1024; // 各パートのサイズを 200 KB に設定します。

// テスト用にサイズが 500 KB の一時ローカルファイルを生成します。
generateFile($bigFileName, 500 * 1024);

// 一時ローカルファイルを開き、コンテンツを読み取ります。
$file = fopen(filename: $bigFileName, mode: 'r');

// パート情報を格納するために使用される配列を指定します。
$parts = array();

// 一時ローカルファイルが正常に開かれた場合は、パートを読み取ってアップロードします。
if ($file) {
    $i = 1; // パート番号を 1 から開始するように指定します。
    while (!feof(stream: $file)) {
        // パートのデータを読み取ります。
        $chunk = fread(stream: $file, length: $partSize);

        // マルチパートアップロードタスクの UploadPartRequest オブジェクトを作成し、パート番号とアップロード ID を指定します。
        $uploadPartRequest = new Oss\Models\UploadPartRequest(
            bucket: $bucket,
            key: $key,
            partNumber: $i,
            uploadId: $initResult->uploadId,
            contentLength: null,
            contentMd5: null,
            trafficLimit: null,
            requestPayer: null,
            body: Oss\Utils::streamFor(resource: $chunk) // パートデータをストリームに変換します。
        );

        // コンテキストを暗号化します。
        $uploadPartRequest->encryptionMultipartContext = $initResult->encryptionMultipartContext;

        // uploadPart メソッドを使用してパートをアップロードします。
        $partResult = $eclient->uploadPart($uploadPartRequest);

        // UploadPart オブジェクトを作成し、パート配列に追加します。
        $part = new Oss\Models\UploadPart(
            partNumber: $i,
            etag: $partResult->etag, // パートの ETag を取得します。
        );
        array_push(array: $parts, values: $part);

        $i++; // パート番号を指定します。パート番号は順番に増加します。
    }
    fclose(stream: $file); // ファイルを閉じます。
}

// completeMultipartUpload メソッドを使用して、パートを完全なオブジェクトに結合します。
$comResult = $eclient->completeMultipartUpload(
    request: new Oss\Models\CompleteMultipartUploadRequest(
        bucket: $bucket,
        key: $key,
        uploadId: $initResult->uploadId,
        acl: null,
        completeMultipartUpload: new Oss\Models\CompleteMultipartUpload(
            parts: $parts
        ),
    )
);

// 一時ローカルファイルを削除します。
unlink($bigFileName);

// 返された結果を表示します。
printf(
    'complete multipart upload status code:' . $comResult->statusCode . PHP_EOL . // 返された HTTP ステータスコード。
    'complete multipart upload request id:' . $comResult->requestId . PHP_EOL . // リクエスト ID。リクエストの一意の識別子です。
    complete multipart upload result:' . var_export($comResult, true) // マルチパートアップロードタスクの結果。
);

// マルチパートアップロードをテストするために、特定のサイズのローカルファイルを作成します。
function generateFile($filename, $size)
{
    // ファイルが既に存在し、ファイルのサイズが要件を満たしている場合は、直接返されます。
    if (
        file_exists($filename) &&
        $size == sprintf('%u', filesize($filename))
    ) {
        return;
    }

    $part_size=32; // クライアントが一度に OSS に書き込むことができる各データブロックのサイズを 32 バイトに設定します。
    $fp = fopen($filename, "w"); // ファイルを書き込みモードで開きます。
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; // 文字セットを指定します。

    $charactersLength = strlen($characters); // 文字セットの長さを指定します。

    // ファイルが正常に開かれた場合は、指定されたサイズのデータがアップロードされるまで、ループでデータが書き込まれます。
    if ($fp) {
        while ($size > 0) {
            // 現在の書き込み操作のデータサイズを計算します。
            if ($size < $part_size) {
                $write_size = $size;
            } else {
                $write_size = $part_size;
            }

            $size -= $write_size; // 書き込む残りのサイズを更新します。

            // 文字をランダムに選択し、繰り返しコンテンツを生成します。
            $a = $characters[rand(0, $charactersLength - 1)];
            $content = str_repeat($a, $write_size);

            // コンテンツをローカルファイルに書き込みます。
            $flag = fwrite($fp, $content);
            if (!$flag) {
                break; // 書き込み操作が失敗した場合は、ループを終了します。
            }
        }
    }

    fclose($fp); // ローカルファイルを閉じます。
}

カスタム CMK を使用する

カスタム CMK を使用して単純アップロードでオブジェクトを暗号化し、単純ダウンロードでオブジェクトを復号化する

SDK はデフォルトの RSA 実装を提供します。 デフォルトの実装がニーズを満たさない場合は、カスタム CMK に基づいて暗号化と復号化を実装できます。 次のサンプルコードでは、KMS 3.0 のカスタム CMK を使用して、単純アップロードでオブジェクトを暗号化し、単純ダウンロードでオブジェクトを復号化します。

<?php
// 依存ライブラリを読み込むために autoload ファイルを導入します。
require_once 'vendor/autoload.php';

use AlibabaCloud\Dkms\Gcs\Sdk\Client as KmsClient;
use AlibabaCloud\Oss\V2 as Oss;

// コマンドラインパラメータの説明を指定します。
$optsdesc = [
    "region" => ['help' => 'バケットが配置されているリージョン。', 'required' => True], // (必須) バケットが配置されているリージョンを指定します。
    "endpoint" => ['help' => '他のサービスが OSS にアクセスするために使用できるドメイン名。', 'required' => False], // (オプション) 他のサービスが OSS にアクセスするために使用できるエンドポイントを指定します。
    "bucket" => ['help' => 'バケットの名前', 'required' => True], // (必須) バケットの名前を指定します。
    "key" => ['help' => 'オブジェクトの名前', 'required' => True], // (必須) オブジェクトの名前を指定します。
];


// コマンドラインパラメータを解析するための長いオプションリストを生成します。
$longopts = \array_map(function ($key) {
    return "$key:"; // 各パラメータの末尾にコロン(:)を追加して、値が必要であることを示します。
}, array_keys($optsdesc));

// コマンドラインパラメータを解析します。
$options = getopt("", $longopts);

// 必須パラメータが構成されているかどうかを確認します。
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help'];
        echo "Error: the following arguments are required: --$key, $help"; // 必須パラメータが構成されていないことを示します。
        exit(1);
    }
}

// コマンドラインパラメータの値を取得します。
$region = $options["region"]; // バケットが配置されているリージョン。
$bucket = $options["bucket"]; // バケットの名前。
$key = $options["key"]; // オブジェクトの名前。

// 環境変数を使用して AccessKey ID と AccessKey シークレットを読み込みます。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// MasterCipherInterface 操作を呼び出す KMS 暗号化および復号化クラスを指定します。
class KmsCipher implements Oss\Crypto\MasterCipherInterface
{
    private $matDesc;
    private ?KmsClient $kmsClient;
    private ?string $keyId;
    private ?string $algorithm;

    public function __construct(
        $matDesc = null,
        ?string $keyId = null,
        ?KmsClient $kmsClient = null,
        ?string $algorithm = null
    )
    {
        $this->keyId = $keyId;
        $this->matDesc = null;
        if (\is_array($matDesc)) {
            $val = json_encode($matDesc);
            if ($val !== false) {
                $this->matDesc = $val;
            }
        } else if (is_string($matDesc)) {
            $this->matDesc = $matDesc;
        }

        $this->kmsClient = $kmsClient;
        $this->algorithm = $algorithm;
    }

    // 暗号化方法を指定します。
    public function encrypt(string $data): string
    {
        $encryptRequest = new \AlibabaCloud\Dkms\Gcs\Sdk\Models\AdvanceEncryptRequest();
        $encryptRequest->algorithm = $this->algorithm;
        $encryptRequest->keyId = $this->keyId;
        $encryptRequest->plaintext = \AlibabaCloud\Tea\Utils\Utils::toBytes($data);
        $runtimeOptions = new \AlibabaCloud\Dkms\Gcs\OpenApi\Util\Models\RuntimeOptions();
        $encryptResponse = $this->kmsClient->advanceEncryptWithOptions($encryptRequest, $runtimeOptions);
        return base64_decode((string)$encryptResponse->ciphertextBlob);
    }

    // 復号化方法を指定します。
    public function decrypt(string $data): string
    {
        $decryptRequest = new \AlibabaCloud\Dkms\Gcs\Sdk\Models\AdvanceDecryptRequest();
        $decryptRequest->keyId = $this->keyId;
        $decryptRequest->ciphertextBlob = $data;
        $decryptRequest->algorithm = $this->algorithm;
        $runtimeOptions = new \AlibabaCloud\Dkms\Gcs\OpenApi\Util\Models\RuntimeOptions();
        $decryptResponse = $this->kmsClient->advanceDecryptWithOptions($decryptRequest, $runtimeOptions);
        return base64_decode((string)$decryptResponse->plaintext);
    }

    // ラッピングアルゴリズムを取得します。
    public function getWrapAlgorithm(): string
    {
        return "KMS/ALICLOUD";
    }

    public function getMatDesc(): string
    {
        return $this->matDesc;
    }
}

/**
 * 専用の KMS SDK クライアントを作成します。
 * @return KmsClient
 */
function getDkmsGcsSdkClient()
{
    global $clientKeyFile, $password, $endpoint;
    // 専用の KMS SDK クライアントの構成を作成します。
    $config = new \AlibabaCloud\Dkms\Gcs\OpenApi\Models\Config();
    $config->protocol = 'https';
    $config->clientKeyFile = $clientKeyFile;
    $config->password = $password;
    $config->endpoint = $endpoint;
    // 証明書を確認します。
    $config->caFilePath = 'path/to/caCert.pem';
    // KMS SDK クライアントを作成します。
    return new \AlibabaCloud\Dkms\Gcs\Sdk\Client($config);
}

// KMS インスタンスのクライアントキーを格納するファイルのパスを指定します。
$clientKeyFile = '<your client key file path>';
// クライアントキーファイルを作成するときのパスワードを指定します。
$password = '<your dkms client passowrd>';
// KMS インスタンスのエンドポイントを指定します。
$endpoint = '<your dkms instance service address>';
// KMS で作成したキーの ID を指定します。
$kmsKeyId = '<your cmk id>';
// 暗号化および復号化アルゴリズムを指定します。
$algorithm = '<your encrypt algorithm>';

// 専用の KMS SDK クライアントを指定します。
$kmsClient = getDkmsGcsSdkClient();

$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider);
$cfg->setRegion($region);
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]);
}

$client = new Oss\Client($cfg);
$materialDesc = ['desc' => 'your kms encrypt key material describe information'];
$masterKmsCipher = new KmsCipher($materialDesc, $kmsKeyId, $kmsClient, $algorithm);
$eClient = new \AlibabaCloud\Oss\V2\EncryptionClient($client, $masterKmsCipher);

$eClient->putObject(new Oss\Models\PutObjectRequest(
    bucket: $bucket,
    key: $key,
    body: Oss\Utils::streamFor('hi kms')
));

$result = $eClient->getObject(new Oss\Models\GetObjectRequest(
    bucket: $bucket,
    key: $key,
));

$data = $result->body->getContents();
echo "get object data: " . $data;

関連情報

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

  • RSA ベースの CMK に基づく単純なアップロードとダウンロードの完全なサンプルコードについては、GitHub をご覧ください。