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. S3EncryptionClientV2
mempertahankan dukungan untuk mendekripsi data yang dienkripsi menggunakan warisan. S3EncryptionClient
AWS SDK for PHPMengimplementasikan enkripsi amplop dan menggunakan OpenSSL untuk mengenkripsi dan mendekripsi
Panduan migrasi
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. -
@CipherOptions
adalah konfigurasi tambahan untuk enkripsi termasuk sandi mana yang akan digunakan dan ukuran kunci. -
@MaterialsProvider
adalah 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.1S3EncryptionClientV2
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.
Aad
hanya 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
. HeadersMetadataStrategy
digunakan 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\S3EncryptionMultipartUploaderV2
Mempersiapkan aliran sumber untuk enkripsi sebelum mengunggah. Membuat satu mengambil pengalaman yang sama dengan menggunakan Aws\S3\MultipartUploader
danAws\S3\Crypto\S3EncryptionClientV2
. S3EncryptionMultipartUploaderV2
Dapat 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.