

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

# Apa itu AWS Encryption SDK?
<a name="introduction"></a>

 AWS Encryption SDK Ini adalah pustaka enkripsi sisi klien yang dirancang untuk memudahkan semua orang mengenkripsi dan mendekripsi data menggunakan standar industri dan praktik terbaik. Ini memungkinkan Anda untuk fokus pada fungsionalitas inti aplikasi Anda, bukan pada cara terbaik mengenkripsi dan mendekripsi data Anda. AWS Encryption SDK Ini disediakan secara gratis di bawah lisensi Apache 2.0.

 AWS Encryption SDK Jawaban pertanyaan-pertanyaan seperti berikut untuk Anda:
+ Algoritma enkripsi mana yang harus saya gunakan?
+ Bagaimana, atau dalam mode apa, saya harus menggunakan algoritma itu?
+ Bagaimana cara menghasilkan kunci enkripsi?
+ Bagaimana cara melindungi kunci enkripsi, dan di mana saya harus menyimpannya?
+ Bagaimana saya bisa membuat data terenkripsi saya portabel?
+ Bagaimana cara memastikan bahwa penerima yang dituju dapat membaca data terenkripsi saya?
+ Bagaimana saya bisa memastikan data terenkripsi saya tidak dimodifikasi antara waktu ditulis dan ketika dibaca?
+ Bagaimana cara menggunakan kunci data yang AWS KMS kembali?

