Enkripsi sisi klien Amazon S3 di Versi 3 AWS SDK untuk PHP - AWS SDK untuk PHP

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Enkripsi sisi klien Amazon S3 di Versi 3 AWS SDK untuk PHP

Dengan enkripsi sisi klien, data dienkripsi dan didekripsi langsung di lingkungan Anda. Ini berarti bahwa data ini dienkripsi sebelum ditransfer ke Amazon S3, dan Anda tidak bergantung pada layanan eksternal untuk menangani enkripsi untuk Anda. Untuk implementasi baru, kami menyarankan penggunaan S3EncryptionClientV3 dan S3EncryptionMultipartUploaderV3 over the S3EncryptionClientV2 and and S3EncryptionClient deprecated S3EncryptionMultipartUploaderV2 and. S3EncryptionMultipartUploader Disarankan agar implementasi yang lebih lama masih menggunakan versi yang tidak digunakan lagi mencoba untuk bermigrasi. S3EncryptionClientV3mempertahankan dukungan untuk mendekripsi data yang dienkripsi menggunakan warisan. S3EncryptionClient

AWS SDK untuk PHP Mengimplementasikan enkripsi amplop dan menggunakan OpenSSL untuk mengenkripsi dan mendekripsi. Implementasinya dapat dioperasikan dengan yang lain SDKs yang sesuai dengan dukungan fiturnya. Ini juga kompatibel dengan alur kerja asinkron berbasis janji SDK.

Panduan migrasi

Bagi mereka yang mencoba bermigrasi dari klien yang tidak digunakan lagi ke klien baru, ada panduan migrasi untuk bermigrasi dari v1 ke v2 di sini dan panduan migrasi untuk beralih dari v2 ke v3 di sini.

Pengaturan

Untuk memulai enkripsi sisi klien, Anda memerlukan yang berikut ini:

Sebelum menjalankan kode contoh apa pun, konfigurasikan AWS kredensil Anda. Lihat Kredensial untuk AWS SDK untuk PHP Versi 3.

Enkripsi

Mengunggah objek terenkripsi S3EncryptionClientV3 membutuhkan empat parameter tambahan di atas parameter standar: PutObject

  • '@KmsEncryptionContext'adalah pasangan kunci-nilai yang dapat digunakan untuk menambahkan lapisan keamanan ekstra ke objek terenkripsi Anda. Klien enkripsi harus meneruskan kunci yang sama, yang secara otomatis akan dilakukan pada panggilan get. Jika tidak ada konteks tambahan yang diinginkan, teruskan dalam array kosong.

  • @CipherOptionsadalah konfigurasi tambahan untuk enkripsi termasuk sandi mana yang akan digunakan dan ukuran kunci.

  • @MaterialsProvideradalah penyedia yang menangani pembuatan kunci sandi dan vektor inisialisasi, serta mengenkripsi kunci sandi Anda.

  • @CommitmentPolicyadalah opsi kebijakan yang menentukan bagaimana suatu objek dibaca baik dengan komitmen kunci atau tanpa komitmen utama dan bagaimana suatu objek ditulis dengan komitmen utama atau tanpa komitmen utama.

use Aws\S3\S3Client; use Aws\S3\Crypto\S3EncryptionClientV3; use Aws\Kms\KmsClient; use Aws\Crypto\KmsMaterialsProviderV3; // Let's construct our S3EncryptionClient using an S3Client $encryptionClient = new S3EncryptionClientV3( new S3Client([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]) ); $kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV3( new KmsClient([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]), $kmsKeyId ); $bucket = 'the-bucket-name'; $key = 'the-file-name'; $cipherOptions = [ 'Cipher' => 'gcm', 'KeySize' => 256, // Additional configuration options ]; $result = $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT', '@KmsEncryptionContext' => ['context-key' => 'context-value'], 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]);
catatan

Selain Amazon S3 dan kesalahan layanan AWS KMS berbasis, Anda mungkin menerima InvalidArgumentException objek yang dilemparkan jika Anda tidak '@CipherOptions' dikonfigurasi dengan benar.

Dekripsi

Mengunduh dan mendekripsi objek memiliki lima parameter tambahan, dua di antaranya diperlukan, di atas parameter standarGetObject. Klien akan mendeteksi opsi sandi dasar untuk Anda.

  • '@SecurityProfile': Jika disetel ke 'V3', hanya objek yang dienkripsi dalam V3-kompatibel

    Format dapat didekripsi. Menyetel parameter ini ke 'V3_AND_LEGACY' juga memungkinkan objek yang dienkripsi dalam format yang kompatibel dengan V1 untuk didekripsi. Untuk mendukung migrasi, setel @ ke SecurityProfile 'V3_AND_LEGACY'. Gunakan 'V3' hanya untuk pengembangan aplikasi baru.

  • '@MaterialsProvider'adalah penyedia yang menangani pembuatan kunci sandi dan vektor inisialisasi, sebagai

    serta mengenkripsi kunci cipher Anda.

  • '@KmsAllowDecryptWithAnyCmk': (opsional) Menyetel parameter ini ke true memungkinkan dekripsi

    tanpa memasok id kunci KMS ke konstruktor file. MaterialsProvider Nilai default adalah false.

  • '@CipherOptions'(opsional) adalah konfigurasi tambahan untuk enkripsi termasuk

    cipher untuk digunakan dan keysize.

  • @CommitmentPolicyopsi kebijakan yang menentukan bagaimana suatu objek dibaca

    komitmen kunci atau tanpa komitmen utama dan bagaimana suatu objek ditulis dengan komitmen utama atau tanpa komitmen utama.

