全部产品
Search
文档中心

Object Storage Service:Enkripsi sisi klien (PHP SDK V2)

更新时间:Nov 09, 2025

Jika enkripsi sisi klien diaktifkan, objek akan dienkripsi secara lokal sebelum diunggah ke Object Storage Service (OSS). Hanya pemegang Customer Master Key (CMK) yang dapat mendekripsi objek. Enkripsi sisi klien meningkatkan keamanan data selama transmisi dan penyimpanan.

Catatan penggunaan

  • Kode contoh dalam topik ini menggunakan ID wilayah cn-hangzhou untuk wilayah China (Hangzhou) sebagai contoh. Titik akhir publik digunakan secara default. Jika Anda ingin mengakses OSS dari produk Alibaba Cloud lainnya di wilayah yang sama, gunakan titik akhir internal. Untuk informasi lebih lanjut tentang pemetaan antara wilayah dan titik akhir OSS, lihat Wilayah dan Titik Akhir.

  • Saat menggunakan enkripsi sisi klien, pastikan integritas dan validitas CMK.

  • Saat menyalin atau memigrasi data terenkripsi, Anda bertanggung jawab atas integritas dan validitas metadata objek.

Menggunakan CMK berbasis RSA untuk enkripsi sisi klien

Menggunakan CMK berbasis RSA untuk mengenkripsi objek dalam unggahan sederhana dan mendekripsi objek dalam unduhan sederhana

Berikut adalah contoh kode yang menunjukkan cara menggunakan CMK berbasis RSA untuk mengenkripsi objek dalam unggahan sederhana dan mendekripsi objek dalam unduhan sederhana:

<?php

// Masukkan file autoload untuk memuat pustaka dependen.
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

// Tentukan kunci publik RSA untuk operasi enkripsi data.
const RSA_PUBLIC_KEY = <<<BBB
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCokfiAVXXf5ImFzKDw+XO/UByW
6mse2QsIgz3ZwBtMNu59fR5zttSx+8fB7vR4CN3bTztrP9A6bjoN0FFnhlQ3vNJC
5MFO1PByrE/MNd5AAfSVba93I6sx8NSk5MzUCA4NJzAUqYOEWGtGBcom6kEF6MmR
1EKib1Id8hpooY5xaQIDAQAB
-----END PUBLIC KEY-----
BBB;

// Tentukan kunci privat RSA untuk operasi dekripsi data.
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;

// Tentukan deskripsi untuk parameter baris perintah.
$optsdesc = [
    "region" => ['help' => Wilayah tempat bucket berada.', 'required' => True], // (Diperlukan) Tentukan wilayah tempat bucket berada.
    "endpoint" => ['help' => Nama domain yang dapat digunakan layanan lain untuk mengakses OSS', 'required' => False], // (Opsional) Tentukan titik akhir yang dapat digunakan oleh layanan lain untuk mengakses OSS.
    "bucket" => ['help' => Nama bucket', 'required' => True], // (Diperlukan) Tentukan nama bucket.
    "key" => ['help' => Nama objek', 'required' => True], // (Diperlukan) Tentukan nama objek.
];

// Hasilkan daftar opsi panjang untuk mem-parsing parameter baris perintah.
$longopts = \array_map(function ($key) {
    return "$key:"; // Tambahkan titik dua (:) di akhir setiap parameter untuk menunjukkan bahwa nilai diperlukan.
}, array_keys($optsdesc));

// Parse parameter baris perintah.
$options = getopt("", $longopts); 

// Periksa apakah parameter yang diperlukan telah dikonfigurasi.
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help'];
        echo "Error: argumen berikut diperlukan: --$key, $help"; // Tunjukkan bahwa parameter yang diperlukan belum dikonfigurasi.
        exit(1); 
    }
}

// Dapatkan nilai parameter baris perintah.
$region = $options["region"]; // Wilayah tempat bucket berada.
$bucket = $options["bucket"]; // Nama bucket.
$key = $options["key"]; // Nama objek.

// Gunakan variabel lingkungan untuk memuat ID AccessKey dan Rahasia AccessKey.
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// Gunakan konfigurasi default dari SDK.
$cfg = Oss\Config::loadDefault();

// Tentukan penyedia kredensial.
$cfg->setCredentialsProvider($credentialsProvider);

// Tentukan wilayah.
$cfg->setRegion($region);

// Tentukan titik akhir jika titik akhir disediakan.
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]);
}

