

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

# Migrasi Anda AWS Encryption SDK
<a name="migration"></a>

 AWS Encryption SDK Mendukung beberapa [implementasi bahasa pemrograman](programming-languages.md) interoperable, yang masing-masing dikembangkan dalam repositori open-source pada. GitHub Sebagai [praktik terbaik](best-practices.md), kami menyarankan Anda menggunakan versi terbaru AWS Encryption SDK untuk setiap bahasa. 

Anda dapat meng-upgrade dengan aman dari versi 2.0. *x* atau yang lebih baru AWS Encryption SDK ke versi terbaru. Namun, 2.0. versi *x* AWS Encryption SDK memperkenalkan fitur keamanan baru yang signifikan, beberapa di antaranya melanggar perubahan. Untuk meng-upgrade dari versi lebih awal dari 1.7. *x* ke versi 2.0. *x* dan yang lebih baru, Anda harus terlebih dahulu meningkatkan ke yang terbaru 1. versi *x*. Topik di bagian ini dirancang untuk membantu Anda memahami perubahan, memilih versi yang benar untuk aplikasi Anda, dan bermigrasi dengan aman dan berhasil ke versi terbaru. AWS Encryption SDK

Untuk informasi tentang versi signifikan dari AWS Encryption SDK, lihat[Versi dari AWS Encryption SDK](about-versions.md).

**penting**  
Jangan meng-upgrade langsung dari versi yang lebih awal dari 1.7. *x* ke versi 2.0. *x* atau yang lebih baru tanpa terlebih dahulu meningkatkan ke yang terbaru 1. versi *x*. Jika Anda meng-upgrade langsung ke versi 2.0. *x* atau yang lebih baru dan mengaktifkan semua fitur baru dengan segera, tidak AWS Encryption SDK akan dapat mendekripsi ciphertext yang dienkripsi di bawah versi yang lebih lama. AWS Encryption SDK