$result = $encryptionClient->getObject([ '@KmsAllowDecryptWithAnyCmk' => true, '@SecurityProfile' => 'V2_AND_LEGACY', '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_ALLOW_DECRYPT', '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);
catatan

Selain Amazon S3 dan kesalahan layanan AWS KMS berbasis, Anda mungkin menerima InvalidArgumentException objek yang dilemparkan jika Anda tidak '@CipherOptions' dikonfigurasi dengan benar.

Konfigurasi cipher

'Cipher'(tali)

Metode cipher yang digunakan klien enkripsi saat mengenkripsi. Hanya 'gcm' yang didukung saat ini.

penting

PHP diperbarui dalam versi 7.1 untuk menyertakan parameter tambahan yang diperlukan untuk mengenkripsi dan mendekripsi menggunakan OpenSSL untuk enkripsi GCM. Untuk PHP versi 7.0 dan sebelumnya, polyfill untuk dukungan GCM disediakan dan digunakan oleh klien enkripsi dan. S3EncryptionClientV2 S3EncryptionMultipartUploaderV2 Namun, kinerja untuk input besar akan jauh lebih lambat menggunakan polyfill daripada menggunakan implementasi asli untuk PHP 7.1+, sehingga meningkatkan lingkungan versi PHP yang lebih lama mungkin diperlukan untuk menggunakannya secara efektif.

'KeySize'(int)

Panjang kunci enkripsi konten yang akan dihasilkan untuk mengenkripsi. Default ke 256 bit. Opsi konfigurasi yang valid adalah 256 bit.

'Aad'(tali)

Opsional 'Data otentikasi tambahan' untuk disertakan dengan muatan terenkripsi Anda. Informasi ini divalidasi pada dekripsi. Aadhanya tersedia saat menggunakan cipher 'gcm'.

penting

Data otentikasi tambahan tidak didukung oleh semua AWS SDKs dan karena itu orang lain SDKs mungkin tidak dapat mendekripsi file yang dienkripsi menggunakan parameter ini.

Strategi metadata

Anda juga memiliki pilihan untuk menyediakan sebuah instance dari kelas yang mengimplementasikan. Aws\Crypto\MetadataStrategyInterface Antarmuka sederhana ini menangani penyimpanan dan pemuatan Aws\Crypto\MetadataEnvelope yang berisi materi enkripsi amplop Anda. SDK menyediakan dua kelas yang mengimplementasikan ini: Aws\S3\Crypto\HeadersMetadataStrategy danAws\S3\Crypto\InstructionFileMetadataStrategy. HeadersMetadataStrategydigunakan secara default.

$strategy = new InstructionFileMetadataStrategy( $s3Client ); $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@MetadataStrategy' => $strategy, '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT', '@KmsEncryptionContext' => [], '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]); $result = $encryptionClient->getObject([ '@KmsAllowDecryptWithAnyCmk' => false, '@MaterialsProvider' => $materialsProvider, '@SecurityProfile' => 'V3', '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT', '@MetadataStrategy' => $strategy, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);

Konstanta nama kelas untuk HeadersMetadataStrategy dan juga InstructionFileMetadataStrategy dapat diberikan dengan memanggil: :class.

$result = $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT', '@MetadataStrategy' => HeadersMetadataStrategy::class, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]);
catatan

Jika ada kegagalan setelah file instruksi diunggah, itu tidak akan dihapus secara otomatis.

Unggahan multipart

Melakukan unggahan multibagian dengan enkripsi sisi klien juga dimungkinkan. Aws\S3\Crypto\S3EncryptionMultipartUploaderV3Mempersiapkan aliran sumber untuk enkripsi sebelum mengunggah. Membuat satu mengambil pengalaman yang sama dengan menggunakan Aws\S3\MultipartUploader danAws\S3\Crypto\S3EncryptionClientV3. S3EncryptionMultipartUploaderV3Dapat menangani '@MetadataStrategy' opsi yang sama sepertiS3EncryptionClientV3, serta semua '@CipherOptions' konfigurasi yang tersedia.

$kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV3( new KmsClient([ 'region' => 'us-east-1', 'version' => 'latest', 'profile' => 'default', ]), $kmsKeyId ); $bucket = 'the-bucket-name'; $key = 'the-upload-key'; $cipherOptions = [ 'Cipher' => 'gcm' 'KeySize' => 256, // Additional configuration options ]; $multipartUploader = new S3EncryptionMultipartUploaderV3( new S3Client([ 'region' => 'us-east-1', 'version' => 'latest', 'profile' => 'default', ]), fopen('large-file-to-encrypt.txt', 'r'), [ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT', 'bucket' => $bucket, 'key' => $key, ] ); $multipartUploader->upload();
catatan

Selain Amazon S3 dan kesalahan layanan AWS KMS berbasis, Anda mungkin menerima InvalidArgumentException objek yang dilemparkan jika Anda tidak '@CipherOptions' dikonfigurasi dengan benar.