// Buat instance OSSClient.
$client = new Oss\Client($cfg);

// Buat enkripsi CMK dan gunakan kunci publik RSA untuk enkripsi data dan kunci privat RSA untuk dekripsi data.
$masterCipher = new Oss\Crypto\MasterRsaCipher(
    publicKey: RSA_PUBLIC_KEY, // Tentukan kunci publik RSA.
    privateKey: RSA_PRIVATE_KEY, // Tentukan kunci privat RSA.
    matDesc: ['tag' => 'value'] // Enkripsi tag tambahan.
);

// Buat klien untuk enkripsi sisi klien.
$eclient = new Oss\EncryptionClient(client: $client, masterCipher: $masterCipher);

// Buat objek PutObjectRequest untuk unggahan sederhana.
$putObjRequest = new Oss\Models\PutObjectRequest(bucket: $bucket, key: $key);

// Gunakan metode putObject untuk mengunggah file lokal.
$putObjResult = $eclient->putObject(request: $putObjRequest);

// Tampilkan hasil yang dikembalikan.
printf(
    'status kode put object:' . $putObjResult->statusCode . PHP_EOL . // Kode status HTTP yang dikembalikan.
    'request id:' . $putObjResult->requestId . PHP_EOL // ID permintaan, yang merupakan pengenal unik permintaan.
);

Menggunakan CMK berbasis RSA untuk mengenkripsi objek dalam unggahan multipart

Berikut adalah contoh kode yang menunjukkan cara menggunakan CMK berbasis RSA untuk mengenkripsi objek dalam unggahan multipart:

<?php

// Masukkan file autoload untuk memuat pustaka dependen.
require_once __DIR__ . '/../vendor/autoload.php';

use AlibabaCloud\Oss\V2 as Oss;

// Tentukan kunci publik RSA untuk operasi enkripsi data.
const RSA_PUBLIC_KEY = <<<BBB
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCokfiAVXXf5ImFzKDw+XO/UByW
6mse2QsIgz3ZwBtMNu59fR5zttSx+8fB7vR4CN3bTztrP9A6bjoN0FFnhlQ3vNJC
5MFO1PByrE/MNd5AAfSVba93I6sx8NSk5MzUCA4NJzAUqYOEWGtGBcom6kEF6MmR
1EKib1Id8hpooY5xaQIDAQAB
-----END PUBLIC KEY-----
BBB;

// Tentukan kunci privat RSA untuk operasi dekripsi data.
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;

