

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
<a name="s3-encryption-client"></a>

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. `S3EncryptionClientV3`mempertahankan dukungan untuk mendekripsi data yang dienkripsi menggunakan warisan. `S3EncryptionClient`

 AWS SDK untuk PHP Mengimplementasikan [enkripsi amplop](https://docs.aws.amazon.com/kms/latest/developerguide/workflow.html) dan menggunakan OpenSSL untuk mengenkripsi dan [mendekripsi](https://www.openssl.org/). Implementasinya dapat dioperasikan dengan yang [lain SDKs yang sesuai dengan dukungan fiturnya](https://docs.aws.amazon.com/general/latest/gr/aws_sdk_cryptography.html). Ini juga kompatibel dengan alur kerja [asinkron berbasis janji SDK](guide_promises.md).

## Panduan migrasi
<a name="migration-guide"></a>

[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](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/s3-encryption-migration-v1-v2-section.html).](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/s3-encryption-migration-v2-v3-section.html)

## Pengaturan
<a name="setup"></a>

Untuk memulai enkripsi sisi klien, Anda memerlukan yang berikut ini:
+ [Kunci AWS KMS enkripsi](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html) 
+ [Ember S3](https://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html) 

Sebelum menjalankan kode contoh apa pun, konfigurasikan AWS kredensil Anda. Lihat [Kredensial untuk AWS SDK untuk PHP Versi 3](guide_credentials.md).

## Enkripsi
<a name="encryption"></a>

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.
+  `@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.
+  `@CommitmentPolicy`adalah 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
<a name="decryption"></a>

Mengunduh dan mendekripsi objek memiliki lima parameter tambahan, dua di antaranya diperlukan, di atas parameter standar`GetObject`. 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\$1AND\$1LEGACY' juga memungkinkan objek yang dienkripsi dalam format yang kompatibel dengan V1 untuk didekripsi. Untuk mendukung migrasi, setel @ ke SecurityProfile 'V3\$1AND\$1LEGACY'. 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.
+   
** `@CommitmentPolicy`opsi 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
<a name="cipher-configuration"></a>

** `'Cipher'`(tali)**  
Metode cipher yang digunakan klien enkripsi saat mengenkripsi. Hanya 'gcm' yang didukung saat ini.

**penting**  
PHP [diperbarui dalam versi 7.1](http://php.net/manual/en/migration71.new-features.php) untuk menyertakan parameter tambahan yang diperlukan untuk [mengenkripsi dan mendekripsi](http://php.net/manual/en/function.openssl-encrypt.php) [menggunakan OpenSSL untuk enkripsi](http://php.net/manual/en/function.openssl-decrypt.php) 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\$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. `Aad`hanya 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
<a name="metadata-strategies"></a>

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` dan`Aws\S3\Crypto\InstructionFileMetadataStrategy`. `HeadersMetadataStrategy`digunakan 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
<a name="multipart-uploads"></a>

Melakukan unggahan multibagian dengan enkripsi sisi klien juga dimungkinkan. `Aws\S3\Crypto\S3EncryptionMultipartUploaderV3`Mempersiapkan aliran sumber untuk enkripsi sebelum mengunggah. Membuat satu mengambil pengalaman yang sama dengan menggunakan `Aws\S3\MultipartUploader` dan`Aws\S3\Crypto\S3EncryptionClientV3`. `S3EncryptionMultipartUploaderV3`Dapat menangani `'@MetadataStrategy'` opsi yang sama seperti`S3EncryptionClientV3`, 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.