**catatan**  
Versi paling awal AWS Encryption SDK untuk .NET adalah versi 3.0. *x*. Semua versi AWS Encryption SDK untuk .NET mendukung praktik terbaik keamanan yang diperkenalkan di 2.0. *x* dari AWS Encryption SDK. Anda dapat dengan aman meningkatkan ke versi terbaru tanpa kode atau perubahan data.  
AWS Enkripsi CLI: Saat membaca panduan migrasi ini, gunakan 1.7. *x* instruksi migrasi untuk AWS Enkripsi CLI 1.8. *x* dan gunakan 2.0. *x* instruksi migrasi untuk AWS Enkripsi CLI 2.1. *x*. Lihat perinciannya di [Versi CLI AWS Enkripsi](crypto-cli-versions.md).  
Fitur keamanan baru awalnya dirilis dalam AWS Enkripsi CLI versi 1.7. *x* dan 2.0. *x*. Namun, AWS Enkripsi CLI versi 1.8. *x* menggantikan versi 1.7. *x* dan AWS Enkripsi CLI 2.1. *x* menggantikan 2.0. *x*. Untuk detailnya, lihat [penasihat keamanan](https://github.com/aws/aws-encryption-sdk-cli/security/advisories/GHSA-2xwp-m7mq-7q3r) yang relevan di [aws-encryption-sdk-cli](https://github.com/aws/aws-encryption-sdk-cli/)repositori di. GitHub

**Pengguna baru**  
Jika Anda baru mengenal AWS Encryption SDK, instal versi terbaru AWS Encryption SDK untuk bahasa pemrograman Anda. Nilai default memungkinkan semua fitur keamanan AWS Encryption SDK, termasuk enkripsi dengan penandatanganan, derivasi [kunci, dan komitmen utama](concepts.md#key-commitment). AWS Encryption SDK

**Pengguna saat ini**  
Kami menyarankan Anda meningkatkan dari versi Anda saat ini ke versi terbaru yang tersedia sesegera mungkin. Semua 1. *x* versi AWS Encryption SDK berada dalam [end-of-support fase](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#version-life-cycle), seperti versi yang lebih baru dalam beberapa bahasa pemrograman. Untuk detail tentang status dukungan dan pemeliharaan AWS Encryption SDK dalam bahasa pemrograman Anda, lihat[Support dan pemeliharaan](introduction.md#support).  
AWS Encryption SDK versi 2.0. *x* dan yang lebih baru menyediakan fitur keamanan baru untuk membantu melindungi data Anda. Namun, AWS Encryption SDK versi 2.0. *x* termasuk melanggar perubahan yang tidak kompatibel ke belakang. Untuk memastikan transisi yang aman, mulailah dengan bermigrasi dari versi Anda saat ini ke versi terbaru 1. *x* dalam bahasa pemrograman Anda. Ketika terbaru Anda 1. versi *x* sepenuhnya digunakan dan beroperasi dengan sukses, Anda dapat dengan aman bermigrasi ke versi 2.0. *x* dan kemudian. [Proses dua langkah](migration-guide.md) ini sangat penting terutama untuk aplikasi terdistribusi.

*Untuk informasi selengkapnya tentang fitur AWS Encryption SDK keamanan yang mendasari perubahan ini, lihat [Peningkatan enkripsi sisi klien: Komitmen eksplisit KeyIds dan kunci](https://aws.amazon.com/blogs/security/improved-client-side-encryption-explicit-keyids-and-key-commitment/) di Blog Keamanan.AWS *

Mencari bantuan dengan menggunakan AWS Encryption SDK for Java dengan AWS SDK for Java 2.x? Lihat [Prasyarat](java.md#java-prerequisites).

**Topics**
+ [Cara memigrasi dan menyebarkan AWS Encryption SDK](migration-guide.md)
+ [Memperbarui penyedia kunci AWS KMS utama](migrate-mkps-v2.md)
+ [Memperbarui AWS KMS keyrings](migrate-keyrings-v2.md)
+ [Menetapkan kebijakan komitmen Anda](migrate-commitment-policy.md)
+ [Memecahkan masalah migrasi ke versi terbaru](troubleshooting-migration.md)

# Cara memigrasi dan menyebarkan AWS Encryption SDK
<a name="migration-guide"></a>

Saat bermigrasi dari AWS Encryption SDK versi lebih awal dari 1.7. *x* ke versi 2.0. *x* atau yang lebih baru, Anda harus bertransisi dengan aman ke enkripsi dengan komitmen [utama](concepts.md#key-commitment). Jika tidak, aplikasi Anda akan menemukan ciphertext yang tidak dapat didekripsi. Jika Anda menggunakan penyedia kunci AWS KMS master, Anda harus memperbarui ke konstruktor baru yang membuat penyedia kunci master dalam mode ketat atau mode penemuan.

**catatan**  
Topik ini dirancang untuk pengguna yang bermigrasi dari versi sebelumnya AWS Encryption SDK ke versi 2.0. *x* atau yang lebih baru. Jika Anda baru mengenal AWS Encryption SDK, Anda dapat mulai menggunakan versi terbaru yang tersedia segera dengan pengaturan default.

Untuk menghindari situasi kritis di mana Anda tidak dapat mendekripsi ciphertext yang perlu Anda baca, sebaiknya Anda bermigrasi dan menerapkan dalam beberapa tahap berbeda. Verifikasi bahwa setiap tahap selesai dan sepenuhnya digunakan sebelum memulai tahap berikutnya. Ini sangat penting untuk aplikasi terdistribusi dengan banyak host.

## Tahap 1: Perbarui aplikasi Anda ke yang terbaru 1. versi *x*
<a name="migrate-stage1"></a>

Perbarui ke yang terbaru 1. versi *x* untuk bahasa pemrograman Anda. Uji dengan seksama, terapkan perubahan Anda, dan konfirmasikan bahwa pembaruan telah disebarkan ke semua host tujuan sebelum memulai tahap 2.

**penting**  
Verifikasi bahwa terbaru Anda 1. Versi *x* adalah versi 1.7. *x* atau yang lebih baru AWS Encryption SDK.

Yang terbaru 1. versi *x* AWS Encryption SDK kompatibel dengan versi lama AWS Encryption SDK dan maju yang kompatibel dengan versi 2.0. *x* dan kemudian. Mereka termasuk fitur-fitur baru yang hadir di versi 2.0. *x*, tetapi sertakan default aman yang dirancang untuk migrasi ini. Mereka memungkinkan Anda untuk meng-upgrade penyedia kunci AWS KMS master Anda, jika perlu, dan untuk sepenuhnya menyebarkan dengan suite algoritma yang dapat mendekripsi ciphertext dengan komitmen utama.
+ Ganti elemen usang, termasuk konstruktor untuk penyedia kunci master lama AWS KMS . Dengan [Python](https://docs.python.org/3/library/warnings.html), pastikan untuk mengaktifkan peringatan penghentian. Elemen kode yang tidak digunakan lagi di 1 terbaru. versi *x* dihapus dari versi 2.0. *x* dan kemudian. 
+ Tetapkan kebijakan komitmen Anda secara eksplisit. `ForbidEncryptAllowDecrypt` Meskipun ini adalah satu-satunya nilai yang valid di 1 terbaru. *x* versi, pengaturan ini diperlukan saat Anda menggunakan yang APIs diperkenalkan dalam rilis ini. Ini mencegah aplikasi Anda menolak ciphertext yang dienkripsi tanpa komitmen utama saat Anda bermigrasi ke versi 2.0. *x* dan kemudian. Lihat perinciannya di [Menetapkan kebijakan komitmen Anda](migrate-commitment-policy.md).
+ Jika Anda menggunakan penyedia kunci AWS KMS master, Anda harus memperbarui penyedia kunci master lama Anda untuk menguasai penyedia kunci yang mendukung *mode ketat dan mode* *penemuan*. Pembaruan ini diperlukan untuk AWS Encryption SDK for Java, AWS Encryption SDK for Python, dan CLI AWS Enkripsi. Jika Anda menggunakan penyedia kunci utama dalam mode penemuan, sebaiknya Anda menerapkan filter penemuan yang membatasi kunci pembungkus yang digunakan untuk kunci tertentu Akun AWS. Pembaruan ini opsional, tetapi ini adalah [praktik terbaik](best-practices.md) yang kami rekomendasikan. Lihat perinciannya di [Memperbarui penyedia kunci AWS KMS utama](migrate-mkps-v2.md). 
+ Jika Anda menggunakan [cincin kunci AWS KMS penemuan](use-kms-keyring.md#kms-keyring-discovery), sebaiknya sertakan filter penemuan yang membatasi kunci pembungkus yang digunakan dalam dekripsi pada kunci tertentu. Akun AWS Pembaruan ini opsional, tetapi ini adalah [praktik terbaik](best-practices.md) yang kami rekomendasikan. Lihat perinciannya di [Memperbarui AWS KMS keyrings](migrate-keyrings-v2.md).

## Tahap 2: Perbarui aplikasi Anda ke versi terbaru
<a name="migrate-stage2"></a>

Setelah menerapkan yang terbaru 1. *x* versi berhasil untuk semua host, Anda dapat meng-upgrade ke versi 2.0. *x* dan kemudian. Versi 2.0. *x* termasuk melanggar perubahan untuk semua versi sebelumnya dari file AWS Encryption SDK. Namun, jika Anda membuat perubahan kode yang direkomendasikan di Tahap 1, Anda dapat menghindari kesalahan saat bermigrasi ke versi terbaru.

Sebelum Anda memperbarui ke versi terbaru, verifikasi bahwa kebijakan komitmen Anda diatur secara konsisten`ForbidEncryptAllowDecrypt`. Kemudian, tergantung pada konfigurasi data Anda, Anda dapat bermigrasi dengan kecepatan Anda sendiri ke `RequireEncryptAllowDecrypt` dan kemudian ke pengaturan default,`RequireEncryptRequireDecrypt`. Kami merekomendasikan serangkaian langkah transisi seperti pola berikut.

1. Mulailah dengan [kebijakan komitmen](migrate-commitment-policy.md) Anda yang ditetapkan`ForbidEncryptAllowDecrypt`. AWS Encryption SDK Dapat mendekripsi pesan dengan komitmen utama, tetapi belum mengenkripsi dengan komitmen utama.

1. Ketika Anda siap, perbarui kebijakan komitmen Anda untuk`RequireEncryptAllowDecrypt`. AWS Encryption SDK Mulai mengenkripsi data Anda dengan [komitmen utama](concepts.md#key-commitment). Itu dapat mendekripsi ciphertext dengan dan tanpa komitmen utama. 

   Sebelum memperbarui kebijakan komitmen Anda`RequireEncryptAllowDecrypt`, verifikasi bahwa kebijakan terbaru Anda 1. Versi *x* digunakan untuk semua host, termasuk host dari aplikasi apa pun yang mendekripsi ciphertext yang Anda hasilkan. Versi AWS Encryption SDK sebelumnya ke versi 1.7. *x* tidak dapat mendekripsi pesan yang dienkripsi dengan komitmen utama.

   Ini juga saat yang tepat untuk menambahkan metrik ke aplikasi Anda untuk mengukur apakah Anda masih memproses ciphertext tanpa komitmen utama. Ini akan membantu Anda menentukan kapan aman untuk memperbarui pengaturan kebijakan komitmen Anda`RequireEncryptRequireDecrypt`. Untuk beberapa aplikasi, seperti yang mengenkripsi pesan dalam antrian Amazon SQS, ini mungkin berarti menunggu cukup lama sehingga semua ciphertext yang dienkripsi di bawah versi lama telah dienkripsi ulang atau dihapus. Untuk aplikasi lain, seperti objek S3 terenkripsi, Anda mungkin perlu mengunduh, mengenkripsi ulang, dan mengunggah ulang semua objek.

1. Ketika Anda yakin bahwa Anda tidak memiliki pesan yang dienkripsi tanpa komitmen utama, Anda dapat memperbarui kebijakan komitmen Anda. `RequireEncryptRequireDecrypt` Nilai ini memastikan bahwa data Anda selalu dienkripsi dan didekripsi dengan komitmen utama. Pengaturan ini adalah default, jadi Anda tidak diharuskan untuk mengaturnya secara eksplisit, tetapi kami merekomendasikannya. Pengaturan eksplisit akan [membantu debugging](troubleshooting-migration.md) dan potensi rollback yang mungkin diperlukan jika aplikasi Anda menemukan ciphertext yang dienkripsi tanpa komitmen utama. 

# Memperbarui penyedia kunci AWS KMS utama
<a name="migrate-mkps-v2"></a>

Untuk bermigrasi ke yang terbaru 1. *x* versi AWS Encryption SDK, dan kemudian ke versi 2.0. *x* *atau yang lebih baru, Anda harus mengganti penyedia kunci AWS KMS master lama dengan penyedia kunci master yang dibuat secara eksplisit dalam [*mode ketat atau mode penemuan*](about-versions.md#changes-to-mkps).* Penyedia kunci master lama tidak digunakan lagi di versi 1.7. *x* dan dihapus dalam versi 2.0. *x*. Perubahan ini diperlukan untuk aplikasi dan skrip yang menggunakan [AWS Encryption SDK for Java](java.md), [AWS Encryption SDK for Python](python.md), dan [CLI AWS Enkripsi](crypto-cli.md). Contoh di bagian ini akan menunjukkan cara memperbarui kode Anda. 

**catatan**  
Dengan Python, [aktifkan peringatan penghentian](https://docs.python.org/3/library/warnings.html). Ini akan membantu Anda mengidentifikasi bagian-bagian kode Anda yang perlu Anda perbarui.

Jika Anda menggunakan kunci AWS KMS master (bukan penyedia kunci master), Anda dapat melewati langkah ini. AWS KMS kunci master tidak digunakan lagi atau dihapus. Mereka mengenkripsi dan mendekripsi hanya dengan kunci pembungkus yang Anda tentukan.

Contoh di bagian ini berfokus pada elemen kode Anda yang perlu Anda ubah. Untuk contoh lengkap kode yang diperbarui, lihat bagian Contoh GitHub repositori untuk [bahasa pemrograman](programming-languages.md) Anda. Juga, contoh-contoh ini biasanya menggunakan kunci ARNs untuk mewakili AWS KMS keys. Saat Anda membuat penyedia kunci utama untuk mengenkripsi, Anda dapat menggunakan [pengidentifikasi AWS KMS kunci yang valid untuk mewakili](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id). AWS KMS key Saat Anda membuat penyedia kunci master untuk mendekripsi, Anda harus menggunakan ARN kunci.

**Pelajari lebih lanjut tentang migrasi**

Untuk semua AWS Encryption SDK pengguna, pelajari tentang menetapkan kebijakan komitmen Anda[Menetapkan kebijakan komitmen Anda](migrate-commitment-policy.md).

Untuk AWS Encryption SDK for C dan AWS Encryption SDK for JavaScript pengguna, pelajari tentang pembaruan opsional untuk keyrings di[Memperbarui AWS KMS keyrings](migrate-keyrings-v2.md).

**Topics**
+ [Migrasi ke mode ketat](#migrate-mkp-strict-mode)
+ [Migrasi ke mode penemuan](#migrate-mkp-discovery-mode)

## Migrasi ke mode ketat
<a name="migrate-mkp-strict-mode"></a>

Setelah memperbarui ke yang terbaru 1. *x* versi AWS Encryption SDK, ganti penyedia kunci master lama Anda dengan penyedia kunci master dalam mode ketat. Dalam mode ketat, Anda harus menentukan kunci pembungkus yang akan digunakan saat mengenkripsi dan mendekripsi. Hanya AWS Encryption SDK menggunakan tombol pembungkus yang Anda tentukan. Penyedia kunci master yang tidak digunakan lagi dapat mendekripsi data menggunakan data apa pun AWS KMS key yang mengenkripsi kunci data, termasuk di berbagai dan Wilayah. AWS KMS keys Akun AWS 

Penyedia kunci utama dalam mode ketat diperkenalkan dalam AWS Encryption SDK versi 1.7. *x*. Mereka menggantikan penyedia kunci master lama, yang tidak digunakan lagi di 1.7. *x* dan dihapus di 2.0. *x*. Menggunakan penyedia kunci master dalam mode ketat adalah [praktik AWS Encryption SDK terbaik](best-practices.md).

Kode berikut membuat penyedia kunci master dalam mode ketat yang dapat Anda gunakan untuk mengenkripsi dan mendekripsi. 

------
#### [ Java ]

Contoh ini mewakili kode dalam aplikasi yang menggunakan versi 1.6.2 atau sebelumnya. AWS Encryption SDK for Java

Kode ini menggunakan `KmsMasterKeyProvider.builder()` metode untuk membuat instance penyedia kunci AWS KMS master yang menggunakannya AWS KMS key sebagai kunci pembungkus. 

```
// Create a master key provider
// Replace the example key ARN with a valid one
String awsKmsKey = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab";

KmsMasterKeyProvider masterKeyProvider = KmsMasterKeyProvider.builder()
    .withKeysForEncryption(awsKmsKey)
    .build();
```

Contoh ini mewakili kode dalam aplikasi yang menggunakan versi 1.7. *x* atau yang lebih baru AWS Encryption SDK for Java . Untuk contoh lengkap, lihat [BasicEncryptionExample.java.](https://github.com/aws/aws-encryption-sdk-java/blob/master/src/examples/java/com/amazonaws/crypto/examples/v2/BasicEncryptionExample.java)

`Builder.withKeysForEncryption()`Metode `Builder.build()` dan yang digunakan dalam contoh sebelumnya tidak digunakan lagi di versi 1.7. *x* dan dihapus dari versi 2.0. *x*.

Untuk memperbarui ke penyedia kunci master mode ketat, kode ini menggantikan panggilan ke metode usang dengan panggilan ke metode baru. `Builder.buildStrict()` Contoh ini menentukan satu AWS KMS key sebagai kunci pembungkus, tetapi `Builder.buildStrict()` metode ini dapat mengambil daftar beberapa. AWS KMS keys

```
// Create a master key provider in strict mode
// Replace the example key ARN with a valid one from your Akun AWS.
String awsKmsKey = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab";

KmsMasterKeyProvider masterKeyProvider = KmsMasterKeyProvider.builder()
    .buildStrict(awsKmsKey);
```

------
#### [ Python ]

Contoh ini mewakili kode dalam aplikasi yang menggunakan versi 1.4.1 dari file. AWS Encryption SDK for Python Kode ini menggunakan`KMSMasterKeyProvider`, yang tidak digunakan lagi di versi 1.7. *x* dan dihapus dari versi 2.0. *x*. Saat mendekripsi, ia menggunakan apa pun AWS KMS key yang mengenkripsi kunci data tanpa memperhatikan yang Anda tentukan. AWS KMS keys 

Perhatikan bahwa `KMSMasterKey` tidak digunakan lagi atau dihapus. Saat mengenkripsi dan mendekripsi, hanya menggunakan yang Anda tentukan. AWS KMS key 

```
# Create a master key provider
# Replace the example key ARN with a valid one
key_1 = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
key_2 = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321"

aws_kms_master_key_provider = KMSMasterKeyProvider(
   key_ids=[key_1, key_2]
)
```

Contoh ini mewakili kode dalam aplikasi yang menggunakan versi 1.7. *x* dari AWS Encryption SDK for Python. Untuk contoh lengkap, lihat [basic\$1encryption.py](https://github.com/aws/aws-encryption-sdk-python/blob/master/examples/src/legacy/basic_encryption.py).

Untuk memperbarui ke penyedia kunci master mode ketat, kode ini menggantikan panggilan ke `KMSMasterKeyProvider()` dengan panggilan ke`StrictAwsKmsMasterKeyProvider()`. 

```
# Create a master key provider in strict mode
# Replace the example key ARNs with valid values from your Akun AWS
key_1 = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
key_2 = "arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321"

aws_kms_master_key_provider = StrictAwsKmsMasterKeyProvider(
    key_ids=[key_1, key_2]
)
```

------
#### [ AWS Encryption CLI ]

Contoh ini menunjukkan cara mengenkripsi dan mendekripsi menggunakan Enkripsi AWS CLI versi 1.1.7 atau sebelumnya.

Di versi 1.1.7 dan sebelumnya, saat mengenkripsi, Anda menentukan satu atau lebih kunci master (atau kunci *pembungkus*), seperti. AWS KMS key Saat mendekripsi, Anda tidak dapat menentukan kunci pembungkus apa pun kecuali Anda menggunakan penyedia kunci master khusus. CLI AWS Enkripsi dapat menggunakan kunci pembungkus apa pun yang mengenkripsi kunci data.

```
\\ Replace the example key ARN with a valid one
$ keyArn=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab

\\ Encrypt your plaintext data
$ aws-encryption-cli --encrypt \
                     --input hello.txt \
                     --master-keys key=$keyArn \
                     --metadata-output ~/metadata \
                     --encryption-context purpose=test \
                     --output .

\\ Decrypt your ciphertext               
$ aws-encryption-cli --decrypt \
                     --input hello.txt.encrypted \
                     --encryption-context purpose=test \
                     --metadata-output ~/metadata \
                     --output .
```

Contoh ini menunjukkan cara mengenkripsi dan mendekripsi menggunakan Enkripsi AWS CLI versi 1.7. *x* atau yang lebih baru. Untuk contoh lengkap, lihat[Contoh CLI AWS Enkripsi](crypto-cli-examples.md).

`--master-keys`Parameter ini tidak digunakan lagi di versi 1.7. *x* dan dihapus dalam versi 2.0. *x*. Ini diganti dengan `--wrapping-keys` parameter, yang diperlukan dalam perintah enkripsi dan dekripsi. Parameter ini mendukung mode ketat dan mode penemuan. Mode ketat adalah praktik AWS Encryption SDK terbaik yang memastikan bahwa Anda menggunakan kunci pembungkus yang Anda inginkan. 

Untuk meningkatkan ke *mode ketat*, gunakan atribut **kunci** `--wrapping-keys` parameter untuk menentukan kunci pembungkus saat mengenkripsi dan mendekripsi. 

```
\\ Replace the example key ARN with a valid value
$ keyArn=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab

\\ Encrypt your plaintext data
$ aws-encryption-cli --encrypt \
                     --input hello.txt \
                     --wrapping-keys key=$keyArn \
                     --metadata-output ~/metadata \
                     --encryption-context purpose=test \
                     --output .

\\ Decrypt your ciphertext               
$ aws-encryption-cli --decrypt \
                     --input hello.txt.encrypted \
                     --wrapping-keys key=$keyArn \
                     --encryption-context purpose=test \
                     --metadata-output ~/metadata \
                     --output .
```

------

## Migrasi ke mode penemuan
<a name="migrate-mkp-discovery-mode"></a>

Dimulai pada versi 1.7. *x*, ini adalah [praktik AWS Encryption SDK terbaik](best-practices.md) untuk menggunakan *mode ketat* untuk penyedia kunci AWS KMS master, yaitu menentukan kunci pembungkus saat mengenkripsi dan mendekripsi. Anda harus selalu menentukan kunci pembungkus saat mengenkripsi. Tetapi ada situasi di mana menentukan kunci ARNs AWS KMS keys untuk mendekripsi tidak praktis. Misalnya, jika Anda menggunakan alias untuk mengidentifikasi AWS KMS keys saat mengenkripsi, Anda kehilangan manfaat alias jika Anda harus mencantumkan kunci saat mendekripsi. ARNs Selain itu, karena penyedia kunci master dalam mode penemuan berperilaku seperti penyedia kunci master asli, Anda dapat menggunakannya sementara sebagai bagian dari strategi migrasi Anda, dan kemudian meningkatkan ke penyedia kunci master dalam mode ketat nanti.

Dalam kasus seperti ini, Anda dapat menggunakan penyedia kunci utama dalam *mode penemuan*. Penyedia kunci master ini tidak mengizinkan Anda menentukan kunci pembungkus, sehingga Anda tidak dapat menggunakannya untuk mengenkripsi. Saat mendekripsi, mereka dapat menggunakan kunci pembungkus apa pun yang mengenkripsi kunci data. Tetapi tidak seperti penyedia kunci master lama, yang berperilaku dengan cara yang sama, Anda membuatnya dalam mode penemuan secara eksplisit. Saat menggunakan penyedia kunci master dalam mode penemuan, Anda dapat membatasi kunci pembungkus yang dapat digunakan untuk yang khusus Akun AWS. Filter penemuan ini opsional, tetapi ini adalah praktik terbaik yang kami rekomendasikan. Untuk informasi tentang AWS partisi dan akun, lihat [Nama Sumber Daya Amazon](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arns-syntax) di bagian. *Referensi Umum AWS*

Contoh berikut membuat penyedia kunci AWS KMS master dalam mode ketat untuk mengenkripsi dan penyedia kunci AWS KMS master dalam mode penemuan untuk mendekripsi. Penyedia kunci master dalam mode penemuan menggunakan filter penemuan untuk membatasi kunci pembungkus yang digunakan untuk mendekripsi ke `aws` partisi dan contoh tertentu. Akun AWS Meskipun filter akun tidak diperlukan dalam contoh yang sangat sederhana ini, ini adalah praktik terbaik yang sangat bermanfaat ketika satu aplikasi mengenkripsi data dan aplikasi lain mendekripsi data.

------
#### [ Java ]

Contoh ini mewakili kode dalam aplikasi yang menggunakan versi 1.7. *x* atau yang lebih baru AWS Encryption SDK for Java. Untuk contoh lengkap, lihat [DiscoveryDecryptionExample.java.](https://github.com/aws/aws-encryption-sdk-java/blob/master/src/examples/java/com/amazonaws/crypto/examples/)

Untuk membuat instance penyedia kunci master dalam mode ketat untuk mengenkripsi, contoh ini menggunakan metode ini. `Builder.buildStrict()` Untuk membuat instance penyedia kunci master dalam mode penemuan untuk mendekripsi, ia menggunakan metode ini. `Builder.buildDiscovery()` `Builder.buildDiscovery()`Metode ini mengambil `DiscoveryFilter` yang membatasi AWS Encryption SDK ke AWS KMS keys dalam AWS partisi dan akun yang ditentukan. 

```
// Create a master key provider in strict mode for encrypting
// Replace the example alias ARN with a valid one from your Akun AWS.
String awsKmsKey = "arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias";

KmsMasterKeyProvider encryptingKeyProvider = KmsMasterKeyProvider.builder()
    .buildStrict(awsKmsKey);

// Create a master key provider in discovery mode for decrypting
// Replace the example account IDs with valid values.
DiscoveryFilter accounts = new DiscoveryFilter("aws", Arrays.asList("111122223333", "444455556666"));

KmsMasterKeyProvider decryptingKeyProvider = KmsMasterKeyProvider.builder()
    .buildDiscovery(accounts);
```

------
#### [ Python ]

 Contoh ini mewakili kode dalam aplikasi yang menggunakan versi 1.7. *x* atau yang lebih baru AWS Encryption SDK for Python . Untuk contoh lengkap, lihat [discovery\$1kms\$1provider.py](https://github.com/aws/aws-encryption-sdk-python/blob/master/examples/src/legacy/discovery_kms_provider.py).

Untuk membuat penyedia kunci master dalam mode ketat untuk mengenkripsi, contoh ini menggunakan. `StrictAwsKmsMasterKeyProvider` Untuk membuat penyedia kunci master dalam mode penemuan untuk mendekripsi, ia menggunakan `DiscoveryAwsKmsMasterKeyProvider` dengan a `DiscoveryFilter` yang membatasi AWS Encryption SDK ke AWS KMS keys dalam AWS partisi dan akun yang ditentukan. 

```
# Create a master key provider in strict mode
# Replace the example key ARN and alias ARNs with valid values from your Akun AWS.
key_1 = "arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias"
key_2 = "arn:aws:kms:us-west-2:444455556666:key/1a2b3c4d-5e6f-1a2b-3c4d-5e6f1a2b3c4d"

aws_kms_master_key_provider = StrictAwsKmsMasterKeyProvider(
    key_ids=[key_1, key_2]
)

# Create a master key provider in discovery mode for decrypting
# Replace the example account IDs with valid values
accounts = DiscoveryFilter(
    partition="aws",
    account_ids=["111122223333", "444455556666"]
)
aws_kms_master_key_provider = DiscoveryAwsKmsMasterKeyProvider(
        discovery_filter=accounts
)
```

------
#### [ AWS Encryption CLI ]

Contoh ini menunjukkan cara mengenkripsi dan mendekripsi menggunakan Enkripsi AWS CLI versi 1.7. *x* atau yang lebih baru. Dimulai pada versi 1.7. *x*, `--wrapping-keys` parameter diperlukan saat mengenkripsi dan mendekripsi. `--wrapping-keys`Parameter mendukung mode ketat dan mode penemuan. Untuk contoh lengkap, lihat[Contoh CLI AWS Enkripsi](crypto-cli-examples.md).

Saat mengenkripsi, contoh ini menentukan kunci pembungkus, yang diperlukan. Saat mendekripsi, secara eksplisit memilih *mode penemuan* dengan menggunakan `discovery` atribut `--wrapping-keys` parameter dengan nilai. `true` 

Untuk membatasi kunci pembungkus yang AWS Encryption SDK dapat digunakan dalam mode penemuan pada khususnya Akun AWS, contoh ini menggunakan `discovery-account` atribut `discovery-partition` dan `--wrapping-keys` parameter. Atribut opsional ini hanya valid ketika `discovery` atribut diatur ke`true`. Anda harus menggunakan `discovery-account` atribut `discovery-partition` dan bersama-sama; tidak ada yang valid sendirian.

```
\\ Replace the example key ARN with a valid value
$ keyAlias=arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias

\\ Encrypt your plaintext data
$ aws-encryption-cli --encrypt \
                     --input hello.txt \
                     --wrapping-keys key=$keyAlias \
                     --metadata-output ~/metadata \
                     --encryption-context purpose=test \
                     --output .

\\ Decrypt your ciphertext
\\ Replace the example account IDs with valid values           
$ aws-encryption-cli --decrypt \
                     --input hello.txt.encrypted \
                     --wrapping-keys discovery=true \
                                     discovery-partition=aws \
                                     discovery-account=111122223333 \
                                     discovery-account=444455556666 \
                     --encryption-context purpose=test \
                     --metadata-output ~/metadata \
                     --output .
```

------

# Memperbarui AWS KMS keyrings
<a name="migrate-keyrings-v2"></a>

 AWS KMS Gantungan kunci di [AWS Encryption SDK for C](c-language.md), [AWS Encryption SDK untuk .NET](dot-net.md), dan [AWS Encryption SDK for JavaScript](javascript.md)mendukung [praktik terbaik](best-practices.md) dengan memungkinkan Anda menentukan kunci pembungkus saat mengenkripsi dan mendekripsi. Jika Anda membuat [keyring AWS KMS penemuan](use-kms-keyring.md#kms-keyring-discovery), Anda melakukannya secara eksplisit. 

**catatan**  
Versi paling awal AWS Encryption SDK untuk .NET adalah versi 3.0. *x*. Semua versi AWS Encryption SDK untuk .NET mendukung praktik terbaik keamanan yang diperkenalkan di 2.0. *x* dari AWS Encryption SDK. Anda dapat dengan aman meningkatkan ke versi terbaru tanpa kode atau perubahan data.

Saat Anda memperbarui ke yang terbaru 1. *x* versi AWS Encryption SDK, Anda dapat menggunakan [filter penemuan](use-kms-keyring.md#kms-keyring-discovery) untuk membatasi kunci pembungkus yang digunakan oleh keyring [AWS KMS penemuan atau keyring](use-kms-keyring.md#kms-keyring-discovery) [penemuan AWS KMS regional saat mendekripsi ke kunci](use-kms-keyring.md#kms-keyring-regional) tertentu. Akun AWS Memfilter keyring penemuan adalah praktik AWS Encryption SDK [terbaik](best-practices.md).

Contoh di bagian ini akan menunjukkan cara menambahkan filter penemuan ke keyring penemuan AWS KMS regional.

**Pelajari lebih lanjut tentang migrasi**

Untuk semua AWS Encryption SDK pengguna, pelajari tentang menetapkan kebijakan komitmen Anda[Menetapkan kebijakan komitmen Anda](migrate-commitment-policy.md).

Untuk AWS Encryption SDK for Java, AWS Encryption SDK for Python, dan pengguna CLI AWS Enkripsi, pelajari tentang pembaruan yang diperlukan untuk menguasai penyedia kunci di. [Memperbarui penyedia kunci AWS KMS utama](migrate-mkps-v2.md)

 

Anda mungkin memiliki kode seperti berikut dalam aplikasi Anda. Contoh ini membuat keyring penemuan AWS KMS regional yang hanya dapat menggunakan kunci pembungkus di Wilayah AS Barat (Oregon) (us-west-2). Contoh ini mewakili kode dalam AWS Encryption SDK versi lebih awal dari 1.7. *x*. Namun, ini masih berlaku di versi 1.7. *x* dan kemudian. 

------
#### [ C ]

```
struct aws_cryptosdk_keyring *kms_regional_keyring = Aws::Cryptosdk::KmsKeyring::Builder()
       .WithKmsClient(create_kms_client(Aws::Region::US_WEST_2)).BuildDiscovery());
```

------
#### [ JavaScript Browser ]

```
const clientProvider = getClient(KMS, { credentials })

const discovery = true
const clientProvider = limitRegions(['us-west-2'], getKmsClient)
const keyring = new KmsKeyringBrowser({ clientProvider, discovery })
```

------
#### [ JavaScript Node.js ]

```
const discovery = true
const clientProvider = limitRegions(['us-west-2'], getKmsClient)
const keyring = new KmsKeyringNode({ clientProvider, discovery })
```

------

Dimulai pada versi 1.7. *x*, Anda dapat menambahkan filter penemuan ke keyring AWS KMS penemuan apa pun. Filter penemuan ini membatasi AWS KMS keys yang AWS Encryption SDK dapat digunakan untuk dekripsi ke partisi dan akun yang ditentukan. Sebelum menggunakan kode ini, ubah partisi, jika perlu, dan ganti akun contoh IDs dengan yang valid.

------
#### [ C ]

Untuk contoh lengkap, lihat [kms\$1discovery.cpp](https://github.com/aws/aws-encryption-sdk-c/blob/master/examples/kms_discovery.cpp).

```
std::shared_ptr<KmsKeyring::DiscoveryFilter> discovery_filter(
    KmsKeyring::DiscoveryFilter::Builder("aws")
        .AddAccount("111122223333")
        .AddAccount("444455556666")
        .Build());

struct aws_cryptosdk_keyring *kms_regional_keyring = Aws::Cryptosdk::KmsKeyring::Builder()
       .WithKmsClient(create_kms_client(Aws::Region::US_WEST_2)).BuildDiscovery(discovery_filter));
```

------
#### [ JavaScript Browser ]

```
const clientProvider = getClient(KMS, { credentials })

const discovery = true
const clientProvider = limitRegions(['us-west-2'], getKmsClient)
const keyring = new KmsKeyringBrowser(clientProvider, {
    discovery,
    discoveryFilter: { accountIDs: ['111122223333', '444455556666'], partition: 'aws' }
})
```

------
#### [ JavaScript Node.js ]

Untuk contoh lengkap, lihat [kms\$1filtered\$1discovery.ts](https://github.com/aws/aws-encryption-sdk-javascript/blob/master/modules/example-node/src/kms_filtered_discovery.ts).

```
const discovery = true
const clientProvider = limitRegions(['us-west-2'], getKmsClient)
const keyring = new KmsKeyringNode({
    clientProvider,
    discovery,
    discoveryFilter: { accountIDs: ['111122223333', '444455556666'], partition: 'aws' }
})
```

------

# Menetapkan kebijakan komitmen Anda
<a name="migrate-commitment-policy"></a>

[Komitmen utama](concepts.md#key-commitment) memastikan bahwa data terenkripsi Anda selalu didekripsi ke teks biasa yang sama. Untuk menyediakan properti keamanan ini, dimulai dari versi 1.7. *x*, AWS Encryption SDK menggunakan [suite algoritma](supported-algorithms.md) baru dengan komitmen utama. Untuk menentukan apakah data Anda dienkripsi dan didekripsi dengan komitmen utama, gunakan pengaturan konfigurasi kebijakan [komitmen](concepts.md#commitment-policy). [Mengenkripsi dan mendekripsi data dengan komitmen utama adalah praktik terbaik.AWS Encryption SDK](best-practices.md)

Menetapkan kebijakan komitmen adalah bagian penting dari langkah kedua dalam proses migrasi — migrasi dari yang terbaru 1. *x* versi AWS Encryption SDK ke versi 2.0. *x* dan kemudian. Setelah menetapkan dan mengubah kebijakan komitmen Anda, pastikan untuk menguji aplikasi Anda secara menyeluruh sebelum menerapkannya dalam produksi. Untuk panduan migrasi, lihat[Cara memigrasi dan menyebarkan AWS Encryption SDK](migration-guide.md).

Pengaturan kebijakan komitmen memiliki tiga nilai valid di versi 2.0. *x* dan kemudian. Yang terbaru 1. *x* versi (dimulai dengan versi 1.7. *x*), `ForbidEncryptAllowDecrypt` hanya valid.
+ `ForbidEncryptAllowDecrypt`— AWS Encryption SDK Tidak dapat mengenkripsi dengan komitmen utama. Ini dapat mendekripsi ciphertext yang dienkripsi dengan atau tanpa komitmen utama. 

  Yang terbaru 1. *x* versi, ini adalah satu-satunya nilai yang valid. Ini memastikan bahwa Anda tidak mengenkripsi dengan komitmen utama sampai Anda sepenuhnya siap untuk mendekripsi dengan komitmen utama. Menyetel nilai secara eksplisit mencegah kebijakan komitmen Anda berubah secara otomatis menjadi `require-encrypt-require-decrypt` saat Anda meningkatkan ke versi 2.0. *x* atau yang lebih baru. Sebagai gantinya, Anda dapat [memigrasikan kebijakan komitmen Anda](#migrate-commitment-policy) secara bertahap.
+ `RequireEncryptAllowDecrypt`— AWS Encryption SDK Selalu dienkripsi dengan komitmen utama. Ini dapat mendekripsi ciphertext yang dienkripsi dengan atau tanpa komitmen utama. Nilai ini ditambahkan dalam versi 2.0. *x*.
+ `RequireEncryptRequireDecrypt`— AWS Encryption SDK Selalu mengenkripsi dan mendekripsi dengan komitmen utama. Nilai ini ditambahkan dalam versi 2.0. *x*. Ini adalah nilai default dalam versi 2.0. *x* dan kemudian.

Yang terbaru 1. *x* versi, satu-satunya nilai kebijakan komitmen yang valid adalah`ForbidEncryptAllowDecrypt`. Setelah Anda bermigrasi ke versi 2.0. *x* atau lebih baru, Anda dapat [mengubah kebijakan komitmen Anda secara bertahap](migration-guide.md) saat Anda siap. Jangan perbarui kebijakan komitmen Anda `RequireEncryptRequireDecrypt` sampai Anda yakin bahwa Anda tidak memiliki pesan yang dienkripsi tanpa komitmen utama. 

Contoh-contoh ini menunjukkan kepada Anda cara menetapkan kebijakan komitmen Anda di 1 terbaru. *x* versi dan dalam versi 2.0. *x* dan kemudian. Tekniknya tergantung pada bahasa pemrograman Anda. 

**Pelajari lebih lanjut tentang migrasi**

Untuk AWS Encryption SDK for Java, AWS Encryption SDK for Python, dan CLI AWS Enkripsi, pelajari tentang perubahan yang diperlukan untuk menguasai penyedia kunci di. [Memperbarui penyedia kunci AWS KMS utama](migrate-mkps-v2.md)

Untuk AWS Encryption SDK for C dan AWS Encryption SDK for JavaScript, pelajari tentang pembaruan opsional untuk keyrings di[Memperbarui AWS KMS keyrings](migrate-keyrings-v2.md).

## Cara menetapkan kebijakan komitmen Anda
<a name="migrate-commitment-step1"></a>

Teknik yang Anda gunakan untuk menetapkan kebijakan komitmen Anda sedikit berbeda dengan setiap implementasi bahasa. Contoh-contoh ini menunjukkan kepada Anda bagaimana melakukannya. Sebelum mengubah kebijakan komitmen Anda, tinjau pendekatan multi-tahap di[Cara bermigrasi dan menyebarkan](migration-guide.md). 

------
#### [ C ]

Dimulai pada versi 1.7. *x* dari AWS Encryption SDK for C, Anda menggunakan `aws_cryptosdk_session_set_commitment_policy` fungsi untuk mengatur kebijakan komitmen pada sesi enkripsi dan dekripsi Anda. Kebijakan komitmen yang Anda tetapkan berlaku untuk semua operasi enkripsi dan dekripsi yang dipanggil pada sesi tersebut.

`aws_cryptosdk_session_new_from_cmm`Fungsi `aws_cryptosdk_session_new_from_keyring` dan tidak digunakan lagi di versi 1.7. *x* dan dihapus dalam versi 2.0. *x*. Fungsi-fungsi ini digantikan oleh `aws_cryptosdk_session_new_from_keyring_2` dan `aws_cryptosdk_session_new_from_cmm_2` fungsi yang mengembalikan sesi.

Saat Anda menggunakan `aws_cryptosdk_session_new_from_keyring_2` dan `aws_cryptosdk_session_new_from_cmm_2` yang terbaru 1. *x* versi, Anda diminta untuk memanggil `aws_cryptosdk_session_set_commitment_policy` fungsi dengan nilai kebijakan `COMMITMENT_POLICY_FORBID_ENCRYPT_ALLOW_DECRYPT` komitmen. Dalam versi 2.0. *x* dan yang lebih baru, memanggil fungsi ini adalah opsional dan dibutuhkan semua nilai yang valid. Kebijakan komitmen default untuk versi 2.0. *x* dan yang lebih `COMMITMENT_POLICY_REQUIRE_ENCRYPT_REQUIRE_DECRYPT` baru

Untuk contoh lengkap, lihat [string.cpp](https://github.com/aws/aws-encryption-sdk-c/blob/master/examples/string.cpp).

```
/* Load error strings for debugging */
aws_cryptosdk_load_error_strings();

/* Create an AWS KMS keyring */
const char * key_arn = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab";
struct aws_cryptosdk_keyring *kms_keyring = Aws::Cryptosdk::KmsKeyring::Builder().Build(key_arn);

/* Create an encrypt session with a CommitmentPolicy setting */
struct aws_cryptosdk_session *encrypt_session = aws_cryptosdk_session_new_from_keyring_2(
    alloc, AWS_CRYPTOSDK_ENCRYPT, kms_keyring);

aws_cryptosdk_keyring_release(kms_keyring);
aws_cryptosdk_session_set_commitment_policy(encrypt_session,
    COMMITMENT_POLICY_FORBID_ENCRYPT_ALLOW_DECRYPT);

...
/* Encrypt your data */

size_t plaintext_consumed_output;
aws_cryptosdk_session_process(encrypt_session,
                              ciphertext_output,
                              ciphertext_buf_sz_output,
                              ciphertext_len_output,
                              plaintext_input,
                              plaintext_len_input,
                              &plaintext_consumed_output)
...

/* Create a decrypt session with a CommitmentPolicy setting */

struct aws_cryptosdk_keyring *kms_keyring = Aws::Cryptosdk::KmsKeyring::Builder().Build(key_arn);
struct aws_cryptosdk_session *decrypt_session = *aws_cryptosdk_session_new_from_keyring_2(
        alloc, AWS_CRYPTOSDK_DECRYPT, kms_keyring);
aws_cryptosdk_keyring_release(kms_keyring);
aws_cryptosdk_session_set_commitment_policy(decrypt_session,
        COMMITMENT_POLICY_FORBID_ENCRYPT_ALLOW_DECRYPT);

/* Decrypt your ciphertext */
size_t ciphertext_consumed_output;
aws_cryptosdk_session_process(decrypt_session,
                              plaintext_output,
                              plaintext_buf_sz_output,
                              plaintext_len_output,
                              ciphertext_input,
                              ciphertext_len_input,
                              &ciphertext_consumed_output)
```

------
#### [ C\$1 / .NET ]

`require-encrypt-require-decrypt`Nilai adalah kebijakan komitmen default di semua versi AWS Encryption SDK untuk .NET. Anda dapat mengaturnya secara eksplisit sebagai praktik terbaik, tetapi itu tidak diperlukan. Namun, jika Anda menggunakan AWS Encryption SDK untuk.NET untuk mendekripsi ciphertext yang dienkripsi oleh implementasi bahasa lain dari komitmen AWS Encryption SDK tanpa kunci, Anda perlu mengubah nilai kebijakan komitmen menjadi atau. `REQUIRE_ENCRYPT_ALLOW_DECRYPT` `FORBID_ENCRYPT_ALLOW_DECRYPT` Jika tidak, upaya untuk mendekripsi ciphertext akan gagal.

Dalam AWS Encryption SDK untuk .NET, Anda menetapkan kebijakan komitmen pada instance AWS Encryption SDK. Buat instance `AwsEncryptionSdkConfig` objek dengan `CommitmentPolicy` parameter, dan gunakan objek konfigurasi untuk membuat instance. AWS Encryption SDK Kemudian, panggil `Encrypt()` dan `Decrypt()` metode dari AWS Encryption SDK instance yang dikonfigurasi. 

Contoh ini menetapkan kebijakan komitmen untuk`require-encrypt-allow-decrypt`.

```
// Instantiate the material providers
var materialProviders =
    AwsCryptographicMaterialProvidersFactory.CreateDefaultAwsCryptographicMaterialProviders();

// Configure the commitment policy on the AWS Encryption SDK instance
var config = new AwsEncryptionSdkConfig
{
    CommitmentPolicy = CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT
};
var encryptionSdk = AwsEncryptionSdkFactory.CreateAwsEncryptionSdk(config);

string keyArn = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab";

var encryptionContext = new Dictionary<string, string>()
{
    {"purpose", "test"}encryptionSdk
};

var createKeyringInput = new CreateAwsKmsKeyringInput
{
    KmsClient = new AmazonKeyManagementServiceClient(),
    KmsKeyId = keyArn
};
var keyring = materialProviders.CreateAwsKmsKeyring(createKeyringInput);

// Encrypt your plaintext data
var encryptInput = new EncryptInput
{
    Plaintext = plaintext,
    Keyring = keyring,
    EncryptionContext = encryptionContext
};
var encryptOutput = encryptionSdk.Encrypt(encryptInput);

// Decrypt your ciphertext
var decryptInput = new DecryptInput
{
    Ciphertext = ciphertext,
    Keyring = keyring
};
var decryptOutput = encryptionSdk.Decrypt(decryptInput);
```

------
#### [ AWS Encryption CLI ]

Untuk menetapkan kebijakan komitmen dalam CLI AWS Enkripsi, gunakan parameter. `--commitment-policy` Parameter ini diperkenalkan dalam versi 1.8. *x*. 

Yang terbaru 1. versi *x*, ketika Anda menggunakan `--wrapping-keys` parameter dalam `--decrypt` perintah `--encrypt` atau, `--commitment-policy` parameter dengan `forbid-encrypt-allow-decrypt` nilai diperlukan. Jika tidak, `--commitment-policy` parameternya tidak valid.

Dalam versi 2.1. *x* dan yang lebih baru, `--commitment-policy` parameternya opsional dan default ke `require-encrypt-require-decrypt` nilai, yang tidak akan mengenkripsi atau mendekripsi ciphertext apa pun yang dienkripsi tanpa komitmen kunci. Namun, kami menyarankan agar Anda menetapkan kebijakan komitmen secara eksplisit di semua panggilan enkripsi dan dekripsi untuk membantu pemeliharaan dan pemecahan masalah.

Contoh ini menetapkan kebijakan komitmen. Ini juga menggunakan `--wrapping-keys` parameter yang menggantikan `--master-keys` parameter yang dimulai pada versi 1.8. *x*. Lihat perinciannya di [Memperbarui penyedia kunci AWS KMS utama](migrate-mkps-v2.md). Untuk contoh lengkap, lihat[Contoh CLI AWS Enkripsi](crypto-cli-examples.md).

```
\\ To run this example, replace the fictitious key ARN with a valid value. 
$ keyArn=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab

\\ Encrypt your plaintext data - no change to algorithm suite used
$ aws-encryption-cli --encrypt \
                     --input hello.txt \
                     --wrapping-keys key=$keyArn \
                     --commitment-policy forbid-encrypt-allow-decrypt \
                     --metadata-output ~/metadata \
                     --encryption-context purpose=test \
                     --output .

\\ Decrypt your ciphertext - supports key commitment on 1.7 and later
$ aws-encryption-cli --decrypt \
                     --input hello.txt.encrypted \
                     --wrapping-keys key=$keyArn \
                     --commitment-policy forbid-encrypt-allow-decrypt \
                     --encryption-context purpose=test \
                     --metadata-output ~/metadata \
                     --output .
```

------
#### [ Java ]

Dimulai pada versi 1.7. *x* dari AWS Encryption SDK for Java, Anda menetapkan kebijakan komitmen pada instance Anda`AwsCrypto`, objek yang mewakili AWS Encryption SDK klien. Pengaturan kebijakan komitmen ini berlaku untuk semua operasi enkripsi dan dekripsi yang dipanggil pada klien tersebut.

`AwsCrypto()`Konstruktor tidak digunakan lagi di 1 terbaru. *x* versi AWS Encryption SDK for Java dan dihapus dalam versi 2.0. *x*. Ini digantikan oleh `Builder` kelas baru, `Builder.withCommitmentPolicy()` metode, dan tipe `CommitmentPolicy` enumerasi. 

Yang terbaru 1. *x* versi, `Builder` kelas membutuhkan `Builder.withCommitmentPolicy()` metode dan `CommitmentPolicy.ForbidEncryptAllowDecrypt` argumen. Dimulai pada versi 2.0. *x*, `Builder.withCommitmentPolicy()` metode ini opsional; nilai defaultnya adalah`CommitmentPolicy.RequireEncryptRequireDecrypt`.

Untuk contoh lengkap, lihat [SetCommitmentPolicyExample.java.](https://github.com/aws/aws-encryption-sdk-java/blob/master/src/examples/java/com/amazonaws/crypto/examples/v2/SetCommitmentPolicyExample.java)

```
// Instantiate the client
final AwsCrypto crypto = AwsCrypto.builder()
    .withCommitmentPolicy(CommitmentPolicy.ForbidEncryptAllowDecrypt)
    .build();

// Create a master key provider in strict mode
String awsKmsKey = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab";

KmsMasterKeyProvider masterKeyProvider = KmsMasterKeyProvider.builder()
    .buildStrict(awsKmsKey);

// Encrypt your plaintext data
CryptoResult<byte[], KmsMasterKey> encryptResult = crypto.encryptData(
    masterKeyProvider,
    sourcePlaintext,
    encryptionContext);
byte[] ciphertext = encryptResult.getResult();

// Decrypt your ciphertext
CryptoResult<byte[], KmsMasterKey> decryptResult = crypto.decryptData(
        masterKeyProvider,
        ciphertext);
byte[] decrypted = decryptResult.getResult();
```

------
#### [ JavaScript ]

Dimulai pada versi 1.7. *x* dari AWS Encryption SDK for JavaScript, Anda dapat mengatur kebijakan komitmen ketika Anda memanggil `buildClient` fungsi baru yang membuat instance AWS Encryption SDK klien. `buildClient`Fungsi ini mengambil nilai yang disebutkan yang mewakili kebijakan komitmen Anda. Ini mengembalikan `decrypt` fungsi yang diperbarui `encrypt` dan yang menegakkan kebijakan komitmen Anda saat Anda mengenkripsi dan mendekripsi.

Yang terbaru 1. *x* versi, `buildClient` fungsi membutuhkan `CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT` argumen. Dimulai pada versi 2.0. *x*, argumen kebijakan komitmen adalah opsional dan nilai defaultnya adalah`CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT`.

Kode untuk Node.js dan browser identik untuk tujuan ini, kecuali bahwa browser membutuhkan pernyataan untuk mengatur kredensialnya. 

Contoh berikut mengenkripsi data dengan keyring. AWS KMS `buildClient`Fungsi baru menetapkan kebijakan komitmen ke`FORBID_ENCRYPT_ALLOW_DECRYPT`, nilai default di 1 terbaru. *x* versin. Upgrade `encrypt` dan `decrypt` fungsi yang `buildClient` dikembalikan menegakkan kebijakan komitmen yang Anda tetapkan. 

```
import { buildClient } from '@aws-crypto/client-node'
const { encrypt, decrypt } = buildClient(CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT)

// Create an AWS KMS keyring
const generatorKeyId = 'arn:aws:kms:us-west-2:111122223333:alias/ExampleAlias'
const keyIds = ['arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab']
const keyring = new KmsKeyringNode({ generatorKeyId, keyIds })

// Encrypt your plaintext data
const { ciphertext } = await encrypt(keyring, plaintext, { encryptionContext: context })

// Decrypt your ciphertext
const { decrypted, messageHeader } = await decrypt(keyring, ciphertext)
```

------
#### [ Python ]

Dimulai pada versi 1.7. *x* dari AWS Encryption SDK for Python, Anda menetapkan kebijakan komitmen pada instance Anda`EncryptionSDKClient`, objek baru yang mewakili AWS Encryption SDK klien. Kebijakan komitmen yang Anda tetapkan berlaku untuk semua `encrypt` dan `decrypt` panggilan yang menggunakan instance klien tersebut.

Yang terbaru 1. *x* versi, `EncryptionSDKClient` konstruktor membutuhkan nilai yang `CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT` disebutkan. Dimulai pada versi 2.0. *x*, argumen kebijakan komitmen adalah opsional dan nilai defaultnya adalah`CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT`.

Contoh ini menggunakan `EncryptionSDKClient` konstruktor baru dan menetapkan kebijakan komitmen ke 1.7. *x* nilai default. Konstruktor membuat instance klien yang mewakili. AWS Encryption SDK Ketika Anda memanggil`encrypt`,`decrypt`, atau `stream` metode pada klien ini, mereka menegakkan kebijakan komitmen yang Anda tetapkan. Contoh ini juga menggunakan konstruktor baru untuk `StrictAwsKmsMasterKeyProvider` kelas, yang menentukan AWS KMS keys saat mengenkripsi dan mendekripsi. 

Untuk contoh lengkap, lihat [set\$1commitment.py](https://github.com/aws/aws-encryption-sdk-python/blob/master/examples/src/legacy/set_commitment.py).

```
# Instantiate the client
client = aws_encryption_sdk.EncryptionSDKClient(commitment_policy=CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT)

// Create a master key provider in strict mode
aws_kms_key = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
aws_kms_strict_master_key_provider = StrictAwsKmsMasterKeyProvider(
        key_ids=[aws_kms_key]
)

# Encrypt your plaintext data
ciphertext, encrypt_header = client.encrypt(
        source=source_plaintext,
        encryption_context=encryption_context,
        master_key_provider=aws_kms_strict_master_key_provider
)

# Decrypt your ciphertext
decrypted, decrypt_header = client.decrypt(
        source=ciphertext,
        master_key_provider=aws_kms_strict_master_key_provider
)
```

------
#### [ Rust ]

`require-encrypt-require-decrypt`Nilainya adalah kebijakan komitmen default di semua versi AWS Encryption SDK untuk Rust. Anda dapat mengaturnya secara eksplisit sebagai praktik terbaik, tetapi itu tidak diperlukan. Namun, jika Anda menggunakan AWS Encryption SDK for Rust untuk mendekripsi ciphertext yang dienkripsi oleh implementasi bahasa lain dari komitmen AWS Encryption SDK tanpa kunci, Anda perlu mengubah nilai kebijakan komitmen menjadi atau. `REQUIRE_ENCRYPT_ALLOW_DECRYPT` `FORBID_ENCRYPT_ALLOW_DECRYPT` Jika tidak, upaya untuk mendekripsi ciphertext akan gagal.

Dalam AWS Encryption SDK for Rust, Anda menetapkan kebijakan komitmen pada instance AWS Encryption SDK. Buat instance `AwsEncryptionSdkConfig` objek dengan `comitment_policy` parameter, dan gunakan objek konfigurasi untuk membuat instance. AWS Encryption SDK Kemudian, panggil `Encrypt()` dan `Decrypt()` metode dari AWS Encryption SDK instance yang dikonfigurasi. 

Contoh ini menetapkan kebijakan komitmen untuk`forbid-encrypt-allow-decrypt`.

```
// Configure the commitment policy on the AWS Encryption SDK instance
let esdk_config = AwsEncryptionSdkConfig::builder()
                    .commitment_policy(ForbidEncryptAllowDecrypt)
                    .build()?;
let esdk_client = esdk_client::Client::from_conf(esdk_config)?;

// Create an AWS KMS client
let sdk_config = aws_config::load_defaults(aws_config::BehaviorVersion::latest()).await;
let kms_client = aws_sdk_kms::Client::new(&sdk_config);

// Create your encryption context
let encryption_context = HashMap::from([
    ("encryption".to_string(), "context".to_string()),
    ("is not".to_string(), "secret".to_string()),
    ("but adds".to_string(), "useful metadata".to_string()),
    ("that can help you".to_string(), "be confident that".to_string()),
    ("the data you are handling".to_string(), "is what you think it is".to_string()),
]);

// Instantiate the material providers library
let mpl_config = MaterialProvidersConfig::builder().build()?;
let mpl = mpl_client::Client::from_conf(mpl_config)?;

// Create an AWS KMS keyring
let kms_keyring = mpl
    .create_aws_kms_keyring()
    .kms_key_id(kms_key_id)
    .kms_client(kms_client)
    .send()
    .await?;

// Encrypt your plaintext data
let plaintext = example_data.as_bytes();

let encryption_response = esdk_client.encrypt()
    .plaintext(plaintext)
    .keyring(kms_keyring.clone())
    .encryption_context(encryption_context.clone())
    .send()
    .await?;

// Decrypt your ciphertext
let decryption_response = esdk_client.decrypt()
    .ciphertext(ciphertext)
    .keyring(kms_keyring)
    // Provide the encryption context that was supplied to the encrypt method
    .encryption_context(encryption_context)
    .send()
    .await?;
```

------
#### [ Go ]

```
import (
    "context"
    
	mpl "aws/aws-cryptographic-material-providers-library/releases/go/mpl/awscryptographymaterialproviderssmithygenerated"
	mpltypes "aws/aws-cryptographic-material-providers-library/releases/go/mpl/awscryptographymaterialproviderssmithygeneratedtypes"
	client "github.com/aws/aws-encryption-sdk/awscryptographyencryptionsdksmithygenerated"
	esdktypes "github.com/aws/aws-encryption-sdk/awscryptographyencryptionsdksmithygeneratedtypes"
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/service/kms"
)

// Instantiate the AWS Encryption SDK client
commitPolicyForbidEncryptAllowDecrypt := mpltypes.ESDKCommitmentPolicyForbidEncryptAllowDecrypt
encryptionClient, err := client.NewClient(esdktypes.AwsEncryptionSdkConfig{CommitmentPolicy: &commitPolicyForbidEncryptAllowDecrypt})
if err != nil {
    panic(err)
}

// Create an AWS KMS client
cfg, err := config.LoadDefaultConfig(context.TODO())
if err != nil {
    panic(err)
}
kmsClient := kms.NewFromConfig(cfg, func(o *kms.Options) {
    o.Region = KmsKeyRegion
})

// Optional: Create an encryption context
encryptionContext := map[string]string{
    "encryption":                "context",
    "is not":                    "secret",
    "but adds":                  "useful metadata",
    "that can help you":         "be confident that",
    "the data you are handling": "is what you think it is",
}

// Instantiate the material providers library
matProv, err := mpl.NewClient(mpltypes.MaterialProvidersConfig{})
if err != nil {
    panic(err)
}

// Create an AWS KMS keyring
awsKmsKeyringInput := mpltypes.CreateAwsKmsKeyringInput{
    KmsClient: kmsClient,
    KmsKeyId:  kmsKeyId,
}
awsKmsKeyring, err := matProv.CreateAwsKmsKeyring(context.Background(), awsKmsKeyringInput)
if err != nil {
    panic(err)
}

// Encrypt your plaintext data
res, err := forbidEncryptClient.Encrypt(context.Background(), esdktypes.EncryptInput{
    Plaintext:         []byte(exampleText),
    EncryptionContext: encryptionContext,
    Keyring:           awsKmsKeyring,
})
if err != nil {
    panic(err)
}

// Decrypt your ciphertext
decryptOutput, err := forbidEncryptClient.Decrypt(context.Background(), esdktypes.DecryptInput{
    Ciphertext:        res.Ciphertext,
    EncryptionContext: encryptionContext,
    Keyring:           awsKmsKeyring,
})
if err != nil {
    panic(err)
}
```

------

# Memecahkan masalah migrasi ke versi terbaru
<a name="troubleshooting-migration"></a>

Sebelum memperbarui aplikasi Anda ke versi 2.0. *x* atau yang lebih baru AWS Encryption SDK, perbarui ke yang terbaru 1. *x* versi AWS Encryption SDK dan terapkan sepenuhnya. Itu akan membantu Anda menghindari sebagian besar kesalahan yang mungkin Anda temui saat memperbarui ke versi 2.0. *x* dan kemudian. Untuk panduan terperinci, termasuk contoh, lihat[Migrasi Anda AWS Encryption SDK](migration.md).

**penting**  
Verifikasi bahwa terbaru Anda 1. Versi *x* adalah versi 1.7. *x* atau yang lebih baru AWS Encryption SDK.

**catatan**  
**AWS Enkripsi CLI**: Referensi dalam panduan ini ke versi 1.7. *x* AWS Encryption SDK berlaku untuk versi 1.8. *x* dari CLI AWS Enkripsi. Referensi dalam panduan ini ke versi 2.0. *x* dari AWS Encryption SDK berlaku untuk 2.1. *x* dari CLI AWS Enkripsi.  
Fitur keamanan baru awalnya dirilis dalam AWS Enkripsi CLI versi 1.7. *x* dan 2.0. *x*. Namun, AWS Enkripsi CLI versi 1.8. *x* menggantikan versi 1.7. *x* dan AWS Enkripsi CLI 2.1. *x* menggantikan 2.0. *x*. Untuk detailnya, lihat [penasihat keamanan](https://github.com/aws/aws-encryption-sdk-cli/security/advisories/GHSA-2xwp-m7mq-7q3r) yang relevan di [aws-encryption-sdk-cli](https://github.com/aws/aws-encryption-sdk-cli/)repositori di. GitHub

Topik ini dirancang untuk membantu Anda mengenali dan mengatasi kesalahan paling umum yang mungkin Anda temui.

**Topics**
+ [Objek yang tidak digunakan lagi atau dihapus](#deprecated-removed)
+ [Konflik konfigurasi: Kebijakan komitmen dan rangkaian algoritme](#configuration-conflict_1)
+ [Konflik konfigurasi: Kebijakan komitmen dan ciphertext](#configuration-conflict_2)
+ [Validasi komitmen utama gagal](#commitment-failed)
+ [Kegagalan enkripsi lainnya](#encrypt-failed)
+ [Kegagalan dekripsi lainnya](#decrypt-failed)
+ [Pertimbangan rollback](#migration-rollback)

## Objek yang tidak digunakan lagi atau dihapus
<a name="deprecated-removed"></a>

Versi 2.0. *x* mencakup beberapa perubahan yang melanggar, termasuk menghapus konstruktor lama, metode, fungsi, dan kelas yang tidak digunakan lagi di versi 1.7. *x*. Untuk menghindari kesalahan kompiler, kesalahan impor, kesalahan sintaks, dan kesalahan simbol tidak ditemukan (tergantung pada bahasa pemrograman Anda), tingkatkan terlebih dahulu ke yang terbaru 1. *x* versi AWS Encryption SDK untuk bahasa pemrograman Anda. (Ini harus versi 1.7. *x* atau yang lebih baru.) Saat menggunakan yang terbaru 1. *x* versi, Anda dapat mulai menggunakan elemen pengganti sebelum simbol asli dihapus.

Jika Anda perlu meng-upgrade ke versi 2.0. *x* atau yang lebih baru segera, [konsultasikan changelog](about-versions.md) untuk bahasa pemrograman Anda, dan ganti simbol warisan dengan simbol yang direkomendasikan changelog.

## Konflik konfigurasi: Kebijakan komitmen dan rangkaian algoritme
<a name="configuration-conflict_1"></a>

Jika Anda menentukan rangkaian algoritme yang bertentangan dengan [kebijakan komitmen](concepts.md#commitment-policy) Anda, panggilan untuk mengenkripsi gagal dengan kesalahan *konflik Konfigurasi*.

Untuk menghindari jenis kesalahan ini, jangan tentukan rangkaian algoritme. Secara default, AWS Encryption SDK memilih algoritma paling aman yang kompatibel dengan kebijakan komitmen Anda. Namun, jika Anda harus menentukan rangkaian algoritme, seperti tanpa penandatanganan, pastikan untuk memilih rangkaian algoritme yang kompatibel dengan kebijakan komitmen Anda.


| Kebijakan komitmen | Suite algoritma yang kompatibel | 
| --- | --- | 
| ForbidEncryptAllowDecrypt | Setiap rangkaian algoritma *tanpa* komitmen utama, seperti:AES\$1256\$1GCM\$1IV12\$1TAG16\$1HKDF\$1SHA384\$1ECDSA\$1P384([03 78](algorithms-reference.md)) (dengan penandatanganan) `AES_256_GCM_IV12_TAG16_HKDF_SHA256`([01 78](algorithms-reference.md)) (tanpa penandatanganan) | 
| RequireEncryptAllowDecryptRequireEncryptRequireDecrypt | Setiap rangkaian algoritma *dengan* komitmen utama, seperti:AES\$1256\$1GCM\$1HKDF\$1SHA512\$1COMMIT\$1KEY\$1ECDSA\$1P384([05 78](algorithms-reference.md)) (dengan penandatanganan) `AES_256_GCM_HKDF_SHA512_COMMIT_KEY`([04 78](algorithms-reference.md)) (tanpa penandatanganan) | 

Jika Anda mengalami kesalahan ini ketika Anda belum menentukan rangkaian algoritme, rangkaian algoritme yang bertentangan mungkin telah dipilih oleh [pengelola bahan kriptografi](concepts.md#crypt-materials-manager) (CMM) Anda. CMM Default tidak akan memilih rangkaian algoritme yang bertentangan, tetapi CMM khusus mungkin. Untuk bantuan, lihat dokumentasi untuk CMM kustom Anda.

## Konflik konfigurasi: Kebijakan komitmen dan ciphertext
<a name="configuration-conflict_2"></a>

[Kebijakan `RequireEncryptRequireDecrypt` komitmen](concepts.md#commitment-policy) [tidak mengizinkan AWS Encryption SDK untuk mendekripsi pesan yang dienkripsi tanpa komitmen utama.](concepts.md#key-commitment) Jika Anda meminta AWS Encryption SDK untuk mendekripsi pesan tanpa komitmen kunci, ia mengembalikan kesalahan *konflik Konfigurasi*.

Untuk menghindari kesalahan ini, sebelum menetapkan kebijakan `RequireEncryptRequireDecrypt` komitmen, pastikan bahwa semua ciphertext yang dienkripsi tanpa komitmen utama didekripsi dan dienkripsi ulang dengan komitmen utama, atau ditangani oleh aplikasi yang berbeda. Jika Anda mengalami kesalahan ini, Anda dapat mengembalikan kesalahan untuk ciphertext yang bertentangan atau mengubah kebijakan komitmen Anda untuk sementara. `RequireEncryptAllowDecrypt`

Jika Anda mengalami kesalahan ini karena Anda meningkatkan ke versi 2.0. *x* atau lebih baru dari versi lebih awal dari 1.7. *x* tanpa upgrade terlebih dahulu ke yang terbaru 1. *x* versi (versi 1.7. *x* atau lebih baru), pertimbangkan untuk [memutar kembali](#migration-rollback) ke yang terbaru 1. *x* versi dan menyebarkan versi itu ke semua host sebelum memutakhirkan ke versi 2.0. *x* atau yang lebih baru. Untuk bantuan, lihat [Cara memigrasi dan menyebarkan AWS Encryption SDK](migration-guide.md).

## Validasi komitmen utama gagal
<a name="commitment-failed"></a>

Saat mendekripsi pesan yang dienkripsi dengan komitmen utama, Anda mungkin mendapatkan pesan galat gagal *validasi komitmen Kunci*. Ini menunjukkan bahwa panggilan dekripsi gagal karena kunci data dalam [pesan terenkripsi](concepts.md#DEK) tidak identik dengan kunci data unik untuk pesan tersebut. Dengan memvalidasi kunci data selama dekripsi, [komitmen kunci](concepts.md#key-commitment) melindungi Anda dari mendekripsi pesan yang mungkin menghasilkan lebih dari satu teks biasa. 

Kesalahan ini menunjukkan bahwa pesan terenkripsi yang Anda coba dekripsi tidak dikembalikan oleh. AWS Encryption SDK Ini mungkin pesan yang dibuat secara manual atau hasil dari korupsi data. Jika Anda mengalami kesalahan ini, aplikasi Anda dapat menolak pesan dan melanjutkan, atau berhenti memproses pesan baru.

## Kegagalan enkripsi lainnya
<a name="encrypt-failed"></a>

Enkripsi dapat gagal karena berbagai alasan. Anda tidak dapat menggunakan [keyring AWS KMS penemuan](use-kms-keyring.md#kms-keyring-discovery) atau [penyedia kunci utama dalam mode penemuan](migrate-mkps-v2.md) untuk mengenkripsi pesan. 

Pastikan Anda menentukan keyring atau penyedia kunci master dengan kunci pembungkus yang memiliki [izin untuk digunakan untuk enkripsi](use-kms-keyring.md#kms-keyring-permissions). Untuk bantuan terkait izin AWS KMS keys, lihat [Melihat kebijakan utama](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-viewing.html) dan [Menentukan akses ke AWS KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/determining-access.html) dalam *Panduan AWS Key Management Service Pengembang*.

## Kegagalan dekripsi lainnya
<a name="decrypt-failed"></a>

Jika upaya Anda untuk mendekripsi pesan terenkripsi gagal, itu berarti bahwa tidak AWS Encryption SDK dapat (atau tidak akan) mendekripsi salah satu kunci data terenkripsi dalam pesan. 

Jika Anda menggunakan keyring atau penyedia kunci master yang menentukan kunci pembungkus, hanya AWS Encryption SDK menggunakan kunci pembungkus yang Anda tentukan. Verifikasi bahwa Anda menggunakan kunci pembungkus yang Anda inginkan dan bahwa Anda memiliki `kms:Decrypt` izin pada setidaknya satu dari kunci pembungkus. Jika Anda menggunakan AWS KMS keys, sebagai fallback, Anda dapat mencoba mendekripsi pesan dengan [keyring AWS KMS penemuan](use-kms-keyring.md#kms-keyring-discovery) atau penyedia kunci [utama](migrate-mkps-v2.md) dalam mode penemuan. Jika operasi berhasil, sebelum mengembalikan plaintext, verifikasi bahwa kunci yang digunakan untuk mendekripsi pesan adalah kunci yang Anda percayai. 

## Pertimbangan rollback
<a name="migration-rollback"></a>

[Jika aplikasi Anda gagal mengenkripsi atau mendekripsi data, Anda biasanya dapat menyelesaikan masalah dengan memperbarui simbol kode, keyrings, penyedia kunci master, atau kebijakan komitmen.](concepts.md#commitment-policy) Namun, dalam beberapa kasus, Anda mungkin memutuskan bahwa yang terbaik adalah memutar kembali aplikasi Anda ke versi sebelumnya AWS Encryption SDK.

Jika Anda harus memutar kembali, lakukan dengan hati-hati. Versi AWS Encryption SDK sebelum 1.7. *x* [tidak dapat mendekripsi ciphertext yang dienkripsi dengan komitmen utama.](concepts.md#key-commitment)
+ Bergulir kembali dari yang terbaru 1. versi *x* ke versi sebelumnya AWS Encryption SDK umumnya aman. Anda mungkin harus membatalkan perubahan yang Anda buat pada kode Anda untuk menggunakan simbol dan objek yang tidak didukung di versi sebelumnya. 
+ Setelah Anda mulai mengenkripsi dengan komitmen utama (menetapkan kebijakan komitmen Anda`RequireEncryptAllowDecrypt`) di versi 2.0. *x* atau yang lebih baru, Anda dapat memutar kembali ke versi 1.7. *x*, tetapi tidak ke versi sebelumnya. Versi AWS Encryption SDK sebelum 1.7. *x* [tidak dapat mendekripsi ciphertext yang dienkripsi dengan komitmen utama.](concepts.md#key-commitment)

Jika Anda secara tidak sengaja mengaktifkan enkripsi dengan komitmen utama sebelum semua host dapat mendekripsi dengan komitmen utama, mungkin yang terbaik adalah melanjutkan peluncuran daripada memutar kembali. Jika pesan bersifat sementara atau dapat dijatuhkan dengan aman, maka Anda dapat mempertimbangkan rollback dengan hilangnya pesan. Jika rollback diperlukan, Anda dapat mempertimbangkan untuk menulis alat yang mendekripsi dan mengenkripsi ulang semua pesan.