// Tentukan deskripsi untuk parameter baris perintah.
$optsdesc = [
    "region" => ['help' => Wilayah tempat bucket berada.', 'required' => True], // (Diperlukan) Tentukan wilayah tempat bucket berada.
    "endpoint" => ['help' => Nama domain yang dapat digunakan layanan lain untuk mengakses OSS', 'required' => False], // (Opsional) Tentukan titik akhir yang dapat digunakan oleh layanan lain untuk mengakses OSS.
    "bucket" => ['help' => Nama bucket', 'required' => True], // (Diperlukan) Tentukan nama bucket.
    "key" => ['help' => Nama objek', 'required' => True], // (Diperlukan) Tentukan nama objek.
];

// Hasilkan daftar opsi panjang untuk mem-parsing parameter baris perintah.
$longopts = \array_map(function ($key) {
    return "$key:"; // Tambahkan titik dua (:) di akhir setiap parameter untuk menunjukkan bahwa nilai diperlukan.
}, array_keys($optsdesc));

// Parse parameter baris perintah.
$options = getopt("", $longopts); 

// Periksa apakah parameter yang diperlukan telah dikonfigurasi.
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help'];
        echo "Error: argumen berikut diperlukan: --$key, $help"; // Tunjukkan bahwa parameter yang diperlukan belum dikonfigurasi.
        exit(1); 
    }
}

// Dapatkan nilai parameter baris perintah.
$region = $options["region"]; // Wilayah tempat bucket berada.
$bucket = $options["bucket"]; // Nama bucket.
$key = $options["key"]; // Nama objek.

// Gunakan variabel lingkungan untuk memuat ID AccessKey dan Rahasia AccessKey.
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// Gunakan konfigurasi default dari SDK.
$cfg = Oss\Config::loadDefault();

// Tentukan penyedia kredensial.
$cfg->setCredentialsProvider($credentialsProvider);

// Tentukan wilayah.
$cfg->setRegion($region);

// Tentukan titik akhir jika titik akhir disediakan.
if (isset($options["endpoint"])) {
    $cfg->setEndpoint($options["endpoint"]);
}

// Buat instance OSSClient.
$client = new Oss\Client($cfg);

// Buat enkripsi CMK dan gunakan kunci publik RSA untuk enkripsi data dan kunci privat RSA untuk dekripsi data.
$masterCipher = new Oss\Crypto\MasterRsaCipher(
    RSA_PUBLIC_KEY, // Tentukan kunci publik RSA.
    RSA_PRIVATE_KEY, // Tentukan kunci privat RSA.
    ['tag' => 'value'] // Enkripsi tag tambahan.
);

// Buat klien untuk enkripsi sisi klien.
$eclient = new Oss\EncryptionClient($client, $masterCipher);

// Mulai permintaan unggahan multipart dan tentukan ukuran bagian dan ukuran total objek.
$initRequest = new Oss\Models\InitiateMultipartUploadRequest(bucket: $bucket, key: $key);
$initRequest-> cseDataSize=500 * 1024; // Setel ukuran total objek menjadi 500 KB.
$initRequest-> csePartSize=200 * 1024; // Setel ukuran setiap bagian menjadi 200 KB.

// Gunakan metode initiateMultipartUpload untuk memulai permintaan unggahan multipart.
$initResult = $eclient->initiateMultipartUpload(request: $initRequest);

// Buat objek UploadPartRequest untuk tugas unggahan multipart.
$uploadPartRequest = new Oss\Models\UploadPartRequest(bucket: $bucket, key: $key);

// Tentukan nama dan ukuran bagian file lokal sementara.
$bigFileName = "upload.tmp"; // Tentukan nama file lokal sementara.
$partSize=200 * 1024; // Setel ukuran setiap bagian menjadi 200 KB.

// Hasilkan file lokal sementara berukuran 500 KB untuk pengujian.
generateFile($bigFileName, 500 * 1024);

// Buka file lokal sementara dan baca kontennya.
$file = fopen(filename: $bigFileName, mode: 'r');

// Tentukan array yang digunakan untuk menyimpan informasi bagian.
$parts = array();

// Jika file lokal sementara berhasil dibuka, baca dan unggah bagian-bagiannya.
if ($file) {
    $i = 1; // Tentukan nomor bagian mulai dari 1.
    while (!feof(stream: $file)) {
        // Baca data sebuah bagian.
        $chunk = fread(stream: $file, length: $partSize);

        // Buat objek UploadPartRequest untuk tugas unggahan multipart dan tentukan nomor bagian dan ID unggahan.
        $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) // Konversi data bagian ke aliran.
        );

        // Enkripsi konteks.
        $uploadPartRequest->encryptionMultipartContext = $initResult->encryptionMultipartContext;

        // Gunakan metode uploadPart untuk mengunggah sebuah bagian.
        $partResult = $eclient->uploadPart($uploadPartRequest);

        // Buat objek UploadPart dan tambahkan ke array bagian.
        $part = new Oss\Models\UploadPart(
            partNumber: $i,
            etag: $partResult->etag, // Dapatkan ETag dari bagian tersebut.
        );
        array_push(array: $parts, values: $part);

        $i++; // Tentukan nomor bagian. Nomor bagian bertambah secara berurutan.
    }
    fclose(stream: $file); // Tutup file.
}

