Enkripsi sisi klien Amazon S3 dengan Versi 3 AWS SDK for PHP - AWS SDK for 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 dengan Versi 3 AWS SDK for 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 S3EncryptionClientV2 dan S3EncryptionMultipartUploaderV2 lebih dari yang tidak digunakan lagi dan. S3EncryptionClient S3EncryptionMultipartUploader Disarankan agar implementasi yang lebih lama masih menggunakan versi yang tidak digunakan lagi mencoba bermigrasi. S3EncryptionClientV2mempertahankan dukungan untuk mendekripsi data yang dienkripsi menggunakan warisan. S3EncryptionClient

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

Panduan migrasi

Bagi mereka yang mencoba untuk bermigrasi dari klien usang ke klien baru, ada panduan migrasi yang dapat ditemukan 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 for PHP Versi 3.

Enkripsi

Mengunggah objek terenkripsi S3EncryptionClientV2 membutuhkan tiga 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.

use Aws\S3\S3Client; use Aws\S3\Crypto\S3EncryptionClientV2; use Aws\Kms\KmsClient; use Aws\Crypto\KmsMaterialsProviderV2; // Let's construct our S3EncryptionClient using an S3Client $encryptionClient = new S3EncryptionClientV2( new S3Client([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]) ); $kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV2( 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, '@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 empat parameter tambahan, dua di antaranya diperlukan, di atas parameter standarGetObject. Klien akan mendeteksi opsi sandi dasar untuk Anda.

  • '@SecurityProfile': Jika disetel ke 'V2', hanya objek yang dienkripsi dalam kompatibel dengan V2

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

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

    serta mengenkripsi kunci sandi 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 yang

    cipher untuk digunakan dan keysize.

$result = $encryptionClient->getObject([ '@KmsAllowDecryptWithAnyCmk' => true, '@SecurityProfile' => 'V2_AND_LEGACY', '@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 dan 128 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 SDK dan dengan demikian SDK lain 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, '@KmsEncryptionContext' => [], '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]); $result = $encryptionClient->getObject([ '@KmsAllowDecryptWithAnyCmk' => false, '@MaterialsProvider' => $materialsProvider, '@SecurityProfile' => 'V2', '@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, '@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\S3EncryptionMultipartUploaderV2Mempersiapkan aliran sumber untuk enkripsi sebelum mengunggah. Membuat satu mengambil pengalaman yang sama dengan menggunakan Aws\S3\MultipartUploader danAws\S3\Crypto\S3EncryptionClientV2. S3EncryptionMultipartUploaderV2Dapat menangani '@MetadataStrategy' opsi yang sama sepertiS3EncryptionClientV2, serta semua '@CipherOptions' konfigurasi yang tersedia.

$kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV2( 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 S3EncryptionMultipartUploaderV2( new S3Client([ 'region' => 'us-east-1', 'version' => 'latest', 'profile' => 'default', ]), fopen('large-file-to-encrypt.txt', 'r'), [ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, '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.