Dengan AWS Encryption SDK, Anda menentukan [penyedia kunci master](concepts.md#master-key-provider) atau [keyring](concepts.md#keyring) yang menentukan kunci pembungkus yang Anda gunakan untuk melindungi data Anda. Kemudian Anda mengenkripsi dan mendekripsi data Anda menggunakan metode langsung yang disediakan oleh. AWS Encryption SDK Yang AWS Encryption SDK melakukan sisanya.

Tanpa itu AWS Encryption SDK, Anda mungkin menghabiskan lebih banyak upaya untuk membangun solusi enkripsi daripada fungsionalitas inti aplikasi Anda. AWS Encryption SDK Jawaban pertanyaan-pertanyaan ini dengan memberikan hal-hal berikut.

**Implementasi default yang mematuhi praktik terbaik kriptografi**  
Secara default, AWS Encryption SDK menghasilkan kunci data unik untuk setiap objek data yang dienkripsi. Ini mengikuti praktik terbaik kriptografi menggunakan kunci data unik untuk setiap operasi enkripsi.  
 AWS Encryption SDK Enkripsi data Anda menggunakan algoritma kunci simetris yang aman, terautentikasi. Untuk informasi selengkapnya, lihat [Suite algoritma yang didukung di AWS Encryption SDK](supported-algorithms.md).

**Kerangka kerja untuk melindungi kunci data dengan kunci pembungkus**  
Ini AWS Encryption SDK melindungi kunci data yang mengenkripsi data Anda dengan mengenkripsi mereka di bawah satu atau lebih kunci pembungkus. Dengan menyediakan kerangka kerja untuk mengenkripsi kunci data dengan lebih dari satu kunci pembungkus, AWS Encryption SDK membantu membuat data terenkripsi Anda portabel.   
Misalnya, mengenkripsi data di bawah kunci AWS KMS key masuk AWS KMS dan kunci dari HSM lokal Anda. Anda dapat menggunakan salah satu kunci pembungkus untuk mendekripsi data, jika salah satu tidak tersedia atau pemanggil tidak memiliki izin untuk menggunakan kedua kunci.

**Pesan diformat yang menyimpan kunci data terenkripsi dengan data terenkripsi**  
 AWS Encryption SDK Menyimpan data terenkripsi dan kunci data terenkripsi bersama-sama dalam [pesan terenkripsi yang menggunakan format data yang ditentukan](concepts.md#message). Ini berarti Anda tidak perlu melacak atau melindungi kunci data yang mengenkripsi data Anda karena AWS Encryption SDK melakukannya untuk Anda.

Beberapa implementasi bahasa AWS Encryption SDK memerlukan AWS SDK, tetapi AWS Encryption SDK tidak memerlukan Akun AWS dan tidak bergantung pada layanan apa pun AWS . Anda Akun AWS hanya perlu jika Anda memilih untuk menggunakan [AWS KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms-keys)untuk melindungi data Anda.

## Dikembangkan dalam repositori sumber terbuka
<a name="esdk-repos"></a>

 AWS Encryption SDK Ini dikembangkan dalam repositori sumber terbuka di. GitHub Anda dapat menggunakan repositori ini untuk melihat kode, membaca dan mengirimkan masalah, dan menemukan informasi yang spesifik untuk implementasi bahasa Anda.
+ AWS Encryption SDK for C — [aws-encryption-sdk-c](https://github.com/aws/aws-encryption-sdk-c/)
+ AWS Encryption SDK untuk [direktori.NET — .NET](https://github.com/aws/aws-encryption-sdk/tree/mainline/AwsEncryptionSDK/runtimes/net/) dari `aws-encryption-sdk` repositori.
+ AWS Enkripsi CLI — [aws-encryption-sdk-cli](https://github.com/aws/aws-encryption-sdk-cli/)
+ AWS Encryption SDK for Java — [aws-encryption-sdk-java](https://github.com/aws/aws-encryption-sdk-java/)
+ AWS Encryption SDK for JavaScript — [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/)
+ AWS Encryption SDK for Python — [aws-encryption-sdk-python](https://github.com/aws/aws-encryption-sdk-python/)
+ AWS Encryption SDK untuk direktori [Rust — Rust](https://github.com/aws/aws-encryption-sdk-dafny/tree/mainline/AwsEncryptionSDK/runtimes/rust/) dari `aws-encryption-sdk` repositori.
+ AWS Encryption SDK untuk direktori Go — [Go](https://github.com/aws/aws-encryption-sdk/tree/mainline/releases/go/encryption-sdk/) dari `aws-encryption-sdk` repositori

## Kompatibilitas dengan pustaka dan layanan enkripsi
<a name="intro-compatibility"></a>

 AWS Encryption SDK Ini didukung dalam beberapa [bahasa pemrograman](programming-languages.md). Semua implementasi bahasa dapat dioperasikan secara interoperable. Anda dapat mengenkripsi dengan satu implementasi bahasa dan mendekripsi dengan yang lain. Interoperabilitas mungkin tunduk pada kendala bahasa. Jika demikian, kendala ini dijelaskan dalam topik tentang implementasi bahasa. Selain itu, saat mengenkripsi dan mendekripsi, Anda harus menggunakan keyring yang kompatibel, atau kunci master dan penyedia kunci master. Lihat perinciannya di [Kompatibilitas keyring](choose-keyring.md#keyring-compatibility).

Namun, AWS Encryption SDK tidak dapat beroperasi dengan perpustakaan lain. Karena setiap pustaka mengembalikan data terenkripsi dalam format yang berbeda, Anda tidak dapat mengenkripsi dengan satu pustaka dan mendekripsi dengan yang lain.

**Klien Enkripsi DynamoDB dan enkripsi sisi klien Amazon S3**  <a name="ESDK-DDBEC"></a>
 AWS Encryption SDK [Tidak dapat mendekripsi data yang dienkripsi oleh Klien Enkripsi [DynamoDB atau enkripsi sisi klien](https://docs.aws.amazon.com/dynamodb-encryption-client/latest/devguide/) Amazon S3.](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryption.html) Pustaka ini tidak dapat mendekripsi pesan [terenkripsi](concepts.md#message) yang dikembalikan. AWS Encryption SDK  

**AWS Key Management Service (AWS KMS)**  <a name="ESDK-KMS"></a>
 AWS Encryption SDK Dapat menggunakan [AWS KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)dan [kunci data](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys) untuk melindungi data Anda, termasuk kunci KMS Multi-wilayah. Misalnya, Anda dapat mengonfigurasi AWS Encryption SDK untuk mengenkripsi data Anda di bawah satu atau lebih AWS KMS keys di file Anda Akun AWS. Namun, Anda harus menggunakan AWS Encryption SDK untuk mendekripsi data tersebut.   
 AWS Encryption SDK Tidak dapat mendekripsi ciphertext yang dikembalikan AWS KMS [Enkripsi](https://docs.aws.amazon.com/kms/latest/APIReference/API_Encrypt.html) atau operasi. [ReEncrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html) Demikian pula, operasi AWS KMS [Dekripsi](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) tidak dapat mendekripsi pesan [terenkripsi](concepts.md#message) yang dikembalikan. AWS Encryption SDK   
Hanya AWS Encryption SDK mendukung kunci [KMS enkripsi simetris](https://docs.aws.amazon.com/kms/latest/developerguide/symm-asymm-concepts.html#symmetric-cmks). Anda tidak dapat menggunakan [kunci KMS asimetris](https://docs.aws.amazon.com/kms/latest/developerguide/symm-asymm-concepts.html#asymmetric-cmks) untuk enkripsi atau masuk. AWS Encryption SDK Ini AWS Encryption SDK menghasilkan kunci penandatanganan ECDSA sendiri untuk [rangkaian algoritme](supported-algorithms.md) yang menandatangani pesan.

## Support dan pemeliharaan
<a name="support"></a>

 AWS Encryption SDK Menggunakan [kebijakan pemeliharaan](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html) yang sama dengan yang digunakan AWS SDK dan Tools, termasuk fase pembuatan versi dan siklus hidupnya. Sebagai [praktik terbaik](best-practices.md), kami menyarankan Anda menggunakan versi terbaru yang tersedia AWS Encryption SDK untuk bahasa pemrograman Anda, dan meningkatkan saat versi baru dirilis. Ketika versi memerlukan perubahan signifikan, seperti upgrade dari AWS Encryption SDK versi lebih awal dari 1.7. *x* ke versi 2.0. *x* dan yang lebih baru, kami memberikan [instruksi terperinci](migration.md) untuk membantu Anda.

Setiap implementasi bahasa AWS Encryption SDK pemrograman dikembangkan dalam GitHub repositori open-source terpisah. Siklus hidup dan fase dukungan dari setiap versi cenderung bervariasi di antara repositori. Misalnya, versi yang diberikan AWS Encryption SDK mungkin berada dalam fase ketersediaan umum (dukungan penuh) dalam satu bahasa pemrograman, tetapi end-of-support fase dalam bahasa pemrograman yang berbeda. Kami menyarankan Anda menggunakan versi yang didukung sepenuhnya bila memungkinkan dan menghindari versi yang tidak lagi didukung.

Untuk menemukan fase siklus hidup AWS Encryption SDK versi untuk bahasa pemrograman Anda, lihat `SUPPORT_POLICY.rst` file di setiap AWS Encryption SDK repositori.
+ AWS Encryption SDK for C — [Support\$1Policy.rst](https://github.com/aws/aws-encryption-sdk-c/blob/master/SUPPORT_POLICY.rst)
+ AWS Encryption SDK untuk .NET — [SUPPORT\$1POLICY.RST](https://github.com/aws/aws-encryption-sdk-dafny/blob/mainline/SUPPORT_POLICY.rst)
+ AWS [Enkripsi CLI — SUPPORT\$1POLICY.RST](https://github.com/aws/aws-encryption-sdk-cli/blob/master/SUPPORT_POLICY.rst)
+ AWS Encryption SDK for Java — [Support\$1Policy.rst](https://github.com/aws/aws-encryption-sdk-java/blob/master/SUPPORT_POLICY.rst)
+ AWS Encryption SDK for JavaScript — [Support\$1Policy.rst](https://github.com/aws/aws-encryption-sdk-javascript/blob/master/SUPPORT_POLICY.rst)
+ AWS Encryption SDK for Python — [Support\$1Policy.rst](https://github.com/aws/aws-encryption-sdk-python/blob/master/SUPPORT_POLICY.rst)

Untuk informasi selengkapnya, lihat [Versi dari AWS Encryption SDK](about-versions.md) [AWS SDKs dan serta Kebijakan pemeliharaan alat](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html) di Panduan Referensi Alat AWS SDKs dan Alat.

## Belajar lebih
<a name="intro-see-also"></a>

Untuk informasi lebih lanjut tentang enkripsi sisi klien AWS Encryption SDK dan enkripsi, coba sumber-sumber ini.
+ Untuk bantuan mengenai istilah dan konsep yang digunakan dalam SDK ini, lihat[Konsep dalam AWS Encryption SDK](concepts.md).
+ Untuk pedoman praktik terbaik, lihat[Praktik terbaik untuk AWS Encryption SDK](best-practices.md).
+ Untuk informasi tentang cara kerja SDK ini, lihat[Cara kerja SDK](how-it-works.md).
+ Untuk contoh yang menunjukkan cara mengkonfigurasi opsi di AWS Encryption SDK, lihat[Mengkonfigurasi AWS Encryption SDK](configure.md).
+ Untuk informasi teknis terperinci, lihat[AWS Encryption SDK referensi](reference.md).
+ Untuk spesifikasi teknis AWS Encryption SDK, lihat [AWS Encryption SDK Spesifikasi](https://github.com/awslabs/aws-encryption-sdk-specification/) di GitHub.
+ Untuk jawaban atas pertanyaan Anda tentang penggunaan AWS Encryption SDK, baca dan posting di [Forum Diskusi Alat AWS Crypto](https://forums.aws.amazon.com/forum.jspa?forumID=302).

Untuk informasi tentang implementasi dari AWS Encryption SDK dalam bahasa pemrograman yang berbeda.
+ **C**: Lihat[AWS Encryption SDK for C](c-language.md), [dokumentasi AWS Encryption SDK C](https://aws.github.io/aws-encryption-sdk-c/html/), dan [aws-encryption-sdk-c](https://github.com/aws/aws-encryption-sdk-c/)repositori aktif. GitHub
+ **C\$1/.NET**: Lihat [AWS Encryption SDK untuk .NET](dot-net.md) dan [aws-encryption-sdk-net](https://github.com/aws/aws-encryption-sdk/tree/mainline/AwsEncryptionSDK/runtimes/net/)direktori repositori aktif. `aws-encryption-sdk` GitHub
+ **Antarmuka Baris Perintah**: Lihat[AWS Encryption SDK antarmuka baris perintah](crypto-cli.md), [Baca Dokumen](https://aws-encryption-sdk-cli.readthedocs.io/en/latest/) untuk CLI AWS Enkripsi, dan [aws-encryption-sdk-cli](https://github.com/aws/aws-encryption-sdk-cli/)repositori aktif. GitHub
+ **Java**: Lihat[AWS Encryption SDK for Java](java.md), AWS Encryption SDK [Javadoc](https://aws.github.io/aws-encryption-sdk-java/), dan [aws-encryption-sdk-java](https://github.com/aws/aws-encryption-sdk-java/)repositori aktif. GitHub

  **JavaScript**: Lihat [AWS Encryption SDK for JavaScript](javascript.md) dan [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/)repositori aktif. GitHub 
+ **Python**: Lihat[AWS Encryption SDK for Python](python.md), [dokumentasi AWS Encryption SDK Python](https://aws-encryption-sdk-python.readthedocs.io/en/latest/), dan repositori aktif. [aws-encryption-sdk-python](https://github.com/aws/aws-encryption-sdk-python/) GitHub

## Mengirim umpan balik
<a name="report-issues"></a>

Kami menyambut umpan balik Anda\$1 Jika Anda memiliki pertanyaan atau komentar, atau masalah yang perlu dilaporkan, silakan gunakan sumber daya berikut.
+ Jika Anda menemukan potensi kerentanan keamanan di AWS Encryption SDK, harap [beri tahu AWS](https://aws.amazon.com/security/vulnerability-reporting/) keamanan. Jangan membuat GitHub masalah publik.
+ Untuk memberikan umpan balik tentang AWS Encryption SDK, ajukan masalah di GitHub repositori untuk bahasa pemrograman yang Anda gunakan. 
+ Untuk memberikan umpan balik tentang dokumentasi ini, gunakan tautan **Umpan Balik** di halaman ini. Anda juga dapat mengajukan masalah atau berkontribusi pada [aws-encryption-sdk-docs](https://github.com/awsdocs/aws-encryption-sdk-docs), repositori sumber terbuka untuk dokumentasi ini. GitHub

# Konsep dalam AWS Encryption SDK
<a name="concepts"></a>

Bagian ini memperkenalkan konsep yang digunakan dalam AWS Encryption SDK, dan memberikan glosarium dan referensi. Ini dirancang untuk membantu Anda memahami cara AWS Encryption SDK kerja dan istilah yang kami gunakan untuk menggambarkannya.

Butuh bantuan? 
+ Pelajari cara AWS Encryption SDK menggunakan [enkripsi amplop](#envelope-encryption) untuk melindungi data Anda.
+ Pelajari tentang elemen enkripsi amplop: [kunci data](#DEK) yang melindungi data Anda dan kunci [pembungkus yang melindungi kunci](#master-key) data Anda. 
+ Pelajari tentang [keyrings](#keyring) dan [penyedia kunci utama](#master-key-provider) yang menentukan kunci pembungkus yang Anda gunakan.
+ Pelajari tentang [konteks enkripsi](#encryption-context) yang menambahkan integritas pada proses enkripsi Anda. Ini opsional, tetapi ini adalah praktik terbaik yang kami rekomendasikan.
+ Pelajari tentang [pesan terenkripsi yang dikembalikan](#message) oleh metode enkripsi. 
+ Kemudian Anda siap untuk menggunakan AWS Encryption SDK dalam [bahasa pemrograman](programming-languages.md) pilihan Anda.

**Topics**
+ [Enkripsi amplop](#envelope-encryption)
+ [Kunci data](#DEK)
+ [Kunci pembungkus](#master-key)
+ [Gantungan kunci dan penyedia kunci utama](#keyring)
+ [Konteks enkripsi](#encryption-context)
+ [Pesan terenkripsi](#message)
+ [Suite algoritma](#crypto-algorithm)
+ [Manajer materi kriptografi](#crypt-materials-manager)
+ [Enkripsi simetris dan asimetris](#symmetric-key-encryption)
+ [Komitmen utama](#key-commitment)
+ [Kebijakan komitmen](#commitment-policy)
+ [Tanda tangan digital](#digital-sigs)

## Enkripsi amplop
<a name="envelope-encryption"></a>

Keamanan data terenkripsi Anda sebagian bergantung pada perlindungan kunci data yang dapat mendekripsi itu. Salah satu praktik terbaik yang diterima untuk melindungi kunci data adalah mengenkripsinya. Untuk melakukan ini, Anda memerlukan kunci enkripsi lain, yang dikenal sebagai kunci *enkripsi kunci atau kunci* [pembungkus](#master-key). Praktek menggunakan kunci pembungkus untuk mengenkripsi kunci data dikenal sebagai enkripsi *amplop*.

**Melindungi kunci data**  
 AWS Encryption SDK Enkripsi setiap pesan dengan kunci data yang unik. Kemudian mengenkripsi kunci data di bawah kunci pembungkus yang Anda tentukan. Ini menyimpan kunci data terenkripsi dengan data terenkripsi dalam pesan terenkripsi yang dikembalikan.  
Untuk menentukan kunci pembungkus Anda, Anda menggunakan [keyring atau penyedia](#keyring) [kunci master](#master-key-provider).  

![\[Enkripsi amplop dengan AWS Encryption SDK\]](http://docs.aws.amazon.com/id_id/encryption-sdk/latest/developer-guide/images/envelope-encryption-70.png)


**Mengenkripsi data yang sama di bawah beberapa kunci pembungkus**  
Anda dapat mengenkripsi kunci data di bawah beberapa kunci pembungkus. Anda mungkin ingin memberikan kunci pembungkus yang berbeda untuk pengguna yang berbeda, atau kunci pembungkus dari jenis yang berbeda, atau di lokasi yang berbeda. Setiap kunci pembungkus mengenkripsi kunci data yang sama. AWS Encryption SDK Menyimpan semua kunci data terenkripsi dengan data terenkripsi dalam pesan terenkripsi.   
Untuk mendekripsi data, Anda perlu menyediakan kunci pembungkus yang dapat mendekripsi salah satu kunci data terenkripsi.  

![\[Setiap kunci pembungkus mengenkripsi kunci data yang sama, menghasilkan satu kunci data terenkripsi untuk setiap kunci pembungkus\]](http://docs.aws.amazon.com/id_id/encryption-sdk/latest/developer-guide/images/multiple-wrapping-keys-70.png)


**Menggabungkan kekuatan dari beberapa algoritme**  
Untuk mengenkripsi data Anda, secara default, AWS Encryption SDK menggunakan [rangkaian algoritma](supported-algorithms.md) canggih dengan enkripsi simetris AES-GCM, fungsi derivasi kunci (HKDF), dan penandatanganan. Untuk mengenkripsi kunci data, Anda dapat menentukan [algoritma enkripsi simetris atau asimetris](#symmetric-key-encryption) yang sesuai dengan kunci pembungkus Anda.   
*Secara umum, algoritma enkripsi kunci simetris lebih cepat dan menghasilkan ciphertext yang lebih kecil daripada enkripsi kunci asimetris atau publik.* Namun algoritme kunci publik memberikan pemisahan peran yang melekat dan manajemen kunci yang lebih mudah. Untuk menggabungkan kekuatan masing-masing, Anda dapat mengenkripsi data Anda dengan enkripsi kunci simetris, dan kemudian mengenkripsi kunci data dengan enkripsi kunci publik.

## Kunci data
<a name="DEK"></a>

*Kunci data adalah kunci* enkripsi yang AWS Encryption SDK digunakan untuk mengenkripsi data Anda. Setiap kunci data adalah array byte yang sesuai dengan persyaratan untuk kunci kriptografi. Kecuali Anda menggunakan [caching kunci data](data-key-caching.md), AWS Encryption SDK menggunakan kunci data unik untuk mengenkripsi setiap pesan.

Anda tidak perlu menentukan, menghasilkan, mengimplementasikan, memperluas, melindungi, atau menggunakan kunci data. AWS Encryption SDK Apakah itu bekerja untuk Anda ketika Anda memanggil operasi enkripsi dan dekripsi. 

Untuk melindungi kunci data Anda, AWS Encryption SDK mengenkripsi mereka di bawah satu atau beberapa *kunci enkripsi kunci yang dikenal sebagai kunci* [pembungkus](#master-key) atau kunci master. Setelah AWS Encryption SDK menggunakan kunci data plaintext Anda untuk mengenkripsi data Anda, itu akan menghapusnya dari memori sesegera mungkin. Kemudian menyimpan kunci data terenkripsi dengan data terenkripsi dalam [pesan terenkripsi yang dikembalikan oleh operasi enkripsi](#message). Lihat perinciannya di [Bagaimana cara AWS Encryption SDK kerjanya](how-it-works.md).

**Tip**  
Dalam AWS Encryption SDK, kami membedakan *kunci data dari kunci* *enkripsi data*. Beberapa [suite algoritma](#crypto-algorithm) yang didukung, termasuk suite default, menggunakan [fungsi derivasi kunci](https://en.wikipedia.org/wiki/Key_derivation_function) yang mencegah kunci data mencapai batas kriptografinya. Fungsi derivasi kunci mengambil kunci data sebagai input dan mengembalikan kunci enkripsi data yang sebenarnya digunakan untuk mengenkripsi data. Untuk alasan ini, kita sering mengatakan bahwa data dienkripsi “di bawah” kunci data daripada “oleh” kunci data.

Setiap kunci data terenkripsi mencakup metadata, termasuk pengidentifikasi kunci pembungkus yang mengenkripsi itu. Metadata ini memudahkan untuk mengidentifikasi kunci pembungkus yang valid saat AWS Encryption SDK mendekripsi.

## Kunci pembungkus
<a name="master-key"></a>

Kunci *pembungkus adalah kunci* enkripsi kunci yang AWS Encryption SDK digunakan untuk mengenkripsi [kunci data yang mengenkripsi data](#DEK) Anda. Setiap kunci data plaintext dapat dienkripsi di bawah satu atau lebih kunci pembungkus. Anda menentukan kunci pembungkus mana yang digunakan untuk melindungi data Anda saat mengonfigurasi [keyring atau penyedia](#keyring) [kunci utama](#master-key-provider).

**catatan**  
*Kunci pembungkus* mengacu pada kunci di keyring atau penyedia kunci master. *Kunci master* biasanya dikaitkan dengan `MasterKey` kelas yang Anda buat instance saat Anda menggunakan penyedia kunci master.

Ini AWS Encryption SDK mendukung beberapa kunci pembungkus yang umum digunakan, seperti AWS Key Management Service (AWS KMS) simetris [AWS KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)(termasuk kunci [KMS Multi-wilayah), kunci](configure.md#config-mrks) mentah AES-GCM (Advanced Encryption Standard/Galois Counter Mode), dan kunci RSA mentah. Anda juga dapat memperluas atau mengimplementasikan kunci pembungkus Anda sendiri. 

Saat Anda menggunakan enkripsi amplop, Anda perlu melindungi kunci pembungkus Anda dari akses yang tidak sah. Anda dapat melakukan ini dengan salah satu cara berikut:
+ Gunakan layanan web yang dirancang untuk tujuan ini, seperti [AWS Key Management Service (AWS KMS)](https://aws.amazon.com/kms/).
+ Gunakan [modul keamanan perangkat keras (HSM)](https://en.wikipedia.org/wiki/Hardware_security_module) seperti yang ditawarkan oleh [AWS CloudHSM](https://aws.amazon.com/cloudhsm/).
+ Gunakan alat dan layanan manajemen kunci lainnya.

Jika Anda tidak memiliki sistem manajemen kunci, kami sarankan AWS KMS. AWS Encryption SDK Terintegrasi dengan AWS KMS untuk membantu Anda melindungi dan menggunakan kunci pembungkus Anda. Namun, AWS Encryption SDK tidak memerlukan AWS atau AWS layanan apa pun.

## Gantungan kunci dan penyedia kunci utama
<a name="keyring"></a>

Untuk menentukan kunci pembungkus yang Anda gunakan untuk enkripsi dan dekripsi, Anda menggunakan keyring atau penyedia kunci utama. Anda dapat menggunakan keyrings dan penyedia kunci master yang AWS Encryption SDK menyediakan atau merancang implementasi Anda sendiri. AWS Encryption SDK Menyediakan keyrings dan penyedia kunci master yang kompatibel satu sama lain tunduk pada kendala bahasa. Lihat perinciannya di [Kompatibilitas keyring](choose-keyring.md#keyring-compatibility). 

Sebuah *keyring* menghasilkan, mengenkripsi, dan mendekripsi kunci data. Saat Anda menentukan keyring, Anda dapat menentukan kunci [pembungkus yang mengenkripsi kunci](#master-key) data Anda. Kebanyakan keyrings menentukan setidaknya satu kunci pembungkus atau layanan yang menyediakan dan melindungi kunci pembungkus. Anda juga dapat menentukan keyring tanpa tombol pembungkus atau keyring yang lebih kompleks dengan opsi konfigurasi tambahan. Untuk bantuan memilih dan menggunakan gantungan kunci yang AWS Encryption SDK didefinisikan, lihat. [Gantungan kunci](choose-keyring.md) 

Keyrings didukung dalam bahasa pemrograman berikut:
+ AWS Encryption SDK for C
+ AWS Encryption SDK for JavaScript
+ AWS Encryption SDK untuk .NET
+ Versi 3. *x* dari AWS Encryption SDK for Java
+ Versi 4. *x* dari AWS Encryption SDK for Python, bila digunakan dengan dependensi [Perpustakaan Penyedia Materi Kriptografi](https://github.com/aws/aws-cryptographic-material-providers-library) (MPL) opsional.
+ Versi 1. *x* dari AWS Encryption SDK untuk Rust
+ Versi 0.1. *x* atau yang lebih baru AWS Encryption SDK untuk Go

*Penyedia kunci master* adalah alternatif untuk keyring. Penyedia kunci master mengembalikan kunci pembungkus (atau kunci master) yang Anda tentukan. Setiap kunci master dikaitkan dengan satu penyedia kunci master, tetapi penyedia kunci master biasanya menyediakan beberapa kunci master. Penyedia kunci master didukung di Java, Python, dan AWS CLI Enkripsi. 

Anda harus menentukan keyring (atau penyedia kunci utama) untuk enkripsi. Anda dapat menentukan keyring yang sama (atau penyedia kunci utama), atau yang lain, untuk dekripsi. Saat mengenkripsi, AWS Encryption SDK menggunakan semua kunci pembungkus yang Anda tentukan untuk mengenkripsi kunci data. Saat mendekripsi, hanya AWS Encryption SDK menggunakan kunci pembungkus yang Anda tentukan untuk mendekripsi kunci data terenkripsi. [Menentukan kunci pembungkus untuk dekripsi adalah opsional, tetapi ini adalah praktik terbaik. AWS Encryption SDK](best-practices.md) 

Untuk detail tentang menentukan kunci pembungkus, lihat. [Memilih tombol pembungkus](configure.md#config-keys) 

## Konteks enkripsi
<a name="encryption-context"></a>

Untuk meningkatkan keamanan operasi kriptografi Anda, sertakan konteks enkripsi dalam semua permintaan untuk mengenkripsi data. Menggunakan konteks enkripsi adalah opsional, tetapi ini adalah praktik terbaik kriptografi yang kami rekomendasikan.

*Konteks enkripsi* adalah sekumpulan pasangan nama-nilai yang berisi data otentikasi tambahan non-rahasia yang sewenang-wenang. Konteks enkripsi dapat berisi data apa pun yang Anda pilih, tetapi biasanya terdiri dari data yang berguna dalam pencatatan dan pelacakan, seperti data tentang jenis file, tujuan, atau kepemilikan. Saat Anda mengenkripsi data, konteks enkripsi terikat secara kriptografis ke data terenkripsi sehingga konteks enkripsi yang sama diperlukan untuk mendekripsi data. AWS Encryption SDK Termasuk konteks enkripsi dalam plaintext di header [pesan terenkripsi yang dikembalikan](#message).

Konteks enkripsi yang AWS Encryption SDK digunakan terdiri dari konteks enkripsi yang Anda tentukan dan public key pair yang ditambahkan oleh [manajer bahan kriptografi](#crypt-materials-manager) (CMM). Secara khusus, setiap kali Anda menggunakan [algoritma enkripsi dengan penandatanganan](algorithms-reference.md), CMM menambahkan pasangan nama-nilai ke konteks enkripsi yang terdiri dari nama cadangan`aws-crypto-public-key`, dan nilai yang mewakili kunci verifikasi publik. `aws-crypto-public-key`Nama dalam konteks enkripsi dicadangkan oleh AWS Encryption SDK dan tidak dapat digunakan sebagai nama dalam pasangan lain dalam konteks enkripsi. Untuk detailnya, lihat [AAD](message-format.md#header-aad) di *Referensi Format Pesan*.

Contoh konteks enkripsi berikut terdiri dari dua pasangan konteks enkripsi yang ditentukan dalam permintaan dan public key pair yang ditambahkan CMM.

```
"Purpose"="Test", "Department"="IT", aws-crypto-public-key=<public key>
```

Untuk mendekripsi data, Anda meneruskan pesan terenkripsi. Karena AWS Encryption SDK dapat mengekstrak konteks enkripsi dari header pesan terenkripsi, Anda tidak diharuskan untuk menyediakan konteks enkripsi secara terpisah. Namun, konteks enkripsi dapat membantu Anda mengonfirmasi bahwa Anda mendekripsi pesan terenkripsi yang benar. 
+ Dalam [AWS Encryption SDK Command Line Interface](crypto-cli.md) (CLI), jika Anda memberikan konteks enkripsi dalam perintah dekripsi, CLI memverifikasi bahwa nilai-nilai hadir dalam konteks enkripsi pesan terenkripsi sebelum mengembalikan data plaintext. 
+ Dalam implementasi bahasa pemrograman lainnya, respon dekripsi mencakup konteks enkripsi dan data plaintext. Fungsi dekripsi dalam aplikasi Anda harus selalu memverifikasi bahwa konteks enkripsi dalam respons dekripsi menyertakan konteks enkripsi dalam permintaan enkripsi (atau subset) sebelum mengembalikan data teks biasa.

**catatan**  
Versi berikut mendukung [konteks enkripsi CMM yang diperlukan](configure.md#config-required-encryption-context-cmm), yang dapat Anda gunakan untuk memerlukan konteks enkripsi di semua permintaan enkripsi.  
Versi 3. *x* dari AWS Encryption SDK for Java
Versi 4. *x* dan yang lebih baru AWS Encryption SDK untuk .NET
Versi 4. *x* dari AWS Encryption SDK for Python, bila digunakan dengan dependensi [Perpustakaan Penyedia Materi Kriptografi](https://github.com/aws/aws-cryptographic-material-providers-library) (MPL) opsional.
Versi 1. *x* dari AWS Encryption SDK untuk Rust
Versi 0.1. *x* atau yang lebih baru AWS Encryption SDK untuk Go

Saat memilih konteks enkripsi, ingatlah bahwa itu bukan rahasia. Konteks enkripsi ditampilkan dalam plaintext di header [pesan terenkripsi yang dikembalikan](#message). AWS Encryption SDK Jika Anda menggunakan AWS Key Management Service, konteks enkripsi juga mungkin muncul dalam teks biasa dalam catatan audit dan log, seperti. AWS CloudTrail

Untuk contoh mengirimkan dan memverifikasi konteks enkripsi dalam kode Anda, lihat contoh untuk [bahasa pemrograman](programming-languages.md) pilihan Anda.

## Pesan terenkripsi
<a name="message"></a>

Ketika Anda mengenkripsi data dengan AWS Encryption SDK, ia mengembalikan pesan terenkripsi.

*Pesan terenkripsi* [[adalah [struktur data berformat portabel yang mencakup data](message-format.md) terenkripsi bersama dengan salinan kunci data terenkripsi, ID algoritma, dan, secara opsional, konteks enkripsi dan tanda tangan digital.](#digital-sigs)](#encryption-context) Enkripsi operasi dalam AWS Encryption SDK pengembalian pesan terenkripsi dan operasi dekripsi mengambil pesan terenkripsi sebagai input. 

Menggabungkan data terenkripsi dan kunci data terenkripsi merampingkan operasi dekripsi dan membebaskan Anda dari keharusan menyimpan dan mengelola kunci data terenkripsi secara independen dari data yang mereka enkripsi.

Untuk informasi teknis tentang pesan terenkripsi, lihat Format Pesan [Terenkripsi](message-format.md).

## Suite algoritma
<a name="crypto-algorithm"></a>

 AWS Encryption SDK Menggunakan rangkaian algoritma untuk mengenkripsi dan menandatangani data dalam [pesan terenkripsi yang dikembalikan oleh operasi enkripsi](#message) dan dekripsi. AWS Encryption SDK Mendukung beberapa [suite algoritma](supported-algorithms.md). Semua suite yang didukung menggunakan Advanced Encryption Standard (AES) sebagai algoritma utama, dan menggabungkannya dengan algoritme dan nilai lainnya. 

 AWS Encryption SDK Menetapkan suite algoritma yang direkomendasikan sebagai default untuk semua operasi enkripsi. Default mungkin berubah seiring dengan peningkatan standar dan praktik terbaik. Anda dapat menentukan rangkaian algoritme alternatif dalam permintaan untuk mengenkripsi data atau saat membuat [manajer bahan kriptografi (CMM)](#crypt-materials-manager), tetapi kecuali alternatif diperlukan untuk situasi Anda, yang terbaik adalah menggunakan default. Default saat ini adalah AES-GCM dengan [fungsi derivasi extract-and-expand kunci](https://en.wikipedia.org/wiki/HKDF) berbasis HMAC ([HKDF](https://en.wikipedia.org/wiki/HKDF)), [komitmen utama, tanda tangan [Elliptic Curve Digital Signature Algorithm](#digital-sigs) (ECDSA), dan kunci](#key-commitment) enkripsi 256-bit. 

Jika aplikasi Anda memerlukan kinerja tinggi dan pengguna yang mengenkripsi data dan mereka yang mendekripsi data sama-sama dipercaya, Anda dapat mempertimbangkan untuk menentukan rangkaian algoritme tanpa tanda tangan digital. Namun, kami sangat merekomendasikan rangkaian algoritme yang mencakup komitmen kunci dan fungsi derivasi kunci. Suite algoritma tanpa fitur ini hanya didukung untuk kompatibilitas mundur.

## Manajer materi kriptografi
<a name="crypt-materials-manager"></a>

Manajer bahan kriptografi (CMM) merakit bahan kriptografi yang digunakan untuk mengenkripsi dan mendekripsi data. *Materi kriptografi* termasuk plaintext dan kunci data terenkripsi, dan kunci penandatanganan pesan opsional. Anda tidak pernah berinteraksi dengan CMM secara langsung. Metode enkripsi dan dekripsi menanganinya untuk Anda.

Anda dapat menggunakan CMM default atau CMM [caching yang AWS Encryption SDK disediakan, atau menulis CMM](data-key-caching.md) kustom. Dan Anda dapat menentukan CMM, tetapi itu tidak diperlukan. Saat Anda menentukan keyring atau penyedia kunci master, CMM AWS Encryption SDK default akan dibuat untuk Anda. CMM default mendapatkan materi enkripsi atau dekripsi dari keyring atau penyedia kunci utama yang Anda tentukan. Ini mungkin melibatkan panggilan ke layanan kriptografi, seperti [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)(AWS KMS).

Karena CMM bertindak sebagai penghubung antara keyring AWS Encryption SDK dan keyring (atau penyedia kunci utama), ini adalah titik ideal untuk penyesuaian dan ekstensi, seperti dukungan untuk penegakan kebijakan dan caching. AWS Encryption SDK Ini menyediakan CMM caching untuk mendukung caching [kunci data](data-key-caching.md). 

## Enkripsi simetris dan asimetris
<a name="symmetric-key-encryption"></a>

*Enkripsi simetris* menggunakan kunci yang sama untuk mengenkripsi dan mendekripsi data. 

*Enkripsi asimetris* menggunakan data key pair yang terkait secara matematis. Satu kunci dalam pasangan mengenkripsi data; hanya kunci lain dalam pasangan yang dapat mendekripsi data.

 AWS Encryption SDK Menggunakan [enkripsi amplop](#envelope-encryption). Ini mengenkripsi data Anda dengan kunci data simetris. Ini mengenkripsi kunci data simetris dengan satu atau lebih tombol pembungkus simetris atau asimetris. Ia mengembalikan [pesan terenkripsi](#message) yang mencakup data terenkripsi dan setidaknya satu salinan kunci data terenkripsi. 

**Mengenkripsi data Anda (enkripsi simetris)**  
Untuk mengenkripsi data Anda, AWS Encryption SDK menggunakan [kunci data](#DEK) simetris dan [rangkaian algoritma yang menyertakan algoritma](#crypto-algorithm) enkripsi simetris. Untuk mendekripsi data, AWS Encryption SDK menggunakan kunci data yang sama dan rangkaian algoritma yang sama.

**Mengenkripsi kunci data Anda (enkripsi simetris atau asimetris)**  
[Penyedia [keyring](#keyring) atau kunci utama](#master-key-provider) yang Anda berikan ke operasi enkripsi dan dekripsi menentukan bagaimana kunci data simetris dienkripsi dan didekripsi. Anda dapat memilih keyring atau penyedia kunci utama yang menggunakan enkripsi simetris, seperti AWS KMS keyring, atau yang menggunakan enkripsi asimetris, seperti keyring RSA mentah atau. `JceMasterKey`

## Komitmen utama
<a name="key-commitment"></a>

 AWS Encryption SDK Mendukung *komitmen kunci* (kadang-kadang dikenal sebagai *ketahanan*), properti keamanan yang menjamin bahwa setiap ciphertext dapat didekripsi hanya untuk satu plaintext. Untuk melakukan ini, komitmen utama menjamin bahwa hanya kunci data yang mengenkripsi pesan Anda yang akan digunakan untuk mendekripsi itu. [Mengenkripsi dan mendekripsi dengan komitmen utama adalah praktik terbaik.AWS Encryption SDK](best-practices.md)

Sebagian besar cipher simetris modern (termasuk AES) mengenkripsi plaintext di bawah satu kunci rahasia, seperti [kunci data unik](#DEK) yang digunakan untuk mengenkripsi setiap pesan teks biasa. AWS Encryption SDK Mendekripsi data ini dengan kunci data yang sama mengembalikan plaintext yang identik dengan aslinya. Mendekripsi dengan kunci yang berbeda biasanya akan gagal. Namun, dimungkinkan untuk mendekripsi ciphertext di bawah dua kunci yang berbeda. Dalam kasus yang jarang terjadi, adalah layak untuk menemukan kunci yang dapat mendekripsi beberapa byte ciphertext menjadi plaintext yang berbeda, tetapi masih dapat dipahami. 

 AWS Encryption SDK Selalu mengenkripsi setiap pesan teks biasa di bawah satu kunci data unik. Mungkin mengenkripsi kunci data itu di bawah beberapa kunci pembungkus (atau kunci master), tetapi kunci pembungkus selalu mengenkripsi kunci data yang sama. Meskipun demikian, [pesan terenkripsi yang canggih dan dibuat secara manual mungkin sebenarnya berisi kunci data yang](#message) berbeda, masing-masing dienkripsi oleh kunci pembungkus yang berbeda. Misalnya, jika satu pengguna mendekripsi pesan terenkripsi, ia mengembalikan 0x0 (false) sementara pengguna lain yang mendekripsi pesan terenkripsi yang sama mendapat 0x1 (true).

Untuk mencegah skenario ini, AWS Encryption SDK mendukung komitmen utama saat mengenkripsi dan mendekripsi. Ketika AWS Encryption SDK mengenkripsi pesan dengan komitmen utama, secara kriptografis mengikat kunci data unik yang menghasilkan ciphertext ke *string komitmen kunci, pengidentifikasi kunci* data non-rahasia. Kemudian menyimpan string komitmen utama dalam metadata pesan terenkripsi. Ketika mendekripsi pesan dengan komitmen utama, AWS Encryption SDK memverifikasi bahwa kunci data adalah satu-satunya kunci untuk pesan terenkripsi itu. Jika verifikasi kunci data gagal, operasi dekripsi gagal. 

Support untuk komitmen utama diperkenalkan di versi 1.7. *x*, yang dapat mendekripsi pesan dengan komitmen utama, tetapi tidak akan mengenkripsi dengan komitmen utama. Anda dapat menggunakan versi ini untuk sepenuhnya menyebarkan kemampuan untuk mendekripsi ciphertext dengan komitmen utama. Versi 2.0. *x* mencakup dukungan penuh untuk komitmen utama. Secara default, ini mengenkripsi dan mendekripsi hanya dengan komitmen utama. Ini adalah konfigurasi yang ideal untuk aplikasi yang tidak perlu mendekripsi ciphertext yang dienkripsi oleh versi sebelumnya. AWS Encryption SDK

Meskipun mengenkripsi dan mendekripsi dengan komitmen utama adalah praktik terbaik, kami membiarkan Anda memutuskan kapan itu digunakan, dan membiarkan Anda menyesuaikan kecepatan Anda mengadopsinya. Dimulai pada versi 1.7. *x*, AWS Encryption SDK mendukung [kebijakan komitmen](#commitment-policy) yang menetapkan rangkaian [algoritme default dan membatasi rangkaian](supported-algorithms.md) algoritme yang dapat digunakan. Kebijakan ini menentukan apakah data Anda dienkripsi dan didekripsi dengan komitmen utama. 

Komitmen utama menghasilkan [pesan terenkripsi yang sedikit lebih besar (\$1 30 byte)](message-format.md) dan membutuhkan lebih banyak waktu untuk diproses. Jika aplikasi Anda sangat sensitif terhadap ukuran atau kinerja, Anda dapat memilih untuk keluar dari komitmen utama. Tetapi lakukan hanya jika Anda harus. 

Untuk informasi selengkapnya tentang migrasi ke versi 1.7. *x* dan 2.0. *x*, termasuk fitur komitmen utama mereka, lihat[Migrasi Anda AWS Encryption SDK](migration.md). Untuk informasi teknis tentang komitmen utama, lihat [AWS Encryption SDK referensi algoritma](algorithms-reference.md) dan[AWS Encryption SDK referensi format pesan](message-format.md).

## Kebijakan komitmen
<a name="commitment-policy"></a>

*Kebijakan komitmen* [adalah pengaturan konfigurasi yang menentukan apakah aplikasi Anda mengenkripsi dan mendekripsi dengan komitmen utama.](#key-commitment) [Mengenkripsi dan mendekripsi dengan komitmen utama adalah praktik terbaik.AWS Encryption SDK](best-practices.md) 

Kebijakan komitmen memiliki tiga nilai.

**catatan**  
Anda mungkin harus menggulir secara horizontal atau vertikal untuk melihat seluruh tabel.


**Nilai-nilai kebijakan komitmen**  

| Nilai | Enkripsi dengan komitmen utama | Enkripsi tanpa komitmen utama | Dekripsi dengan komitmen utama | Mendekripsi tanpa komitmen utama | 
| --- | --- | --- | --- | --- | 
| ForbidEncryptAllowDecrypt | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/id_id/encryption-sdk/latest/developer-guide/images/icon-no.png)  | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/id_id/encryption-sdk/latest/developer-guide/images/icon-yes.png)  | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/id_id/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/id_id/encryption-sdk/latest/developer-guide/images/icon-yes.png) | 
| RequireEncryptAllowDecrypt | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/id_id/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/id_id/encryption-sdk/latest/developer-guide/images/icon-no.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/id_id/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/id_id/encryption-sdk/latest/developer-guide/images/icon-yes.png) | 
| RequireEncryptRequireDecrypt | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/id_id/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/id_id/encryption-sdk/latest/developer-guide/images/icon-no.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/id_id/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/id_id/encryption-sdk/latest/developer-guide/images/icon-no.png) | 

Pengaturan kebijakan komitmen diperkenalkan di AWS Encryption SDK versi 1.7. *x*. Ini berlaku di semua [bahasa pemrograman](programming-languages.md) yang didukung.
+ `ForbidEncryptAllowDecrypt`mendekripsi dengan atau tanpa komitmen utama, tetapi tidak akan mengenkripsi dengan komitmen utama. Nilai ini, diperkenalkan dalam versi 1.7. *x*, dirancang untuk mempersiapkan semua host yang menjalankan aplikasi Anda untuk mendekripsi dengan komitmen utama sebelum mereka menemukan ciphertext yang dienkripsi dengan komitmen utama. 
+ `RequireEncryptAllowDecrypt`selalu mengenkripsi dengan komitmen utama. Itu dapat mendekripsi dengan atau tanpa komitmen utama. Nilai ini, diperkenalkan dalam versi 2.0. *x*, memungkinkan Anda mulai mengenkripsi dengan komitmen utama, tetapi masih mendekripsi ciphertext lama tanpa komitmen utama.
+ `RequireEncryptRequireDecrypt`mengenkripsi dan mendekripsi hanya dengan komitmen utama. Nilai ini adalah default untuk versi 2.0. *x*. Gunakan nilai ini ketika Anda yakin bahwa semua ciphertext Anda dienkripsi dengan komitmen utama.

Pengaturan kebijakan komitmen menentukan rangkaian algoritme mana yang dapat Anda gunakan. Dimulai pada versi 1.7. *x*, AWS Encryption SDK mendukung [rangkaian algoritma](supported-algorithms.md) untuk komitmen utama; dengan dan tanpa penandatanganan. Jika Anda menentukan rangkaian algoritme yang bertentangan dengan kebijakan komitmen Anda, AWS Encryption SDK kesalahan akan ditampilkan. 

Untuk bantuan menetapkan kebijakan komitmen Anda, lihat[Menetapkan kebijakan komitmen Anda](migrate-commitment-policy.md).

## Tanda tangan digital
<a name="digital-sigs"></a>

 AWS Encryption SDK Enkripsi data Anda menggunakan algoritma enkripsi yang diautentikasi, AES-GCM, dan proses dekripsi memverifikasi integritas dan keaslian pesan terenkripsi tanpa menggunakan tanda tangan digital. Tetapi karena AES-GCM menggunakan kunci simetris, siapa pun yang dapat mendekripsi kunci data yang digunakan untuk mendekripsi ciphertext juga dapat secara manual membuat ciphertext terenkripsi baru, yang menyebabkan masalah keamanan potensial. Misalnya, jika Anda menggunakan AWS KMS key sebagai kunci pembungkus, pengguna dengan `kms:Decrypt` izin dapat membuat ciphertext terenkripsi tanpa menelepon. `kms:Encrypt`

Untuk menghindari masalah ini, AWS Encryption SDK dukungan menambahkan tanda tangan Elliptic Curve Digital Signature Algorithm (ECDSA) ke akhir pesan terenkripsi. Ketika rangkaian algoritma penandatanganan digunakan, akan AWS Encryption SDK menghasilkan kunci pribadi sementara dan public key pair untuk setiap pesan terenkripsi. AWS Encryption SDK Menyimpan kunci publik dalam konteks enkripsi kunci data dan membuang kunci pribadi. Ini memastikan bahwa tidak ada yang dapat membuat tanda tangan lain yang memverifikasi dengan kunci publik. Algoritma mengikat kunci publik ke kunci data terenkripsi sebagai data otentikasi tambahan di header pesan, mencegah pengguna yang hanya dapat mendekripsi pesan dari mengubah kunci publik atau memengaruhi verifikasi tanda tangan.

Verifikasi tanda tangan menambahkan biaya kinerja yang signifikan pada dekripsi. Jika pengguna mengenkripsi data dan pengguna yang mendekripsi data sama-sama dipercaya, pertimbangkan untuk menggunakan rangkaian algoritme yang tidak menyertakan penandatanganan.

**catatan**  
Jika keyring atau akses ke materi kriptografi pembungkus tidak menggambarkan antara enkripsi dan dekripsi, tanda tangan digital tidak memberikan nilai kriptografi.

[AWS KMS keyrings](use-kms-keyring.md), termasuk AWS KMS keyring RSA asimetris, dapat menggambarkan antara enkripsi dan dekripsi berdasarkan kebijakan utama dan kebijakan IAM. AWS KMS 

Karena sifat kriptografinya, gantungan kunci berikut tidak dapat menggambarkan antara enkripsi dan dekripsi:
+ AWS KMS Gantungan kunci hierarkis
+ AWS KMS Gantungan kunci ECDH
+ Gantungan kunci AES mentah
+ Gantungan kunci RSA mentah
+ Gantungan kunci ECDH mentah

# Bagaimana cara AWS Encryption SDK kerjanya
<a name="how-it-works"></a>

[Alur kerja di bagian ini menjelaskan cara AWS Encryption SDK mengenkripsi data dan mendekripsi pesan terenkripsi.](concepts.md#message) Alur kerja ini menjelaskan proses dasar menggunakan fitur default. [Untuk detail tentang mendefinisikan dan menggunakan komponen kustom, lihat GitHub repositori untuk setiap implementasi bahasa yang didukung.](programming-languages.md)

 AWS Encryption SDK Menggunakan enkripsi amplop untuk melindungi data Anda. Setiap pesan dienkripsi di bawah kunci data unik. Kemudian kunci data dienkripsi oleh kunci pembungkus yang Anda tentukan. Untuk mendekripsi pesan terenkripsi, AWS Encryption SDK menggunakan kunci pembungkus yang Anda tentukan untuk mendekripsi setidaknya satu kunci data terenkripsi. Kemudian dapat mendekripsi ciphertext dan mengembalikan pesan teks biasa.

Butuh bantuan dengan terminologi yang kita gunakan di? AWS Encryption SDK Lihat [Konsep dalam AWS Encryption SDK](concepts.md).

## Bagaimana AWS Encryption SDK mengenkripsi data
<a name="encrypt-workflow"></a>

 AWS Encryption SDK Ini menyediakan metode yang mengenkripsi string, array byte, dan aliran byte. Untuk contoh kode, lihat topik Contoh di setiap [Bahasa pemrograman](programming-languages.md) bagian.

1. Buat [keyring](choose-keyring.md) (atau [penyedia kunci utama](concepts.md#master-key-provider)) yang menentukan kunci pembungkus yang melindungi data Anda.

1. Teruskan data keyring dan plaintext ke metode enkripsi. Kami menyarankan Anda meneruskan [konteks enkripsi](concepts.md#encryption-context) opsional dan non-rahasia.

1. Metode enkripsi meminta keyring untuk bahan enkripsi. Keyring mengembalikan kunci enkripsi data unik untuk pesan: satu kunci data teks biasa dan satu salinan kunci data yang dienkripsi oleh masing-masing kunci pembungkus yang ditentukan.

1. Metode enkripsi menggunakan kunci data plaintext untuk mengenkripsi data, dan kemudian membuang kunci data plaintext. Jika Anda menyediakan konteks enkripsi ([praktik AWS Encryption SDK terbaik](best-practices.md)), metode enkripsi secara kriptografis mengikat konteks enkripsi ke data terenkripsi.

1. Metode enkripsi mengembalikan [pesan terenkripsi](concepts.md#message) yang berisi data terenkripsi, kunci data terenkripsi, dan metadata lainnya, termasuk konteks enkripsi, jika Anda menggunakannya.

## Bagaimana AWS Encryption SDK mendekripsi pesan terenkripsi
<a name="decrypt-workflow"></a>

 AWS Encryption SDK Menyediakan metode yang mendekripsi [pesan terenkripsi](concepts.md#message) dan mengembalikan plaintext. Untuk contoh kode, lihat topik Contoh di setiap [Bahasa pemrograman](programming-languages.md) bagian.

[Keyring](choose-keyring.md) (atau [penyedia kunci utama](concepts.md#master-key-provider)) yang mendekripsi pesan terenkripsi harus kompatibel dengan yang digunakan untuk mengenkripsi pesan. Salah satu kunci pembungkusnya harus dapat mendekripsi kunci data terenkripsi dalam pesan terenkripsi. Untuk informasi tentang kompatibilitas dengan keyrings dan penyedia kunci utama, lihat[Kompatibilitas keyring](choose-keyring.md#keyring-compatibility).

1. Buat keyring atau penyedia kunci master dengan kunci pembungkus yang dapat mendekripsi data Anda. Anda dapat menggunakan keyring yang sama dengan yang Anda berikan ke metode enkripsi atau yang berbeda.

1. Teruskan [pesan terenkripsi](concepts.md#message) dan keyring ke metode dekripsi.

1. Metode dekripsi meminta keyring atau penyedia kunci master untuk mendekripsi salah satu kunci data terenkripsi dalam pesan terenkripsi. Ini meneruskan informasi dari pesan terenkripsi, termasuk kunci data terenkripsi.

1. Keyring menggunakan kunci pembungkusnya untuk mendekripsi salah satu kunci data terenkripsi. Jika berhasil, responsnya menyertakan kunci data plaintext. Jika tidak ada kunci pembungkus yang ditentukan oleh keyring atau penyedia kunci master dapat mendekripsi kunci data terenkripsi, panggilan dekripsi gagal.

1. Metode dekripsi menggunakan kunci data plaintext untuk mendekripsi data, membuang kunci data plaintext, dan mengembalikan data plaintext.

# Suite algoritma yang didukung di AWS Encryption SDK
<a name="supported-algorithms"></a>

Sebuah *algoritma suite* adalah kumpulan algoritma kriptografi dan nilai-nilai terkait. Sistem kriptografi menggunakan implementasi algoritma untuk menghasilkan pesan ciphertext.

Rangkaian AWS Encryption SDK algoritma menggunakan algoritma Advanced Encryption Standard (AES) dalam Galois/Counter Mode (GCM), yang dikenal sebagai AES-GCM, untuk mengenkripsi data mentah. AWS Encryption SDK Mendukung kunci enkripsi 256-bit, 192-bit, dan 128-bit. Panjang vektor inisialisasi (IV) selalu 12 byte. Panjang tag otentikasi selalu 16 byte.

Secara default, AWS Encryption SDK menggunakan rangkaian algoritma dengan AES-GCM dengan fungsi derivasi extract-and-expand kunci berbasis HMAC ([HKDF](https://en.wikipedia.org/wiki/HKDF)), penandatanganan, dan kunci enkripsi 256-bit. Jika [kebijakan komitmen](concepts.md#commitment-policy) memerlukan [komitmen utama](concepts.md#key-commitment), AWS Encryption SDK memilih rangkaian algoritme yang juga mendukung komitmen utama; jika tidak, ia memilih rangkaian algoritme dengan derivasi dan penandatanganan kunci, tetapi bukan komitmen utama.

## Direkomendasikan: AES-GCM dengan derivasi kunci, penandatanganan, dan komitmen utama
<a name="recommended-algorithms"></a>

Ini AWS Encryption SDK merekomendasikan rangkaian algoritma yang memperoleh kunci enkripsi AES-GCM dengan memasok kunci enkripsi data 256-bit ke fungsi derivasi kunci berbasis HMAC ( extract-and-expandHKDF). AWS Encryption SDK Menambahkan tanda tangan Elliptic Curve Digital Signature Algorithm (ECDSA). Untuk mendukung [komitmen utama](concepts.md#key-commitment), rangkaian algoritme ini juga memperoleh *string komitmen utama — pengidentifikasi kunci* data non-rahasia — yang disimpan dalam metadata pesan terenkripsi. String komitmen kunci ini juga diturunkan melalui HKDF menggunakan prosedur yang mirip dengan menurunkan kunci enkripsi data.


**AWS Encryption SDK Suite Algoritma**  

| Enkripsi algoritme | Panjang kunci enkripsi data (dalam bit) | Algoritma derivasi kunci | Algoritma tanda tangan | Komitmen utama | 
| --- | --- | --- | --- | --- | 
| AES-GCM | 256 | HKDF dengan SHA-384 | ECDSA dengan P-384 dan SHA-384 | HKDF dengan SHA-512 | 

HKDF membantu Anda menghindari penggunaan kembali kunci enkripsi data yang tidak disengaja dan mengurangi risiko penggunaan kunci data secara berlebihan. 

Untuk penandatanganan, rangkaian algoritma ini menggunakan ECDSA dengan algoritma fungsi hash kriptografi (SHA-384). ECDSA digunakan secara default, meskipun tidak ditentukan oleh kebijakan untuk kunci master yang mendasarinya. [Penandatanganan pesan](concepts.md#digital-sigs) memverifikasi bahwa pengirim pesan diberi wewenang untuk mengenkripsi pesan dan memberikan non-penolakan. Hal ini sangat berguna ketika kebijakan otorisasi untuk kunci master memungkinkan satu set pengguna untuk mengenkripsi data dan satu set pengguna yang berbeda untuk mendekripsi data. 

Rangkaian algoritma dengan komitmen utama memastikan bahwa setiap ciphertext mendekripsi hanya satu teks biasa. Mereka melakukan ini dengan memvalidasi identitas kunci data yang digunakan sebagai input ke algoritma enkripsi. Saat mengenkripsi, rangkaian algoritma ini memperoleh string komitmen utama. Sebelum mendekripsi, mereka memvalidasi bahwa kunci data cocok dengan string komitmen kunci. Jika tidak, panggilan dekripsi gagal.

## Suite algoritma lain yang didukung
<a name="other-algorithms"></a>

 AWS Encryption SDK Mendukung rangkaian algoritma alternatif berikut untuk kompatibilitas mundur. Secara umum, kami tidak merekomendasikan suite algoritma ini. Namun, kami menyadari bahwa penandatanganan dapat menghambat kinerja secara signifikan, jadi kami menawarkan rangkaian komitmen utama dengan derivasi kunci untuk kasus-kasus tersebut. Untuk aplikasi yang harus membuat pengorbanan kinerja yang lebih signifikan, kami terus menawarkan suite yang tidak memiliki penandatanganan, komitmen utama, dan derivasi kunci.

**AES-GCM tanpa komitmen utama**  
Suite algoritma tanpa komitmen kunci tidak memvalidasi kunci data sebelum mendekripsi. Akibatnya, rangkaian algoritma ini dapat mendekripsi satu ciphertext menjadi pesan teks biasa yang berbeda. Namun, karena rangkaian algoritma dengan komitmen utama menghasilkan [pesan terenkripsi yang sedikit lebih besar (\$130 byte)](message-format.md) dan membutuhkan waktu lebih lama untuk diproses, mereka mungkin bukan pilihan terbaik untuk setiap aplikasi.   
Ini AWS Encryption SDK mendukung rangkaian algoritme dengan derivasi kunci, komitmen utama, penandatanganan, dan satu dengan derivasi kunci dan komitmen utama, tetapi tidak menandatangani. Kami tidak menyarankan menggunakan rangkaian algoritma tanpa komitmen utama. Jika Anda harus, kami merekomendasikan rangkaian algoritme dengan derivasi kunci dan komitmen kunci, tetapi tidak menandatangani. Namun, jika profil kinerja aplikasi Anda mendukung penggunaan rangkaian algoritme, menggunakan rangkaian algoritme dengan komitmen utama, derivasi kunci, dan penandatanganan adalah praktik terbaik.

**AES-GCM tanpa penandatanganan**  
Suite algoritma tanpa penandatanganan tidak memiliki tanda tangan ECDSA yang memberikan keaslian dan non-penolakan. Gunakan suite ini hanya ketika pengguna yang mengenkripsi data dan mereka yang mendekripsi data sama-sama dipercaya.   
Saat menggunakan rangkaian algoritme tanpa penandatanganan, kami sarankan Anda memilih satu dengan derivasi kunci dan komitmen kunci. 

**AES-GCM tanpa derivasi kunci**  
Suite algoritma tanpa derivasi kunci menggunakan kunci enkripsi data sebagai kunci enkripsi AES-GCM, alih-alih menggunakan fungsi derivasi kunci untuk mendapatkan kunci unik. Kami tidak menyarankan menggunakan suite ini untuk menghasilkan ciphertext, tetapi AWS Encryption SDK mendukungnya untuk alasan kompatibilitas.

Untuk informasi lebih lanjut tentang bagaimana suite ini diwakili dan digunakan di perpustakaan, lihat[AWS Encryption SDK referensi algoritma](algorithms-reference.md).