// Gunakan metode completeMultipartUpload untuk menggabungkan bagian-bagian menjadi objek lengkap.
$comResult = $eclient->completeMultipartUpload(
    request: new Oss\Models\CompleteMultipartUploadRequest(
        bucket: $bucket,
        key: $key,
        uploadId: $initResult->uploadId,
        acl: null,
        completeMultipartUpload: new Oss\Models\CompleteMultipartUpload(
            parts: $parts
        ),
    )
);

// Hapus file lokal sementara.
unlink($bigFileName);

// Tampilkan hasil yang dikembalikan.
printf(
    'kode status unggahan multipart lengkap:' . $comResult->statusCode . PHP_EOL . // Kode status HTTP yang dikembalikan.
    'ID permintaan unggahan multipart lengkap:' . $comResult->requestId . PHP_EOL . // ID permintaan, yang merupakan pengenal unik permintaan.
    hasil unggahan multipart lengkap:' . var_export($comResult, true) // Hasil tugas unggahan multipart.
);

// Buat file lokal berukuran tertentu untuk menguji unggahan multipart.
function generateFile($filename, $size)
{
    // Jika file sudah ada dan ukuran filenya memenuhi persyaratan, langsung dikembalikan.
    if (
        file_exists($filename) &&
        $size == sprintf('%u', filesize($filename))
    ) {
        return;
    }

    $part_size=32; // Setel ukuran blok data yang dapat ditulis klien ke OSS pada satu waktu menjadi 32 byte.
    $fp = fopen($filename, "w"); // Buka file dalam mode tulis.
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; // Tentukan set karakter.

    $charactersLength = strlen($characters); // Tentukan panjang set karakter.

    // Jika file berhasil dibuka, data ditulis dalam loop hingga ukuran data yang ditentukan diunggah.
    if ($fp) {
        while ($size > 0) {
            // Hitung ukuran data untuk operasi penulisan saat ini.
            if ($size < $part_size) {
                $write_size = $size;
            } else {
                $write_size = $part_size;
            }

            $size -= $write_size; // Perbarui ukuran yang tersisa untuk ditulis.

            // Pilih karakter secara acak dan ulangi pembuatan konten.
            $a = $characters[rand(0, $charactersLength - 1)];
            $content = str_repeat($a, $write_size);

            // Tulis konten ke file lokal.
            $flag = fwrite($fp, $content);
            if (!$flag) {
                break; // Keluar dari loop jika operasi penulisan gagal.
            }
        }
    }

    fclose($fp); // Tutup file lokal.
}

Menggunakan CMK kustom

Menggunakan CMK kustom untuk mengenkripsi objek dalam unggahan sederhana dan mendekripsi objek dalam unduhan sederhana

SDK menyediakan implementasi RSA default. Jika implementasi default tidak memenuhi kebutuhan Anda, Anda dapat menerapkan enkripsi dan dekripsi berdasarkan CMK kustom. Contoh kode berikut menggunakan CMK kustom dalam KMS 3.0 untuk mengenkripsi objek dalam unggahan sederhana dan mendekripsi objek dalam unduhan sederhana:

<?php
// Masukkan file autoload untuk memuat pustaka dependen.
require_once 'vendor/autoload.php';

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

// Tentukan deskripsi untuk parameter baris perintah.
$optsdesc = [
    "region" => ['help' => Wilayah tempat bucket berada.', 'required' => True], // (Diperlukan) Tentukan wilayah tempat bucket berada.
    "endpoint" => ['help' => Nama domain yang dapat digunakan layanan lain untuk mengakses OSS.', 'required' => False], // (Opsional) Tentukan titik akhir yang dapat digunakan oleh layanan lain untuk mengakses OSS.
    "bucket" => ['help' => Nama bucket', 'required' => True], // (Diperlukan) Tentukan nama bucket.
    "key" => ['help' => Nama objek', 'required' => True], // (Diperlukan) Tentukan nama objek.
];

// Hasilkan daftar opsi panjang untuk mem-parsing parameter baris perintah.
$longopts = \array_map(function ($key) {
    return "$key:"; // Tambahkan titik dua (:) di akhir setiap parameter untuk menunjukkan bahwa nilai diperlukan.
}, array_keys($optsdesc));

// Parse parameter baris perintah.
$options = getopt("", $longopts);

// Periksa apakah parameter yang diperlukan telah dikonfigurasi.
foreach ($optsdesc as $key => $value) {
    if ($value['required'] === True && empty($options[$key])) {
        $help = $value['help'];
        echo "Error: argumen berikut diperlukan: --$key, $help"; // Tunjukkan bahwa parameter yang diperlukan belum dikonfigurasi.
        exit(1);
    }
}

// Dapatkan nilai parameter baris perintah.
$region = $options["region"]; // Wilayah tempat bucket berada.
$bucket = $options["bucket"]; // Nama bucket.
$key = $options["key"]; // Nama objek.

// Gunakan variabel lingkungan untuk memuat ID AccessKey dan Rahasia AccessKey.
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();

// Tentukan kelas enkripsi dan dekripsi KMS untuk memanggil operasi MasterCipherInterface.
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;
    }

    // Tentukan metode enkripsi.
    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);
    }

    // Tentukan metode dekripsi.
    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);
    }

    // Dapatkan algoritma wrapping.
    public function getWrapAlgorithm(): string
    {
        return "KMS/ALICLOUD";
    }

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

/**
 * Buat klien SDK KMS khusus.
 * @return KmsClient
 */
function getDkmsGcsSdkClient()
{
    global $clientKeyFile, $password, $endpoint;
    // Buat konfigurasi untuk klien SDK KMS khusus.
    $config = new \AlibabaCloud\Dkms\Gcs\OpenApi\Models\Config();
    $config->protocol = 'https';
    $config->clientKeyFile = $clientKeyFile;
    $config->password = $password;
    $config->endpoint = $endpoint;
    // Verifikasi sertifikat.
    $config->caFilePath = 'path/to/caCert.pem';
    // Buat klien SDK KMS.
    return new \AlibabaCloud\Dkms\Gcs\Sdk\Client($config);
}

// Tentukan jalur file yang menyimpan kunci klien dari instans KMS.
$clientKeyFile = '<jalur file kunci klien Anda>';
// Tentukan kata sandi saat membuat file kunci klien.
$password = '<kata sandi klien dkms Anda>';
// Tentukan titik akhir dari instans KMS.
$endpoint = '<alamat layanan instans dkms Anda>';
// Tentukan ID kunci yang Anda buat di KMS.
$kmsKeyId = '<ID cmk Anda>';
// Tentukan algoritma enkripsi dan dekripsi.
$algorithm = '<algoritma enkripsi Anda>';

// Tentukan klien SDK KMS khusus.
$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' => 'informasi deskripsi kunci enkripsi kms Anda'];
$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 "data objek yang didapat: " . $data;

Referensi

  • Untuk informasi lebih lanjut tentang enkripsi sisi klien, lihat Enkripsi Sisi Klien.

  • Untuk contoh kode lengkap unggahan dan unduhan sederhana berdasarkan CMK berbasis RSA, kunjungi GitHub.