

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

# Enkripsi yang dapat dicari
<a name="searchable-encryption"></a>


****  

|  | 
| --- |
| Pustaka enkripsi sisi klien kami diubah namanya menjadi SDK Enkripsi AWS Database. Panduan pengembang ini masih memberikan informasi tentang Klien Enkripsi [DynamoDB](legacy-dynamodb-encryption-client.md). | 

Enkripsi yang dapat dicari memungkinkan Anda untuk mencari catatan terenkripsi tanpa mendekripsi seluruh database. Ini dilakukan dengan menggunakan *beacon*, yang membuat peta antara nilai plaintext yang ditulis ke bidang dan nilai terenkripsi yang sebenarnya disimpan dalam database Anda. AWS Database Encryption SDK menyimpan beacon di bidang baru yang ditambahkan ke catatan. Bergantung pada jenis suar yang Anda gunakan, Anda dapat melakukan penelusuran pencocokan persis atau kueri kompleks yang lebih disesuaikan pada data terenkripsi Anda.

**catatan**  
[Enkripsi yang dapat dicari dalam SDK Enkripsi AWS Database berbeda dari enkripsi simetris yang dapat dicari yang didefinisikan dalam penelitian akademis, seperti enkripsi simetris yang dapat dicari.](https://dl.acm.org/doi/10.1145/1180405.1180417)



Beacon adalah tag Hash Based Message Authentication Code (HMAC) terpotong yang membuat peta antara plaintext dan nilai terenkripsi bidang. Saat Anda menulis nilai baru ke bidang terenkripsi yang dikonfigurasi untuk enkripsi yang dapat dicari, SDK Enkripsi AWS Database menghitung HMAC di atas nilai teks biasa. Output HMAC ini adalah kecocokan satu-ke-satu (1:1) untuk nilai plaintext dari bidang itu. Output HMAC terpotong sehingga beberapa nilai plaintext yang berbeda dipetakan ke tag HMAC terpotong yang sama. Positif palsu ini membatasi kemampuan pengguna yang tidak sah untuk mengidentifikasi informasi yang membedakan tentang nilai plaintext. Saat Anda menanyakan suar, SDK Enkripsi AWS Database secara otomatis menyaring positif palsu ini dan mengembalikan hasil teks biasa dari kueri Anda.

Jumlah rata-rata positif palsu yang dihasilkan untuk setiap suar ditentukan oleh panjang suar yang tersisa setelah pemotongan. Untuk bantuan menentukan panjang suar yang sesuai untuk implementasi Anda, lihat [Menentukan panjang suar](choosing-beacon-length.md).

**catatan**  
Enkripsi yang dapat dicari dirancang untuk diimplementasikan dalam database baru yang tidak terisi. Setiap suar yang dikonfigurasi dalam database yang ada hanya akan memetakan catatan baru yang diunggah ke database, tidak ada cara bagi suar untuk memetakan data yang ada.

**Topik**
+ [Apakah beacon tepat untuk dataset saya?](#are-beacons-right-for-me)
+ [Skenario enkripsi yang dapat dicari](#beacon-overview-example)

## Apakah beacon tepat untuk dataset saya?
<a name="are-beacons-right-for-me"></a>

Menggunakan beacon untuk melakukan kueri pada data terenkripsi mengurangi biaya kinerja yang terkait dengan database terenkripsi sisi klien. Saat Anda menggunakan beacon, ada tradeoff yang melekat antara seberapa efisien kueri Anda dan seberapa banyak informasi yang terungkap tentang distribusi data Anda. Beacon tidak mengubah status lapangan yang dienkripsi. Saat Anda mengenkripsi dan menandatangani bidang dengan AWS Database Encryption SDK, nilai plaintext bidang tersebut tidak pernah terpapar ke database. Basis data menyimpan nilai bidang yang dienkripsi secara acak.

Beacon disimpan di samping bidang terenkripsi tempat mereka dihitung. Ini berarti bahwa meskipun pengguna yang tidak sah tidak dapat melihat nilai teks biasa dari bidang terenkripsi, mereka mungkin dapat melakukan analisis statistik pada beacon untuk mempelajari lebih lanjut tentang distribusi kumpulan data Anda, dan, dalam kasus ekstrim, mengidentifikasi nilai teks biasa yang dipetakan oleh beacon. Cara Anda mengkonfigurasi beacon Anda dapat mengurangi risiko ini. Secara khusus, [memilih panjang suar yang tepat](choosing-beacon-length.md) dapat membantu Anda menjaga kerahasiaan kumpulan data Anda.

**Keamanan vs Kinerja**
+ Semakin pendek panjang suar, semakin banyak keamanan yang dipertahankan.
+ Semakin panjang panjang suar, semakin banyak kinerja yang dipertahankan.

Enkripsi yang dapat dicari mungkin tidak dapat memberikan tingkat kinerja dan keamanan yang diinginkan untuk semua kumpulan data. Tinjau model ancaman, persyaratan keamanan, dan kebutuhan kinerja Anda sebelum mengonfigurasi suar apa pun.

Pertimbangkan persyaratan keunikan kumpulan data berikut saat Anda menentukan apakah enkripsi yang dapat dicari tepat untuk kumpulan data Anda.

**Distribusi**  
Jumlah keamanan yang dipertahankan oleh suar tergantung pada distribusi kumpulan data Anda. Saat Anda mengonfigurasi bidang terenkripsi untuk enkripsi yang dapat dicari, SDK Enkripsi AWS Database menghitung HMAC atas nilai teks biasa yang ditulis ke bidang tersebut. Semua beacon yang dihitung untuk bidang tertentu dihitung menggunakan kunci yang sama, dengan pengecualian database multitenant yang menggunakan kunci berbeda untuk setiap penyewa. Ini berarti bahwa jika nilai plaintext yang sama ditulis ke bidang beberapa kali, tag HMAC yang sama dibuat untuk setiap instance dari nilai plaintext tersebut.  
Anda harus menghindari membangun beacon dari bidang yang berisi nilai yang sangat umum. Misalnya, pertimbangkan database yang menyimpan alamat setiap penduduk negara bagian Illinois. Jika Anda membangun suar dari `City` bidang terenkripsi, suar yang dihitung di atas “Chicago” akan terwakili secara berlebihan karena persentase besar populasi Illinois yang tinggal di Chicago. Bahkan jika pengguna yang tidak sah hanya dapat membaca nilai terenkripsi dan nilai suar, mereka mungkin dapat mengidentifikasi catatan mana yang berisi data untuk penduduk Chicago jika suar mempertahankan distribusi ini. Untuk meminimalkan jumlah informasi pembeda yang terungkap tentang distribusi Anda, Anda harus memotong suar Anda dengan cukup. Panjang suar yang diperlukan untuk menyembunyikan distribusi yang tidak merata ini memiliki biaya kinerja yang signifikan yang mungkin tidak memenuhi kebutuhan aplikasi Anda.  
Anda harus hati-hati menganalisis distribusi dataset Anda untuk menentukan berapa banyak beacon Anda perlu dipotong. Panjang suar yang tersisa setelah pemotongan secara langsung berkorelasi dengan jumlah informasi statistik yang dapat diidentifikasi tentang distribusi Anda. Anda mungkin perlu memilih panjang suar yang lebih pendek untuk meminimalkan jumlah informasi pembeda yang terungkap tentang kumpulan data Anda.  
Dalam kasus ekstrim, Anda tidak dapat menghitung panjang suar untuk kumpulan data terdistribusi tidak merata yang secara efektif menyeimbangkan kinerja dan keamanan. Misalnya, Anda tidak boleh membuat suar dari bidang yang menyimpan hasil tes medis untuk penyakit langka. Karena `NEGATIVE` hasil diharapkan secara signifikan lebih umum dalam kumpulan data, `POSITIVE` hasil dapat dengan mudah diidentifikasi dengan seberapa jarang hasilnya. Sangat menantang untuk menyembunyikan distribusi ketika bidang hanya memiliki dua nilai yang mungkin. Jika Anda menggunakan panjang suar yang cukup pendek untuk menyembunyikan distribusi, semua nilai plaintext dipetakan ke tag HMAC yang sama. Jika Anda menggunakan panjang suar yang lebih panjang, jelas beacon mana yang memetakan ke nilai teks biasa. `POSITIVE`

**Korelasi**  
Kami sangat menyarankan agar Anda menghindari pembuatan beacon yang berbeda dari bidang dengan nilai yang berkorelasi. Beacon yang dibangun dari bidang berkorelasi memerlukan panjang suar yang lebih pendek untuk meminimalkan jumlah informasi yang terungkap tentang distribusi setiap kumpulan data ke pengguna yang tidak sah. Anda harus menganalisis kumpulan data Anda dengan cermat, termasuk entropi dan distribusi gabungan dari nilai yang berkorelasi, untuk menentukan berapa banyak beacon Anda perlu dipotong. Jika panjang suar yang dihasilkan tidak memenuhi kebutuhan kinerja Anda, maka beacon mungkin tidak cocok untuk kumpulan data Anda.  
Misalnya, Anda tidak boleh membuat dua beacon terpisah dari `City` dan `ZIPCode` bidang karena kode ZIP kemungkinan akan dikaitkan dengan hanya satu kota. Biasanya, positif palsu yang dihasilkan oleh suar membatasi kemampuan pengguna yang tidak sah untuk mengidentifikasi informasi yang membedakan tentang kumpulan data Anda. Tetapi korelasi antara `ZIPCode` bidang `City` dan berarti bahwa pengguna yang tidak sah dapat dengan mudah mengidentifikasi hasil mana yang positif palsu dan membedakan kode ZIP yang berbeda.  
Anda juga harus menghindari pembuatan beacon dari bidang yang berisi nilai plaintext yang sama. Misalnya, Anda tidak boleh membuat suar dari `mobilePhone` dan `preferredPhone` bidang karena kemungkinan memiliki nilai yang sama. Jika Anda membuat beacon yang berbeda dari kedua bidang, AWS Database Encryption SDK akan membuat beacon untuk setiap bidang di bawah kunci yang berbeda. Ini menghasilkan dua tag HMAC yang berbeda untuk nilai plaintext yang sama. Dua beacon yang berbeda tidak mungkin memiliki positif palsu yang sama dan pengguna yang tidak sah mungkin dapat membedakan nomor telepon yang berbeda.

Bahkan jika kumpulan data Anda berisi bidang yang berkorelasi atau memiliki distribusi yang tidak merata, Anda mungkin dapat membangun beacon yang menjaga kerahasiaan kumpulan data Anda dengan menggunakan panjang suar yang lebih pendek. Namun, panjang suar tidak menjamin bahwa setiap nilai unik dalam kumpulan data Anda akan menghasilkan sejumlah positif palsu yang secara efektif meminimalkan jumlah informasi pembeda yang terungkap tentang kumpulan data Anda. Panjang suar hanya memperkirakan jumlah rata-rata positif palsu yang dihasilkan. Semakin terdistribusi kumpulan data Anda secara tidak merata, panjang suar yang kurang efektif dalam menentukan jumlah rata-rata positif palsu yang dihasilkan.

Pertimbangkan dengan cermat distribusi bidang tempat Anda membangun suar dan pertimbangkan berapa banyak yang Anda perlukan untuk memotong panjang suar untuk memenuhi persyaratan keamanan Anda. Topik-topik berikut dalam Bab ini mengasumsikan bahwa beacon Anda didistribusikan secara seragam dan tidak mengandung data yang berkorelasi.

## Skenario enkripsi yang dapat dicari
<a name="beacon-overview-example"></a>

Contoh berikut menunjukkan solusi enkripsi yang dapat dicari sederhana. Dalam aplikasi, bidang contoh yang digunakan dalam contoh ini mungkin tidak memenuhi rekomendasi keunikan distribusi dan korelasi untuk beacon. Anda dapat menggunakan contoh ini untuk referensi saat Anda membaca tentang konsep enkripsi yang dapat dicari di Bab ini.

Pertimbangkan database bernama `Employees` yang melacak data karyawan untuk perusahaan. *Setiap record dalam database berisi bidang yang disebut *EmployeeId *LastName**, *FirstName*, dan Address.* Setiap bidang dalam `Employees` database diidentifikasi oleh kunci utama`EmployeeID`.

Berikut ini adalah contoh catatan plaintext dalam database.

```
{
    "EmployeeID": 101,
    "LastName": "Jones",
    "FirstName": "Mary",
    "Address": {
                "Street": "123 Main",
                "City": "Anytown",
                "State": "OH",
                "ZIPCode": 12345
    }
}
```

Jika Anda menandai `LastName` dan `FirstName` bidang seperti `ENCRYPT_AND_SIGN` dalam [tindakan kriptografi](concepts.md#crypt-actions) Anda, nilai dalam bidang ini dienkripsi secara lokal sebelum diunggah ke database. Data terenkripsi yang diunggah sepenuhnya acak, database tidak mengenali data ini sebagai dilindungi. Itu hanya mendeteksi entri data yang khas. Ini berarti bahwa catatan yang sebenarnya disimpan dalam database mungkin terlihat seperti berikut.

```
{
    "PersonID": 101,
    "LastName": "1d76e94a2063578637d51371b363c9682bad926cbd",
    "FirstName": "21d6d54b0aaabc411e9f9b34b6d53aa4ef3b0a35",
    "Address": {
                "Street": "123 Main",
                "City": "Anytown",
                "State": "OH",
                "ZIPCode": 12345
    }
}
```

Jika Anda perlu menanyakan database untuk kecocokan persis di `LastName` bidang, [konfigurasikan suar standar](configure-beacons.md#config-standard-beacons) bernama *LastName*untuk memetakan nilai teks biasa yang ditulis ke `LastName` bidang ke nilai terenkripsi yang disimpan dalam database.

Beacon ini menghitung HMACs dari nilai plaintext di lapangan. `LastName` Setiap output HMAC terpotong sehingga tidak lagi cocok dengan nilai plaintext. Misalnya, hash lengkap dan hash terpotong untuk `Jones` mungkin terlihat seperti berikut ini.

**Hash lengkap**

`2aa4e9b404c68182562b6ec761fcca5306de527826a69468885e59dc36d0c3f824bdd44cab45526f70a2a18322000264f5451acf75f9f817e2b35099d408c833`

**Hash terpotong**

`b35099d408c833`

Setelah suar standar dikonfigurasi, Anda dapat melakukan pencarian kesetaraan di lapangan. `LastName` Misalnya, jika Anda ingin mencari`Jones`, gunakan *LastName*suar untuk melakukan kueri berikut.

```
LastName = Jones
```

SDK Enkripsi AWS Database secara otomatis menyaring positif palsu dan mengembalikan hasil teks biasa dari kueri Anda.

# Beacon
<a name="beacons"></a>


****  

|  | 
| --- |
| Pustaka enkripsi sisi klien kami diubah namanya menjadi SDK Enkripsi AWS Database. Panduan pengembang ini masih memberikan informasi tentang Klien Enkripsi [DynamoDB](legacy-dynamodb-encryption-client.md). | 

Beacon adalah tag Hash Based Message Authentication Code (HMAC) terpotong yang membuat peta antara nilai plaintext yang ditulis ke bidang dan nilai terenkripsi yang sebenarnya disimpan dalam database Anda. Beacon tidak mengubah status lapangan yang dienkripsi. Beacon menghitung HMAC atas nilai plaintext bidang dan menyimpannya di samping nilai terenkripsi. Output HMAC ini adalah kecocokan satu-ke-satu (1:1) untuk nilai plaintext dari bidang itu. Output HMAC terpotong sehingga beberapa nilai plaintext yang berbeda dipetakan ke tag HMAC terpotong yang sama. Positif palsu ini membatasi kemampuan pengguna yang tidak sah untuk mengidentifikasi informasi yang membedakan tentang nilai plaintext.

Beacon hanya dapat dibangun dari bidang yang ditandai`ENCRYPT_AND_SIGN`,`SIGN_ONLY`, atau `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` dalam tindakan [kriptografi](concepts.md#crypt-actions) Anda. Suar itu sendiri tidak ditandatangani atau dienkripsi. Anda tidak dapat membangun suar dengan bidang yang ditandai. `DO_NOTHING`

Jenis suar yang Anda konfigurasikan menentukan jenis kueri yang dapat Anda lakukan. Ada dua jenis beacon yang mendukung enkripsi yang dapat dicari. *Suar standar* melakukan pencarian kesetaraan. *Compound beacon* menggabungkan string plaintext literal dan beacon standar untuk melakukan operasi database yang kompleks. Setelah [Anda mengkonfigurasi beacon](configure-beacons.md) Anda, Anda harus mengkonfigurasi indeks sekunder untuk setiap suar sebelum Anda dapat mencari di bidang terenkripsi. Untuk informasi selengkapnya, lihat [Mengkonfigurasi indeks sekunder dengan beacon](ddb-searchable-encryption.md#ddb-beacon-indexes).

**Topics**
+ [Suar standar](#standard-beacon-overview)
+ [Suar majemuk](#compound-beacon-overview)

## Suar standar
<a name="standard-beacon-overview"></a>

Beacon standar adalah cara paling sederhana untuk menerapkan enkripsi yang dapat dicari di database Anda. Mereka hanya dapat melakukan pencarian kesetaraan untuk satu bidang terenkripsi atau virtual. Untuk mempelajari cara mengonfigurasi suar standar, lihat [Mengonfigurasi](configure-beacons.md#config-standard-beacons) suar standar.



Bidang tempat suar standar dibangun dari disebut sumber *suar*. Ini mengidentifikasi lokasi data yang perlu dipetakan oleh suar. *Sumber suar dapat berupa bidang terenkripsi atau bidang virtual.* Sumber suar di setiap suar standar harus unik. Anda tidak dapat mengonfigurasi dua beacon dengan sumber suar yang sama.

Beacon standar dapat digunakan untuk melakukan pencarian kesetaraan untuk bidang terenkripsi atau virtual. Atau, mereka dapat digunakan untuk membangun suar majemuk untuk melakukan operasi database yang lebih kompleks. Untuk membantu Anda mengatur dan mengelola beacon standar, AWS Database Encryption SDK menyediakan *gaya beacon* opsional berikut yang menentukan tujuan penggunaan suar standar. Untuk informasi selengkapnya lihat, [Mendefinisikan gaya suar](configure-beacons.md#define-beacon-styles).

Anda dapat membuat suar standar yang melakukan pencarian kesetaraan untuk satu bidang terenkripsi, atau Anda dapat membuat suar standar yang melakukan pencarian kesetaraan pada rangkaian beberapa,, dan bidang dengan membuat bidang virtual. `ENCRYPT_AND_SIGN` `SIGN_ONLY` `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`



**Bidang virtual**  
Bidang virtual adalah bidang konseptual yang dibangun dari satu atau lebih bidang sumber. Membuat bidang virtual tidak menulis bidang baru ke catatan Anda. Bidang virtual tidak secara eksplisit disimpan dalam database Anda. Ini digunakan dalam konfigurasi suar standar untuk memberikan instruksi suar tentang cara mengidentifikasi segmen tertentu dari bidang atau menggabungkan beberapa bidang dalam catatan untuk melakukan kueri tertentu. Bidang virtual membutuhkan setidaknya satu bidang terenkripsi.   
Contoh berikut menunjukkan jenis transformasi dan kueri yang dapat Anda lakukan dengan bidang virtual. Dalam aplikasi, bidang contoh yang digunakan dalam contoh ini mungkin tidak memenuhi rekomendasi keunikan [distribusi](searchable-encryption.md#searchable-encryption-distribution) dan [korelasi](searchable-encryption.md#searchable-encryption-correlated-values) untuk beacon.
Misalnya, jika Anda ingin melakukan pencarian kesetaraan pada rangkaian `FirstName` dan `LastName` bidang, Anda dapat membuat salah satu bidang virtual berikut.  
+ `NameTag`Bidang virtual, dibangun dari huruf pertama `FirstName` lapangan, diikuti oleh `LastName` bidang, semuanya dalam huruf kecil. Bidang virtual ini memungkinkan Anda untuk melakukan query`NameTag=mjones`.
+ `LastFirst`Bidang virtual, yang dibangun dari `LastName` lapangan, diikuti oleh `FirstName` lapangan. Bidang virtual ini memungkinkan Anda untuk melakukan query`LastFirst=JonesMary`.
Atau, jika Anda ingin melakukan pencarian kesetaraan pada segmen tertentu dari bidang terenkripsi, buat bidang virtual yang mengidentifikasi segmen yang ingin Anda kueri.  
Misalnya, jika Anda ingin menanyakan `IPAddress` bidang terenkripsi menggunakan tiga segmen pertama dari alamat IP, buat bidang virtual berikut.  
+ `IPSegment`Bidang virtual, dibangun dari`Segments(‘.’, 0, 3)`. Bidang virtual ini memungkinkan Anda untuk melakukan query`IPSegment=192.0.2`. Kueri mengembalikan semua catatan dengan `IPAddress` nilai yang dimulai dengan “192.0.2".
Bidang virtual harus unik. Dua bidang virtual tidak dapat dibangun dari bidang sumber yang sama persis.  
Untuk bantuan mengonfigurasi bidang virtual dan beacon yang menggunakannya, lihat [Membuat](configure-beacons.md#create-virtual-field) bidang virtual.

## Suar majemuk
<a name="compound-beacon-overview"></a>

Compound beacon membuat indeks yang meningkatkan kinerja kueri dan memungkinkan Anda melakukan operasi database yang lebih kompleks. Anda dapat menggunakan suar majemuk untuk menggabungkan string teks biasa literal dan suar standar untuk melakukan kueri kompleks pada catatan terenkripsi, seperti menanyakan dua jenis rekaman yang berbeda dari satu indeks atau menanyakan kombinasi bidang dengan kunci pengurutan. Untuk contoh solusi suar majemuk lainnya, lihat [Memilih jenis suar](choosing-beacon-type.md).

Suar majemuk dapat dibangun dari suar standar atau kombinasi beacon standar dan bidang yang ditandatangani. Mereka dibangun dari daftar bagian. Semua suar majemuk harus menyertakan daftar [bagian terenkripsi yang](configure-beacons.md#encrypted-parts) mengidentifikasi `ENCRYPT_AND_SIGN` bidang yang termasuk dalam suar. Setiap `ENCRYPT_AND_SIGN` bidang harus diidentifikasi dengan suar standar. Suar majemuk yang lebih kompleks mungkin juga mencakup daftar [bagian yang ditandatangani](configure-beacons.md#signed-parts) yang mengidentifikasi teks biasa `SIGN_ONLY` atau `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` bidang yang termasuk dalam suar, dan daftar [bagian konstruktor](configure-beacons.md#constructor-parts) yang mengidentifikasi semua kemungkinan cara suar majemuk dapat merakit bidang.

**catatan**  
 AWS Database Encryption SDK juga mendukung *beacon bertanda tangan* yang dapat dikonfigurasi seluruhnya dari `SIGN_ONLY` plaintext dan field. `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` Signed beacon adalah jenis suar majemuk yang mengindeks dan melakukan kueri kompleks pada bidang yang ditandatangani, tetapi tidak dienkripsi. Untuk informasi selengkapnya, lihat [Membuat beacon yang ditandatangani](configure.md#signed-beacons).

Untuk bantuan mengonfigurasi suar majemuk, lihat [Mengonfigurasi](configure-beacons.md#config-compound-beacons) suar majemuk.

Cara Anda mengonfigurasi suar majemuk menentukan jenis kueri yang dapat dilakukannya. Misalnya, Anda dapat membuat beberapa bagian terenkripsi dan ditandatangani opsional untuk memungkinkan lebih banyak fleksibilitas dalam kueri Anda. Untuk informasi lebih lanjut tentang jenis kueri yang dapat dilakukan oleh suar majemuk, lihat. [Meminta suar](using-beacons.md#querying-beacons)

# Merencanakan suar
<a name="plan-searchable-encryption"></a>


****  

|  | 
| --- |
| Pustaka enkripsi sisi klien kami diubah namanya menjadi SDK Enkripsi AWS Database. Panduan pengembang ini masih memberikan informasi tentang Klien Enkripsi [DynamoDB](legacy-dynamodb-encryption-client.md). | 

Beacon dirancang untuk diimplementasikan dalam database baru yang tidak berpenghuni. Setiap suar yang dikonfigurasi dalam database yang ada hanya akan memetakan catatan baru yang ditulis ke database. Beacon dihitung dari nilai plaintext bidang, setelah bidang dienkripsi, tidak ada cara bagi beacon untuk memetakan data yang ada. Setelah Anda menulis catatan baru dengan suar, Anda tidak dapat memperbarui konfigurasi suar. Namun, Anda dapat menambahkan beacon baru untuk bidang baru yang Anda tambahkan ke catatan Anda.

Untuk menerapkan enkripsi yang dapat dicari, Anda harus menggunakan [keyring AWS KMS Hierarkis](use-hierarchical-keyring.md) untuk menghasilkan, mengenkripsi, dan mendekripsi kunci data yang digunakan untuk melindungi catatan Anda. Untuk informasi selengkapnya, lihat [Menggunakan keyring Hierarkis untuk enkripsi yang dapat dicari](use-hierarchical-keyring.md#searchable-encryption-hierarchical-keyrings).

Sebelum Anda dapat mengonfigurasi [beacon](searchable-encryption.md#beacon-definition) untuk enkripsi yang dapat dicari, Anda perlu meninjau persyaratan enkripsi, pola akses database, dan model ancaman untuk menentukan solusi terbaik untuk database Anda.

[Jenis suar](beacons.md) yang Anda konfigurasikan menentukan jenis kueri yang dapat Anda lakukan. [Panjang suar](choosing-beacon-length.md) yang Anda tentukan dalam konfigurasi suar standar menentukan jumlah positif palsu yang diharapkan yang dihasilkan untuk suar tertentu. Kami sangat menyarankan untuk mengidentifikasi dan merencanakan jenis kueri yang perlu Anda lakukan sebelum mengonfigurasi beacon Anda. Setelah Anda menggunakan suar, konfigurasi tidak dapat diperbarui.

Kami sangat menyarankan Anda meninjau dan menyelesaikan tugas-tugas berikut sebelum Anda mengonfigurasi beacon apa pun.
+ [Tentukan apakah beacon tepat untuk kumpulan data Anda](searchable-encryption.md#are-beacons-right-for-me)
+ [Pilih jenis suar](choosing-beacon-type.md)
+ [Pilih panjang suar](choosing-beacon-length.md)
+ [Pilih nama suar](choosing-beacon-name.md)

Ingat persyaratan keunikan beacon berikut saat Anda merencanakan solusi enkripsi yang dapat dicari untuk database Anda.
+ **[Setiap suar standar harus memiliki sumber suar yang unik](beacons.md#beacon-source)**

  Beberapa beacon standar tidak dapat dibangun dari bidang terenkripsi atau virtual yang sama. 

  Namun, suar standar tunggal dapat digunakan untuk membangun beberapa suar majemuk.
+ **Hindari membuat bidang virtual dengan bidang sumber yang tumpang tindih dengan beacon standar yang ada**

  Membangun suar standar dari bidang virtual yang berisi bidang sumber yang digunakan untuk membuat suar standar lain dapat mengurangi keamanan kedua beacon.

  Untuk informasi selengkapnya, lihat [Pertimbangan keamanan untuk bidang virtual](configure-beacons.md#virtual-field-considerations).

## Pertimbangan untuk database multitenant
<a name="planning-multitenant-beacons"></a>

Untuk menanyakan suar yang dikonfigurasi dalam database multitenant, Anda harus menyertakan bidang yang menyimpan `branch-key-id` terkait dengan penyewa yang mengenkripsi catatan dalam kueri Anda. Anda menentukan bidang ini ketika Anda [menentukan sumber kunci suar](use-hierarchical-keyring.md#beacon-key-source). Agar kueri berhasil, nilai di bidang ini harus mengidentifikasi bahan kunci suar yang sesuai yang diperlukan untuk menghitung ulang suar.

Sebelum Anda mengkonfigurasi beacon Anda, Anda harus memutuskan bagaimana Anda berencana untuk memasukkan `branch-key-id` dalam kueri Anda. Untuk informasi selengkapnya tentang berbagai cara yang dapat Anda sertakan `branch-key-id` dalam kueri, lihat[Menanyakan beacon dalam database multitenant](searchable-encryption-multitenant.md#query-multitenant-beacons).

# Memilih jenis suar
<a name="choosing-beacon-type"></a>


****  

|  | 
| --- |
| Pustaka enkripsi sisi klien kami diubah namanya menjadi SDK Enkripsi AWS Database. Panduan pengembang ini masih memberikan informasi tentang Klien Enkripsi [DynamoDB](legacy-dynamodb-encryption-client.md). | 

*Dengan enkripsi yang dapat dicari, Anda dapat mencari catatan terenkripsi dengan memetakan nilai teks biasa di bidang terenkripsi dengan suar.* Jenis suar yang Anda konfigurasikan menentukan jenis kueri yang dapat Anda lakukan.

Kami sangat menyarankan untuk mengidentifikasi dan merencanakan jenis kueri yang perlu Anda lakukan sebelum mengonfigurasi beacon Anda. Setelah [Anda mengkonfigurasi beacon](configure-beacons.md) Anda, Anda harus mengkonfigurasi indeks sekunder untuk setiap suar sebelum Anda dapat mencari di bidang terenkripsi. Untuk informasi selengkapnya, lihat [Mengkonfigurasi indeks sekunder dengan beacon](ddb-searchable-encryption.md#ddb-beacon-indexes).

Beacon membuat peta antara nilai plaintext yang ditulis ke bidang dan nilai terenkripsi yang sebenarnya disimpan dalam database Anda. Anda tidak dapat membandingkan nilai dari dua beacon standar, bahkan jika mereka mengandung plaintext dasar yang sama. Dua beacon standar akan menghasilkan dua tag HMAC yang berbeda untuk nilai plaintext yang sama. Akibatnya, beacon standar tidak dapat melakukan kueri berikut.
+ `beacon1 = beacon2`
+ `beacon1 IN (beacon2)`
+ `value IN (beacon1, beacon2, ...)`
+ `CONTAINS(beacon1, beacon2)`

Anda hanya dapat melakukan kueri di atas jika Anda membandingkan [bagian yang ditandatangani](configure-beacons.md#signed-parts) dari suar majemuk, dengan pengecualian `CONTAINS` operator, yang dapat Anda gunakan dengan suar majemuk untuk mengidentifikasi seluruh nilai bidang terenkripsi atau ditandatangani yang berisi suar rakitan. Ketika Anda membandingkan bagian yang ditandatangani, Anda dapat secara opsional menyertakan awalan dari [bagian terenkripsi](configure-beacons.md#encrypted-parts), tetapi Anda tidak dapat menyertakan nilai terenkripsi bidang. [Untuk informasi selengkapnya tentang jenis kueri yang dapat dilakukan oleh beacon standar dan gabungan, lihat Menanyakan suar.](using-beacons.md#querying-beacons)

Pertimbangkan solusi enkripsi yang dapat dicari berikut saat Anda meninjau pola akses database Anda. Contoh berikut menentukan suar mana yang akan dikonfigurasi untuk memenuhi persyaratan enkripsi dan kueri yang berbeda.

## Beacon standar
<a name="plan-standard-beacon"></a>

[Beacon standar](beacons.md#standard-beacon-overview) hanya dapat melakukan pencarian kesetaraan. Anda dapat menggunakan beacon standar untuk melakukan kueri berikut.

### Kueri satu bidang terenkripsi
<a name="se-example1"></a>

Jika Anda ingin mengidentifikasi catatan yang berisi nilai tertentu untuk bidang terenkripsi, buat suar standar.

#### Contoh
<a name="example1"></a>

Untuk contoh berikut, pertimbangkan database bernama `UnitInspection` yang melacak data inspeksi untuk fasilitas produksi. Setiap catatan dalam database berisi bidang yang disebut`work_id`,`inspection_date`,`inspector_id_last4`, dan`unit`. ID inspektur lengkap adalah angka antara 0—999.999.999. Namun, untuk memastikan bahwa kumpulan data didistribusikan secara merata, `inspector_id_last4` satu-satunya menyimpan empat digit terakhir dari ID inspektur. Setiap bidang dalam database diidentifikasi oleh kunci utama`work_id`. `unit`Bidang `inspector_id_last4` dan ditandai `ENCRYPT_AND_SIGN` dalam [tindakan kriptografi](concepts.md#crypt-actions).

Berikut ini adalah contoh entri plaintext dalam database. `UnitInspection`

```
{
    "work_id": "1c7fcff3-6e74-41a8-b7f7-925dc039830b",
    "inspection_date": 2023-06-07,
    "inspector_id_last4": 8744,
    "unit": 229304973450   
}
```

**Kueri satu bidang terenkripsi dalam catatan**  
Jika `inspector_id_last4` bidang perlu dienkripsi, tetapi Anda masih memerlukan kueri untuk kecocokan yang tepat, buat suar standar dari bidang tersebut. `inspector_id_last4` Kemudian, gunakan suar standar untuk membuat indeks sekunder. Anda dapat menggunakan indeks sekunder ini untuk kueri pada bidang terenkripsi. `inspector_id_last4`

Untuk bantuan mengonfigurasi suar standar, lihat [Mengonfigurasi](configure-beacons.md#config-standard-beacons) suar standar.

### Kueri bidang virtual
<a name="se-example2"></a>

Bidang [virtual adalah bidang](beacons.md#virtual-field) konseptual yang dibangun dari satu atau lebih bidang sumber. Jika Anda ingin melakukan pencarian kesetaraan untuk segmen tertentu dari bidang terenkripsi, atau melakukan pencarian kesetaraan pada rangkaian beberapa bidang, buat suar standar dari bidang virtual. Semua bidang virtual harus menyertakan setidaknya satu bidang sumber terenkripsi.

#### Contoh
<a name="example2"></a>

Contoh berikut membuat bidang virtual untuk `Employees` database. Berikut ini adalah contoh catatan plaintext dalam database. `Employees`

```
{
    "EmployeeID": 101,
    "SSN": 000-00-0000,
    "LastName": "Jones",
    "FirstName": "Mary",
    "Address": {
                "Street": "123 Main",
                "City": "Anytown",
                "State": "OH",
                "ZIPCode": 12345
    }
}
```

**Kueri segmen bidang terenkripsi**  
Untuk contoh ini, `SSN` bidang dienkripsi.  
Jika Anda ingin menanyakan `SSN` bidang menggunakan empat digit terakhir dari nomor jaminan sosial, buat bidang virtual yang mengidentifikasi segmen yang ingin Anda kueri.  
`Last4SSN`Bidang virtual, dibangun dari `Suffix(4)` memungkinkan Anda untuk query`Last4SSN=0000`. Gunakan bidang virtual ini untuk membangun suar standar. Kemudian, gunakan suar standar untuk membuat indeks sekunder. Anda dapat menggunakan indeks sekunder ini untuk kueri pada bidang virtual. Kueri ini mengembalikan semua catatan dengan `SSN` nilai yang berakhir dengan empat digit terakhir yang Anda tentukan.

**Kueri penggabungan beberapa bidang**  
Contoh berikut menunjukkan jenis transformasi dan kueri yang dapat Anda lakukan dengan bidang virtual. Dalam aplikasi, bidang contoh yang digunakan dalam contoh ini mungkin tidak memenuhi rekomendasi keunikan [distribusi](searchable-encryption.md#searchable-encryption-distribution) dan [korelasi](searchable-encryption.md#searchable-encryption-correlated-values) untuk beacon.
Jika Anda ingin melakukan pencarian kesetaraan pada rangkaian `FirstName` dan bidang, Anda dapat membuat `LastName` bidang virtual, dibangun dari huruf pertama `NameTag` bidang, diikuti oleh `FirstName` bidang, semuanya dalam `LastName` huruf kecil. Gunakan bidang virtual ini untuk membangun suar standar. Kemudian, gunakan suar standar untuk membuat indeks sekunder. Anda dapat menggunakan indeks sekunder ini untuk kueri `NameTag=mjones` pada bidang virtual.  
Setidaknya salah satu bidang sumber harus dienkripsi. Entah `FirstName` atau `LastName` bisa dienkripsi, atau keduanya bisa dienkripsi. Setiap bidang sumber teks biasa harus ditandai sebagai `SIGN_ONLY` atau `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` dalam tindakan [kriptografi](concepts.md#crypt-actions) Anda.

Untuk bantuan mengonfigurasi bidang virtual dan beacon yang menggunakannya, lihat [Membuat](configure-beacons.md#create-virtual-field) bidang virtual.

## Suar majemuk
<a name="plan-compound-beacons"></a>

[Compound beacon](beacons.md#compound-beacon-overview) membuat indeks dari string plaintext literal dan beacon standar untuk melakukan operasi database yang kompleks. Anda dapat menggunakan suar majemuk untuk melakukan kueri berikut.

### Kueri kombinasi bidang terenkripsi pada satu indeks
<a name="se-example3"></a>

Jika Anda perlu menanyakan kombinasi bidang terenkripsi pada satu indeks, buat suar majemuk yang menggabungkan beacon standar individual yang dibangun untuk setiap bidang terenkripsi untuk membentuk indeks tunggal.

Setelah mengonfigurasi suar majemuk, Anda dapat membuat indeks sekunder yang menentukan suar majemuk sebagai kunci partisi untuk melakukan kueri pencocokan persis atau dengan kunci pengurutan untuk melakukan kueri yang lebih kompleks. Indeks sekunder yang menentukan suar majemuk sebagai kunci pengurutan dapat melakukan kueri pencocokan persis dan kueri kompleks yang lebih disesuaikan.

#### Contoh
<a name="example3"></a>

Untuk contoh berikut, pertimbangkan database bernama `UnitInspection` yang melacak data inspeksi untuk fasilitas produksi. Setiap catatan dalam database berisi bidang yang disebut`work_id`,`inspection_date`,`inspector_id_last4`, dan`unit`. ID inspektur lengkap adalah angka antara 0—999.999.999. Namun, untuk memastikan bahwa kumpulan data didistribusikan secara merata, `inspector_id_last4` satu-satunya menyimpan empat digit terakhir dari ID inspektur. Setiap bidang dalam database diidentifikasi oleh kunci utama`work_id`. `unit`Bidang `inspector_id_last4` dan ditandai `ENCRYPT_AND_SIGN` dalam [tindakan kriptografi](concepts.md#crypt-actions).

Berikut ini adalah contoh entri plaintext dalam database. `UnitInspection`

```
{
    "work_id": "1c7fcff3-6e74-41a8-b7f7-925dc039830b",
    "inspection_date": 2023-06-07,
    "inspector_id_last4": 8744,
    "unit": 229304973450
}
```

**Lakukan pencarian kesetaraan pada kombinasi bidang terenkripsi**  
Jika Anda ingin menanyakan `UnitInspection` database untuk pencocokan yang tepat`inspector_id_last4.unit`, pertama-tama buat beacon standar yang berbeda untuk bidang `inspector_id_last4` dan`unit`. Kemudian, buat suar majemuk dari dua suar standar.  
Setelah Anda mengkonfigurasi suar majemuk, buat indeks sekunder yang menentukan suar majemuk sebagai kunci partisi. Gunakan indeks sekunder ini untuk menanyakan kecocokan yang tepat pada`inspector_id_last4.unit`. Misalnya, Anda dapat menanyakan suar ini untuk menemukan daftar inspeksi yang dilakukan inspektur untuk unit tertentu.

**Lakukan kueri kompleks pada kombinasi bidang terenkripsi**  
Jika Anda ingin menanyakan `UnitInspection` database pada `inspector_id_last4` dan`inspector_id_last4.unit`, pertama buat beacon standar yang berbeda untuk `inspector_id_last4` dan `unit` bidang. Kemudian, buat suar majemuk dari dua suar standar.  
Setelah Anda mengkonfigurasi suar majemuk, buat indeks sekunder yang menentukan suar majemuk sebagai kunci pengurutan. Gunakan indeks sekunder ini untuk menanyakan `UnitInspection` database untuk entri yang dimulai dengan inspektur tertentu atau kueri database untuk daftar semua unit dalam rentang ID unit tertentu yang diperiksa oleh inspektur tertentu. Anda juga dapat melakukan pencarian kecocokan tepat pada`inspector_id_last4.unit`.

Untuk bantuan mengonfigurasi suar majemuk, lihat [Mengonfigurasi](configure-beacons.md#config-compound-beacons) suar majemuk.

### Kueri kombinasi bidang terenkripsi dan teks biasa pada satu indeks
<a name="se-example4"></a>

Jika Anda perlu menanyakan kombinasi bidang terenkripsi dan teks biasa pada satu indeks, buat suar majemuk yang menggabungkan beacon standar individu dan bidang teks biasa untuk membentuk indeks tunggal. [Bidang plaintext yang digunakan untuk membangun suar majemuk harus ditandai `SIGN_ONLY` atau `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` dalam tindakan kriptografi Anda.](concepts.md#crypt-actions)

Setelah mengonfigurasi suar majemuk, Anda dapat membuat indeks sekunder yang menentukan suar majemuk sebagai kunci partisi untuk melakukan kueri pencocokan persis atau dengan kunci pengurutan untuk melakukan kueri yang lebih kompleks. Indeks sekunder yang menentukan suar majemuk sebagai kunci pengurutan dapat melakukan kueri pencocokan persis dan kueri kompleks yang lebih disesuaikan.

#### Contoh
<a name="example4"></a>

Untuk contoh berikut, pertimbangkan database bernama `UnitInspection` yang melacak data inspeksi untuk fasilitas produksi. Setiap catatan dalam database berisi bidang yang disebut`work_id`,`inspection_date`,`inspector_id_last4`, dan`unit`. ID inspektur lengkap adalah angka antara 0—999.999.999. Namun, untuk memastikan bahwa kumpulan data didistribusikan secara merata, `inspector_id_last4` satu-satunya menyimpan empat digit terakhir dari ID inspektur. Setiap bidang dalam database diidentifikasi oleh kunci utama`work_id`. `unit`Bidang `inspector_id_last4` dan ditandai `ENCRYPT_AND_SIGN` dalam [tindakan kriptografi](concepts.md#crypt-actions).

Berikut ini adalah contoh entri plaintext dalam database. `UnitInspection`

```
{
    "work_id": "1c7fcff3-6e74-41a8-b7f7-925dc039830b",
    "inspection_date": 2023-06-07,
    "inspector_id_last4": 8744,
    "unit": 229304973450
}
```

**Lakukan pencarian kesetaraan pada kombinasi bidang**  
Jika Anda ingin menanyakan `UnitInspection` database untuk inspeksi yang dilakukan oleh inspektur tertentu pada tanggal tertentu, pertama-tama buat suar standar untuk bidang tersebut. `inspector_id_last4` `inspector_id_last4`Bidang ditandai `ENCRYPT_AND_SIGN` dalam [tindakan kriptografi](concepts.md#crypt-actions). Semua bagian terenkripsi memerlukan suar standar mereka sendiri. `inspection_date`Bidang ditandai `SIGN_ONLY` dan tidak memerlukan suar standar. Selanjutnya, buat suar majemuk dari `inspection_date` lapangan dan suar `inspector_id_last4` standar.  
Setelah Anda mengkonfigurasi suar majemuk, buat indeks sekunder yang menentukan suar majemuk sebagai kunci partisi. Gunakan indeks sekunder ini untuk menanyakan database untuk catatan dengan kecocokan persis dengan inspektur dan tanggal inspeksi tertentu. Misalnya, Anda dapat menanyakan database untuk daftar semua inspeksi yang `8744` dilakukan oleh inspektur yang ID-nya berakhir pada tanggal tertentu.

**Lakukan kueri kompleks pada kombinasi bidang**  
Jika Anda ingin menanyakan database untuk inspeksi yang dilakukan dalam `inspection_date` rentang, atau kueri database untuk inspeksi yang dilakukan pada tertentu yang `inspection_date` dibatasi oleh `inspector_id_last4` atau`inspector_id_last4.unit`, pertama-tama buat beacon standar yang berbeda untuk bidang dan. `inspector_id_last4` `unit` Kemudian, buat suar majemuk dari `inspection_date` bidang plaintext dan dua beacon standar.  
Setelah Anda mengkonfigurasi suar majemuk, buat indeks sekunder yang menentukan suar majemuk sebagai kunci pengurutan. Gunakan indeks sekunder ini untuk melakukan kueri untuk inspeksi yang dilakukan pada tanggal tertentu oleh inspektur tertentu. Misalnya, Anda dapat menanyakan database untuk daftar semua unit yang diperiksa pada tanggal yang sama. Atau, Anda dapat menanyakan database untuk daftar semua inspeksi yang dilakukan pada unit tertentu di antara rentang tanggal inspeksi tertentu.

Untuk bantuan mengonfigurasi suar majemuk, lihat [Mengonfigurasi](configure-beacons.md#config-compound-beacons) suar majemuk.

# Memilih panjang suar
<a name="choosing-beacon-length"></a>


****  

|  | 
| --- |
| Pustaka enkripsi sisi klien kami diubah namanya menjadi SDK Enkripsi AWS Database. Panduan pengembang ini masih memberikan informasi tentang Klien Enkripsi [DynamoDB](legacy-dynamodb-encryption-client.md). | 

Saat Anda menulis nilai baru ke bidang terenkripsi yang dikonfigurasi untuk enkripsi yang dapat dicari, SDK Enkripsi AWS Database menghitung HMAC di atas nilai teks biasa. Output HMAC ini adalah kecocokan satu-ke-satu (1:1) untuk nilai plaintext dari bidang itu. Output HMAC terpotong sehingga beberapa nilai plaintext yang berbeda dipetakan ke tag HMAC terpotong yang sama. Tabrakan ini, atau *positif palsu*, membatasi kemampuan pengguna yang tidak sah untuk mengidentifikasi informasi yang membedakan tentang nilai plaintext.

Jumlah rata-rata positif palsu yang dihasilkan untuk setiap suar ditentukan oleh panjang suar yang tersisa setelah pemotongan. Anda hanya perlu menentukan panjang suar saat mengonfigurasi suar standar. Suar majemuk menggunakan panjang suar dari suar standar tempat mereka dibangun.

Beacon tidak mengubah status lapangan yang dienkripsi. Namun, ketika Anda menggunakan beacon, ada tradeoff yang melekat antara seberapa efisien kueri Anda dan seberapa banyak informasi yang terungkap tentang distribusi data Anda. 

Tujuan enkripsi yang dapat dicari adalah untuk mengurangi biaya kinerja yang terkait dengan database terenkripsi sisi klien dengan menggunakan beacon untuk melakukan kueri pada data terenkripsi. Beacon disimpan di samping bidang terenkripsi tempat mereka dihitung. Ini berarti bahwa mereka dapat mengungkapkan informasi yang membedakan tentang distribusi dataset Anda. Dalam kasus ekstrim, pengguna yang tidak sah mungkin dapat menganalisis informasi yang diungkapkan tentang distribusi Anda dan menggunakannya untuk mengidentifikasi nilai plaintext bidang. Memilih panjang suar yang tepat dapat membantu mengurangi risiko ini dan menjaga kerahasiaan distribusi Anda.

Tinjau model ancaman Anda untuk menentukan tingkat keamanan yang Anda butuhkan. Misalnya, semakin banyak individu yang memiliki akses ke database Anda, tetapi tidak memiliki akses ke data teks biasa, semakin Anda mungkin ingin melindungi kerahasiaan distribusi kumpulan data Anda. Untuk meningkatkan kerahasiaan, suar perlu menghasilkan lebih banyak positif palsu. Peningkatan kerahasiaan menghasilkan kinerja kueri yang berkurang.

**Keamanan vs Kinerja**
+ Panjang suar yang **terlalu panjang menghasilkan terlalu** sedikit positif palsu dan mungkin mengungkapkan informasi yang membedakan tentang distribusi kumpulan data Anda.
+ Panjang suar yang **terlalu pendek menghasilkan terlalu** banyak positif palsu dan meningkatkan biaya kinerja kueri karena memerlukan pemindaian database yang lebih luas.

Saat menentukan panjang suar yang sesuai untuk solusi Anda, Anda harus menemukan panjang yang cukup menjaga keamanan data Anda tanpa memengaruhi kinerja kueri Anda lebih dari yang mutlak diperlukan. Jumlah keamanan yang dipertahankan oleh suar tergantung pada [distribusi](searchable-encryption.md#searchable-encryption-distribution) kumpulan data Anda dan [korelasi](searchable-encryption.md#searchable-encryption-correlated-values) bidang tempat beacon Anda dibangun. Topik berikut mengasumsikan bahwa beacon Anda didistribusikan secara seragam dan tidak mengandung data yang berkorelasi.

**Topics**
+ [Menghitung panjang suar](#calculate-beacon-length)
+ [Contoh](#beacon-length-example)

## Menghitung panjang suar
<a name="calculate-beacon-length"></a>

Panjang suar didefinisikan dalam *bit* dan mengacu pada jumlah bit tag HMAC yang disimpan setelah pemotongan. Panjang suar yang direkomendasikan bervariasi tergantung pada distribusi kumpulan data, keberadaan nilai yang berkorelasi, dan persyaratan keamanan dan kinerja spesifik Anda. Jika kumpulan data Anda terdistribusi secara seragam, Anda dapat menggunakan persamaan dan prosedur berikut untuk membantu mengidentifikasi panjang suar terbaik untuk implementasi Anda. Persamaan ini hanya memperkirakan jumlah rata-rata positif palsu yang akan dihasilkan suar, mereka tidak menjamin bahwa setiap nilai unik dalam kumpulan data Anda akan menghasilkan sejumlah positif palsu tertentu.

**catatan**  
Efektivitas persamaan ini tergantung pada distribusi dataset Anda. Jika kumpulan data Anda tidak terdistribusi secara seragam, lihat. [Apakah beacon tepat untuk dataset saya?](searchable-encryption.md#are-beacons-right-for-me)   
Secara umum, semakin jauh dataset Anda dari distribusi yang seragam, semakin Anda perlu mempersingkat panjang suar Anda.

1. 

   **Perkirakan populasi**

   Populasi adalah jumlah nilai unik yang diharapkan di bidang tempat suar standar Anda dibangun, itu bukan jumlah total nilai yang diharapkan yang disimpan di lapangan. Misalnya, pertimbangkan `Room` bidang terenkripsi yang mengidentifikasi lokasi rapat karyawan. `Room`Bidang ini diharapkan menyimpan 100.000 nilai total, tetapi hanya ada 50 kamar berbeda yang dapat dipesan karyawan untuk rapat. Ini berarti bahwa populasinya adalah 50 karena hanya ada 50 kemungkinan nilai unik yang dapat disimpan di `Room` lapangan.
**catatan**  
Jika suar standar Anda dibangun dari [bidang virtual](beacons.md#virtual-field), populasi yang digunakan untuk menghitung panjang suar adalah jumlah kombinasi unik yang dibuat oleh bidang virtual.

   Saat memperkirakan populasi Anda, pastikan untuk mempertimbangkan proyeksi pertumbuhan kumpulan data. Setelah Anda menulis catatan baru dengan suar, Anda tidak dapat memperbarui panjang suar. Tinjau model ancaman Anda dan solusi database yang ada untuk membuat perkiraan jumlah nilai unik yang Anda harapkan untuk disimpan dalam lima tahun ke depan.

   Populasi Anda tidak perlu tepat. Pertama, identifikasi jumlah nilai unik dalam database Anda saat ini, atau perkirakan jumlah nilai unik yang Anda harapkan untuk disimpan di tahun pertama. Selanjutnya, gunakan pertanyaan-pertanyaan berikut untuk membantu Anda menentukan proyeksi pertumbuhan nilai-nilai unik selama lima tahun ke depan.
   + Apakah Anda mengharapkan nilai unik dikalikan dengan 10? 
   + Apakah Anda mengharapkan nilai unik dikalikan dengan 100? 
   + Apakah Anda mengharapkan nilai unik dikalikan dengan 1000? 

   Perbedaan antara 50.000 dan 60.000 nilai unik tidak signifikan dan keduanya akan menghasilkan panjang suar yang direkomendasikan yang sama. Namun, perbedaan antara 50.000 dan 500.000 nilai unik akan berdampak signifikan pada panjang suar yang direkomendasikan.

   Pertimbangkan untuk meninjau data publik tentang frekuensi tipe data umum, seperti kode pos atau nama belakang. Misalnya, ada 41,707 kode pos di Amerika Serikat. Populasi yang Anda gunakan harus proporsional dengan database Anda sendiri. Jika `ZIPCode` bidang dalam database Anda menyertakan data dari seluruh Amerika Serikat, maka Anda dapat menentukan populasi Anda sebagai 41.707, bahkan jika bidang `ZIPCode` tersebut saat ini *tidak* memiliki 41.707 nilai unik. Jika `ZIPCode` bidang dalam database Anda hanya menyertakan data dari satu status, dan hanya akan menyertakan data dari satu status, maka Anda dapat mendefinisikan populasi Anda sebagai jumlah total kode pos dalam status tersebut, bukan 41.704.

1. **Hitung rentang yang disarankan untuk jumlah tabrakan yang diharapkan**

   Untuk menentukan panjang suar yang sesuai untuk bidang tertentu, Anda harus terlebih dahulu mengidentifikasi rentang yang sesuai untuk jumlah tabrakan yang diharapkan. Jumlah tabrakan yang diharapkan mewakili jumlah rata-rata yang diharapkan dari nilai plaintext unik yang dipetakan ke tag HMAC tertentu. Jumlah positif palsu yang diharapkan untuk satu nilai plaintext unik adalah satu kurang dari jumlah tabrakan yang diharapkan.

   Kami merekomendasikan bahwa jumlah tabrakan yang diharapkan lebih besar dari atau sama dengan dua, dan kurang dari akar kuadrat populasi Anda. Persamaan berikut hanya berfungsi jika populasi Anda memiliki 16 atau lebih nilai unik.

   ```
   2 ≤ number of collisions < √(Population)
   ```

   Jika jumlah tabrakan kurang dari dua, suar akan menghasilkan terlalu sedikit positif palsu. Kami merekomendasikan dua sebagai jumlah minimum tabrakan yang diharapkan karena itu berarti, rata-rata, setiap nilai unik di lapangan akan menghasilkan setidaknya satu positif palsu dengan memetakan ke satu nilai unik lainnya. 

1. **Hitung rentang yang disarankan untuk panjang suar**

   Setelah mengidentifikasi jumlah minimum dan maksimum tabrakan yang diharapkan, gunakan persamaan berikut untuk mengidentifikasi rentang panjang suar yang sesuai.

   ```
   number of collisions = Population * 2-(beacon length)
   ```

   Pertama, selesaikan **panjang suar di** mana jumlah tabrakan yang diharapkan sama dengan dua (jumlah minimum tabrakan yang diharapkan).

   ```
   2 = Population * 2-(beacon length)
   ```

   Kemudian, selesaikan **panjang suar di** mana jumlah tabrakan yang diharapkan sama dengan akar kuadrat populasi Anda (jumlah maksimum tabrakan yang diharapkan yang disarankan).

   ```
   √(Population) = Population * 2-(beacon length)
   ```

   Kami merekomendasikan untuk membulatkan output yang dihasilkan oleh persamaan ini ke panjang suar yang lebih pendek. Misalnya, jika persamaan menghasilkan panjang suar 15,6, kami sarankan untuk membulatkan nilai itu menjadi 15 bit alih-alih membulatkan hingga 16 bit. 

1. **Pilih panjang suar**

   Persamaan ini hanya mengidentifikasi rentang panjang suar yang direkomendasikan untuk bidang Anda. Sebaiknya gunakan panjang suar yang lebih pendek untuk menjaga keamanan kumpulan data Anda bila memungkinkan. Namun, panjang suar yang sebenarnya Anda gunakan ditentukan oleh model ancaman Anda. Pertimbangkan persyaratan kinerja Anda saat Anda meninjau model ancaman Anda untuk menentukan panjang suar terbaik untuk bidang Anda.

   Menggunakan panjang suar yang lebih pendek mengurangi kinerja kueri, sementara menggunakan panjang suar yang lebih panjang mengurangi keamanan. Secara umum, jika kumpulan data Anda tidak [terdistribusi](searchable-encryption.md#searchable-encryption-distribution) secara merata, atau jika Anda membuat suar yang berbeda dari bidang yang [berkorelasi](searchable-encryption.md#searchable-encryption-correlated-values), Anda perlu menggunakan panjang suar yang lebih pendek untuk meminimalkan jumlah informasi yang diungkapkan tentang distribusi kumpulan data Anda.

   Jika Anda meninjau model ancaman Anda dan memutuskan bahwa informasi pembeda apa pun yang diungkapkan tentang distribusi bidang tidak menimbulkan ancaman terhadap keamanan Anda secara keseluruhan, Anda dapat memilih untuk menggunakan panjang suar yang lebih panjang dari rentang yang disarankan yang Anda hitung. Misalnya, jika Anda menghitung rentang panjang suar yang disarankan untuk bidang sebagai 9-16 bit, Anda dapat memilih untuk menggunakan panjang suar 24 bit untuk menghindari kehilangan kinerja.

   Pilih panjang suar Anda dengan hati-hati. Setelah Anda menulis catatan baru dengan suar, Anda tidak dapat memperbarui panjang suar.

## Contoh
<a name="beacon-length-example"></a>

Pertimbangkan database yang menandai `unit` bidang seperti `ENCRYPT_AND_SIGN` dalam [tindakan kriptografi](concepts.md#crypt-actions). Untuk mengkonfigurasi suar standar untuk `unit` bidang, kita perlu menentukan jumlah positif palsu dan panjang suar yang diharapkan untuk bidang tersebut. `unit`

1. Perkirakan populasi

   Setelah meninjau model ancaman kami dan solusi database saat ini, kami berharap `unit` bidang tersebut pada akhirnya memiliki 100.000 nilai unik.

   Ini berarti bahwa **Populasi = 100.000**.

1. Hitung rentang yang disarankan untuk jumlah tabrakan yang diharapkan.

   Untuk contoh ini, jumlah tabrakan yang diharapkan harus antara 2-316.

   ```
   2 ≤ number of collisions < √(Population)
   ```

   1. 

      ```
      2 ≤ number of collisions < √(100,000)
      ```

   1. 

      ```
      2 ≤ number of collisions < 316
      ```

1. Hitung kisaran yang disarankan untuk panjang suar.

   Untuk contoh ini, panjang suar harus antara 9-16 bit.

   ```
   number of collisions = Population * 2-(beacon length)
   ```

   1. **Hitung panjang suar di mana jumlah tabrakan yang diharapkan sama dengan minimum yang diidentifikasi pada Langkah 2.**

      ```
      2 = 100,000 * 2-(beacon length)
      ```

      Panjang suar = 15,6, atau 15 bit

   1. **Hitung panjang suar di mana jumlah tabrakan yang diharapkan sama dengan maksimum yang diidentifikasi pada Langkah 2.**

      ```
      316 = 100,000 * 2-(beacon length)
      ```

      Panjang suar = 8,3, atau 8 bit

1. Tentukan panjang suar yang sesuai dengan persyaratan keamanan dan kinerja Anda.

   Untuk setiap bit di bawah 15, biaya kinerja dan keamanan berlipat ganda.
   + 16 bit
     + Rata-rata, setiap nilai unik akan dipetakan ke 1,5 unit lainnya.
     + Keamanan: dua catatan dengan tag HMAC terpotong yang sama 66% kemungkinan memiliki nilai plaintext yang sama.
     + Kinerja: kueri akan mengambil 15 catatan untuk setiap 10 catatan yang sebenarnya Anda minta.
   + 14 bit
     + Rata-rata, setiap nilai unik akan dipetakan menjadi 6,1 unit lainnya.
     + Keamanan: dua catatan dengan tag HMAC terpotong yang sama adalah 33% kemungkinan memiliki nilai plaintext yang sama.
     + Kinerja: kueri akan mengambil 30 catatan untuk setiap 10 catatan yang sebenarnya Anda minta.

# Memilih nama suar
<a name="choosing-beacon-name"></a>


****  

|  | 
| --- |
| Pustaka enkripsi sisi klien kami diubah namanya menjadi SDK Enkripsi AWS Database. Panduan pengembang ini masih memberikan informasi tentang Klien Enkripsi [DynamoDB](legacy-dynamodb-encryption-client.md). | 

Setiap suar diidentifikasi dengan nama *suar* yang unik. Setelah suar dikonfigurasi, nama suar adalah nama yang Anda gunakan saat menanyakan bidang terenkripsi. Nama suar dapat berupa nama yang sama dengan bidang terenkripsi atau bidang [virtual, tetapi tidak bisa nama yang sama dengan bidang](beacons.md#virtual-field) yang tidak terenkripsi. Dua beacon yang berbeda tidak dapat memiliki nama suar yang sama.

[Untuk contoh yang mendemonstrasikan cara memberi nama dan mengkonfigurasi beacon, lihat Mengkonfigurasi beacon.](configure-beacons.md)



**Penamaan suar standar**  
[*Saat menamai suar standar, kami sangat menyarankan agar nama suar Anda diselesaikan ke sumber suar bila memungkinkan.*](beacons.md#beacon-source) Ini berarti bahwa nama suar dan nama bidang terenkripsi atau [virtual](beacons.md#virtual-field) tempat suar standar Anda dibangun adalah sama. Misalnya, jika Anda membuat suar standar untuk bidang terenkripsi bernama`LastName`, nama suar Anda juga harus. `LastName`

Ketika nama suar Anda sama dengan sumber suar, Anda dapat menghilangkan sumber suar dari konfigurasi Anda dan SDK Enkripsi AWS Database akan secara otomatis menggunakan nama suar sebagai sumber suar.

# Mengkonfigurasi beacon
<a name="configure-beacons"></a>


****  

|  | 
| --- |
| Pustaka enkripsi sisi klien kami diubah namanya menjadi SDK Enkripsi AWS Database. Panduan pengembang ini masih memberikan informasi tentang Klien Enkripsi [DynamoDB](legacy-dynamodb-encryption-client.md). | 

Ada dua jenis beacon yang mendukung enkripsi yang dapat dicari. Beacon standar melakukan pencarian kesetaraan. Mereka adalah cara paling sederhana untuk menerapkan enkripsi yang dapat dicari di database Anda. Compound beacon menggabungkan string plaintext literal dan beacon standar untuk melakukan kueri yang lebih kompleks.

Beacon dirancang untuk diimplementasikan dalam database baru yang tidak berpenghuni. Setiap suar yang dikonfigurasi dalam database yang ada hanya akan memetakan catatan baru yang ditulis ke database. Beacon dihitung dari nilai plaintext bidang, setelah bidang dienkripsi, tidak ada cara bagi beacon untuk memetakan data yang ada. Setelah Anda menulis catatan baru dengan suar, Anda tidak dapat memperbarui konfigurasi suar. Namun, Anda dapat menambahkan beacon baru untuk bidang baru yang Anda tambahkan ke catatan Anda.

Setelah menentukan pola akses Anda, mengonfigurasi beacon harus menjadi langkah kedua dalam implementasi database Anda. Kemudian, setelah Anda mengkonfigurasi semua beacon Anda, Anda perlu membuat [keyring AWS KMS Hierarkis](use-hierarchical-keyring.md), menentukan versi suar, [mengonfigurasi indeks sekunder untuk setiap suar](ddb-searchable-encryption.md#ddb-beacon-indexes), menentukan [tindakan kriptografi](concepts.md#crypt-actions) Anda, dan mengkonfigurasi database dan klien SDK Enkripsi Database Anda. AWS Untuk informasi selengkapnya, lihat [Menggunakan beacon](using-beacons.md).

Untuk membuatnya lebih mudah untuk menentukan versi beacon, kami sarankan membuat daftar untuk beacon standar dan majemuk. Tambahkan setiap suar yang Anda buat ke daftar suar standar atau gabungan masing-masing saat Anda mengonfigurasinya.

**Topics**
+ [Mengkonfigurasi beacon standar](#config-standard-beacons)
+ [Mengkonfigurasi suar majemuk](#config-compound-beacons)
+ [Contoh konfigurasi](beacon-config-examples.md)

## Mengkonfigurasi beacon standar
<a name="config-standard-beacons"></a>

[Beacon standar](beacons.md#standard-beacon-overview) adalah cara paling sederhana untuk menerapkan enkripsi yang dapat dicari di database Anda. Mereka hanya dapat melakukan pencarian kesetaraan untuk satu bidang terenkripsi atau virtual.

### Contoh sintaks konfigurasi
<a name="standard-config-syntax"></a>

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

```
List<StandardBeacon> standardBeaconList = new ArrayList<>();
StandardBeacon exampleStandardBeacon = StandardBeacon.builder()
    .name("beaconName")
    .length(beaconLengthInBits)
    .build();
standardBeaconList.add(exampleStandardBeacon);
```

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

```
var standardBeaconList = new List<StandardBeacon>();
StandardBeacon exampleStandardBeacon = new StandardBeacon
  {
    Name = "beaconName",
    Length = 10
  };
standardBeaconList.Add(exampleStandardBeacon);
```

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

```
let standard_beacon_list = vec![
    StandardBeacon::builder().name("beacon_name").length(beacon_length_in_bits).build()?,
```

------

Untuk mengkonfigurasi suar standar, berikan nilai berikut.

**Nama suar**  
Nama yang Anda gunakan saat menanyakan bidang terenkripsi.  
Nama suar dapat berupa nama yang sama dengan bidang terenkripsi atau bidang virtual, tetapi tidak bisa nama yang sama dengan bidang yang tidak terenkripsi. Kami sangat menyarankan untuk menggunakan nama bidang terenkripsi atau [bidang virtual](beacons.md#virtual-field) tempat suar standar Anda dibangun kapan pun memungkinkan. Dua beacon yang berbeda tidak dapat memiliki nama suar yang sama. Untuk bantuan menentukan nama beacon terbaik untuk implementasi Anda, lihat [Memilih nama suar](choosing-beacon-name.md).

**Panjang suar**  
Jumlah bit dari nilai hash beacon yang disimpan setelah pemotongan.  
Panjang suar menentukan jumlah rata-rata positif palsu yang dihasilkan oleh suar yang diberikan. Untuk informasi selengkapnya dan membantu menentukan panjang suar yang sesuai untuk implementasi Anda, lihat [Menentukan panjang suar](choosing-beacon-length.md).

**Sumber suar (Opsional)**  
Bidang tempat suar standar dibangun.  
Sumber suar harus berupa nama bidang atau indeks yang mengacu pada nilai bidang bersarang. Ketika nama suar Anda sama dengan sumber suar, Anda dapat menghilangkan sumber suar dari konfigurasi Anda dan SDK Enkripsi AWS Database akan secara otomatis menggunakan nama suar sebagai sumber suar.

### Membuat bidang virtual
<a name="create-virtual-field"></a>

Untuk membuat [bidang virtual](beacons.md#virtual-field), Anda harus memberikan nama untuk bidang virtual dan daftar bidang sumber. Urutan yang Anda tambahkan bidang sumber ke daftar bagian virtual menentukan urutan penggabungannya untuk membangun bidang virtual. Contoh berikut menggabungkan dua bidang sumber secara keseluruhan untuk membuat bidang virtual.

**catatan**  
Kami menyarankan untuk memverifikasi bahwa bidang virtual Anda menghasilkan hasil yang diharapkan sebelum Anda mengisi database Anda. Untuk informasi selengkapnya, lihat [Menguji output suar](ddb-searchable-encryption.md#ddb-beacon-testing).

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

**Lihat contoh kode lengkapnya**: [VirtualBeaconSearchableEncryptionExample.java](https://github.com/aws/aws-database-encryption-sdk-dynamodb//blob/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/searchableencryption/VirtualBeaconSearchableEncryptionExample.java) 

```
List<VirtualPart> virtualPartList = new ArrayList<>();
    virtualPartList.add(sourceField1);
    virtualPartList.add(sourceField2);

VirtualField virtualFieldName = VirtualField.builder()
    .name("virtualFieldName")
    .parts(virtualPartList)
    .build();

List<VirtualField> virtualFieldList = new ArrayList<>();
    virtualFieldList.add(virtualFieldName);
```

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

**Lihat contoh kode lengkapnya**: [VirtualBeaconSearchableEncryptionExample.cs](https://github.com/aws/aws-database-encryption-sdk-dynamodb/tree/main/Examples/runtimes/net/src/searchableencryption/VirtualBeaconSearchableEncryptionExample.cs)

```
var virtualPartList = new List<VirtualPart> { sourceField1, sourceField2 };

var virtualFieldName = new VirtualField
{
    Name = "virtualFieldName",
    Parts = virtualPartList
};

var virtualFieldList = new List<VirtualField> { virtualFieldName };
```

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

**Lihat contoh kode lengkap: [virtual\$1beacon\$1searchable\$1encryption.rs](https://github.com/aws/aws-database-encryption-sdk-dynamodb/blob/main/releases/rust/db_esdk/examples/searchableencryption/virtual_beacon_searchable_encryption.rs)**

```
let virtual_part_list = vec![source_field_one, source_field_two];

let state_and_has_test_result_field = VirtualField::builder()
    .name("virtual_field_name")
    .parts(virtual_part_list)
    .build()?;

let virtual_field_list = vec![virtual_field_name];
```

------

Untuk membuat bidang virtual dengan segmen tertentu dari bidang sumber, Anda harus menentukan transformasi itu sebelum menambahkan bidang sumber ke daftar bagian virtual Anda.

#### Pertimbangan keamanan untuk bidang virtual
<a name="virtual-field-considerations"></a>

Beacon tidak mengubah status lapangan yang dienkripsi. Namun, ketika Anda menggunakan beacon, ada tradeoff yang melekat antara seberapa efisien kueri Anda dan seberapa banyak informasi yang terungkap tentang distribusi data Anda. Cara Anda mengonfigurasi suar Anda menentukan tingkat keamanan yang dipertahankan oleh suar itu.

Hindari membuat bidang virtual dengan bidang sumber yang tumpang tindih dengan beacon standar yang ada. Membuat bidang virtual yang menyertakan bidang sumber yang telah digunakan untuk membuat suar standar dapat mengurangi tingkat keamanan untuk kedua beacon. Sejauh mana keamanan berkurang tergantung pada tingkat entropi yang ditambahkan oleh bidang sumber tambahan. Tingkat entropi ditentukan oleh distribusi nilai unik di bidang sumber tambahan dan jumlah bit yang disumbangkan oleh bidang sumber tambahan pada ukuran keseluruhan bidang virtual.

Anda dapat menggunakan populasi dan [panjang suar](choosing-beacon-length.md) untuk menentukan apakah bidang sumber untuk bidang virtual menjaga keamanan kumpulan data Anda. Populasi adalah jumlah nilai unik yang diharapkan dalam suatu bidang. Populasi Anda tidak perlu tepat. Untuk bantuan memperkirakan populasi suatu bidang, lihat [Memperkirakan populasi](choosing-beacon-length.md#estimate-population).

Pertimbangkan contoh berikut saat Anda meninjau keamanan bidang virtual Anda.
+ Beacon1 dibangun dari. `FieldA` `FieldA`memiliki populasi lebih besar dari **2 (panjang Beacon1**).
+ Beacon2 dibangun dari`VirtualField`, yang dibangun dari,`FieldA`,`FieldB`, `FieldC` dan. `FieldD` Bersama-sama`FieldB`,`FieldC`,, dan `FieldD` memiliki populasi lebih besar dari **2 N**

Beacon2 menjaga keamanan Beacon1 dan Beacon2 jika pernyataan berikut benar:

```
N ≥ (Beacon1 length)/2
```

and

```
N ≥ (Beacon2 length)/2
```

### Mendefinisikan gaya suar
<a name="define-beacon-styles"></a>

Beacon standar dapat digunakan untuk melakukan pencarian kesetaraan untuk bidang terenkripsi atau virtual. Atau, mereka dapat digunakan untuk membangun suar majemuk untuk melakukan operasi database yang lebih kompleks. Untuk membantu Anda mengatur dan mengelola beacon standar, AWS Database Encryption SDK menyediakan *gaya beacon* opsional berikut yang menentukan tujuan penggunaan suar standar.

**catatan**  
Untuk menentukan gaya suar, Anda harus menggunakan SDK Enkripsi AWS Database versi 3.2 atau yang lebih baru. Terapkan versi baru ke semua pembaca sebelum menambahkan gaya suar ke konfigurasi suar Anda.

------
#### [ PartOnly ]

Sebuah beacon standar didefinisikan sebagai hanya `PartOnly` dapat digunakan untuk mendefinisikan [bagian terenkripsi dari](#encrypted-parts) suar majemuk. Anda tidak dapat langsung menanyakan suar `PartOnly` standar.

**Java**  

```
List<StandardBeacon> standardBeaconList = new ArrayList<>();
StandardBeacon exampleStandardBeacon = StandardBeacon.builder()
    .name("beaconName")
    .length(beaconLengthInBits)
    .style(
        BeaconStyle.builder()
           .partOnly(PartOnly.builder().build())
        .build()
    )
    .build();
standardBeaconList.add(exampleStandardBeacon);
```

**C \$1/.NET**  

```
new StandardBeacon
{
    Name = "beaconName",
    Length = beaconLengthInBits,
    Style = new BeaconStyle
    {
        PartOnly = new PartOnly()
    }
}
```

**Karat**  

```
StandardBeacon::builder()
    .name("beacon_name")
    .length(beacon_length_in_bits)
    .style(BeaconStyle::PartOnly(PartOnly::builder().build()?))
    .build()?
```

------
#### [ Shared ]

Secara default, setiap suar standar menghasilkan kunci HMAC unik untuk perhitungan suar. Akibatnya, Anda tidak dapat melakukan pencarian kesetaraan pada bidang terenkripsi dari dua suar standar terpisah. Sebuah suar standar didefinisikan sebagai `Shared` menggunakan kunci HMAC dari suar standar lain untuk perhitungannya.

Misalnya, jika Anda perlu membandingkan `beacon1` bidang dengan `beacon2` bidang, tentukan `beacon2` sebagai `Shared` suar yang menggunakan kunci HMAC dari `beacon1` untuk perhitungannya.

**catatan**  
Pertimbangkan kebutuhan keamanan dan kinerja Anda sebelum mengonfigurasi `Shared` suar apa pun. `Shared`beacon dapat meningkatkan jumlah informasi statistik yang dapat diidentifikasi tentang distribusi dataset Anda. Misalnya, mereka mungkin mengungkapkan bidang bersama mana yang berisi nilai plaintext yang sama.

**Java**  

```
List<StandardBeacon> standardBeaconList = new ArrayList<>();
StandardBeacon exampleStandardBeacon = StandardBeacon.builder()
    .name("beacon2")
    .length(beaconLengthInBits)
    .style(
        BeaconStyle.builder()
           .shared(Shared.builder().other("beacon1").build())
        .build()
    )
    .build();
standardBeaconList.add(exampleStandardBeacon);
```

**C \$1/.NET**  

```
new StandardBeacon
{
    Name = "beacon2",
    Length = beaconLengthInBits,
    Style = new BeaconStyle
    {
        Shared = new Shared { Other = "beacon1" }
    }
}
```

**Karat**  

```
StandardBeacon::builder()
    .name("beacon2")
    .length(beacon_length_in_bits)
    .style(BeaconStyle::Shared(
       Shared::builder().other("beacon1").build()?,
    ))
    .build()?
```

------
#### [ AsSet ]

Secara default, jika nilai bidang adalah satu set, SDK Enkripsi AWS Database menghitung satu suar standar untuk set tersebut. Akibatnya, Anda tidak dapat melakukan kueri di `CONTAINS(a, :value)` mana `a` adalah bidang terenkripsi. Sebuah suar standar didefinisikan sebagai `AsSet` menghitung nilai beacon standar individu untuk setiap elemen individu dari himpunan dan menyimpan nilai beacon dalam item sebagai satu set. Ini memungkinkan SDK Enkripsi AWS Database untuk melakukan kueri`CONTAINS(a, :value)`.

Untuk menentukan suar `AsSet` standar, elemen dalam himpunan harus dari populasi yang sama sehingga mereka semua dapat menggunakan panjang [suar](choosing-beacon-length.md) yang sama. Set beacon mungkin memiliki elemen lebih sedikit daripada set plaintext jika ada tabrakan saat menghitung nilai beacon.

**catatan**  
Pertimbangkan kebutuhan keamanan dan kinerja Anda sebelum mengonfigurasi `AsSet` suar apa pun. `AsSet`beacon dapat meningkatkan jumlah informasi statistik yang dapat diidentifikasi tentang distribusi dataset Anda. Misalnya, mereka mungkin mengungkapkan ukuran set plaintext.

**Java**  

```
List<StandardBeacon> standardBeaconList = new ArrayList<>();
StandardBeacon exampleStandardBeacon = StandardBeacon.builder()
    .name("beaconName")
    .length(beaconLengthInBits)
    .style(
        BeaconStyle.builder()
           .asSet(AsSet.builder().build())
        .build()
    )
    .build();
standardBeaconList.add(exampleStandardBeacon);
```

**C \$1/.NET**  

```
new StandardBeacon
{
    Name = "beaconName",
    Length = beaconLengthInBits,
    Style = new BeaconStyle
    {
        AsSet = new AsSet()
    }
}
```

**Karat**  

```
StandardBeacon::builder()
    .name("beacon_name")
    .length(beacon_length_in_bits)
    .style(BeaconStyle::AsSet(AsSet::builder().build()?))
    .build()?
```

------
#### [ SharedSet ]

Sebuah beacon standar didefinisikan sebagai `SharedSet` menggabungkan `Shared` dan `AsSet` fungsi sehingga Anda dapat melakukan pencarian kesetaraan pada nilai terenkripsi dari set dan bidang. Ini memungkinkan SDK Enkripsi AWS Database untuk melakukan kueri `CONTAINS(a, b)` di mana `a` kumpulan terenkripsi dan `b` merupakan bidang terenkripsi.

**catatan**  
Pertimbangkan kebutuhan keamanan dan kinerja Anda sebelum mengonfigurasi `Shared` suar apa pun. `SharedSet`beacon dapat meningkatkan jumlah informasi statistik yang dapat diidentifikasi tentang distribusi dataset Anda. Misalnya, mereka mungkin mengungkapkan ukuran set teks biasa atau bidang bersama mana yang berisi nilai plaintext yang sama.

**Java**  

```
List<StandardBeacon> standardBeaconList = new ArrayList<>();
StandardBeacon exampleStandardBeacon = StandardBeacon.builder()
    .name("beacon2")
    .length(beaconLengthInBits)
    .style(
        BeaconStyle.builder()
           .sharedSet(SharedSet.builder().other("beacon1").build())
        .build()
    )
    .build();
standardBeaconList.add(exampleStandardBeacon);
```

**C \$1/.NET**  

```
new StandardBeacon
{
    Name = "beacon2",
    Length = beaconLengthInBits,
    Style = new BeaconStyle
    {
        SharedSet = new SharedSet { Other = "beacon1" }
    }
}
```

**Karat**  

```
StandardBeacon::builder()
    .name("beacon2")
    .length(beacon_length_in_bits)
    .style(BeaconStyle::SharedSet(
        SharedSet::builder().other("beacon1").build()?,
    ))
    .build()?
```

------

## Mengkonfigurasi suar majemuk
<a name="config-compound-beacons"></a>

Compound beacon menggabungkan string plaintext literal dan beacon standar untuk melakukan operasi database yang kompleks, seperti menanyakan dua jenis rekaman yang berbeda dari indeks tunggal atau menanyakan kombinasi bidang dengan kunci pengurutan. Suar majemuk dapat dibangun dari`ENCRYPT_AND_SIGN`,`SIGN_ONLY`, dan `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` ladang. Anda harus membuat suar standar untuk setiap bidang terenkripsi yang termasuk dalam suar majemuk.

**catatan**  
Sebaiknya verifikasi bahwa suar majemuk Anda menghasilkan hasil yang diharapkan sebelum Anda mengisi basis data Anda. Untuk informasi selengkapnya, lihat [Menguji output suar](ddb-searchable-encryption.md#ddb-beacon-testing).

### Contoh sintaks konfigurasi
<a name="compound-config-syntax"></a>

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

**Konfigurasi suar majemuk**

Contoh berikut mendefinisikan daftar bagian terenkripsi dan ditandatangani secara lokal dalam konfigurasi suar majemuk.

```
List<CompoundBeacon> compoundBeaconList = new ArrayList<>();
CompoundBeacon exampleCompoundBeacon = CompoundBeacon.builder()
    .name("compoundBeaconName")
    .split(".")
    .encrypted(encryptedPartList) 
    .signed(signedPartList)                       
    .constructors(constructorList) 
    .build();
compoundBeaconList.add(exampleCompoundBeacon);
```

**Definisi versi suar**

Contoh berikut mendefinisikan daftar bagian terenkripsi dan ditandatangani secara global dalam versi beacon. [Untuk informasi selengkapnya tentang mendefinisikan versi beacon, lihat Menggunakan beacon.](using-beacons.md)

```
 List<BeaconVersion> beaconVersions = new ArrayList<>();
beaconVersions.add(
    BeaconVersion.builder()
        .standardBeacons(standardBeaconList)
        .compoundBeacons(compoundBeaconList)
        .encryptedParts(encryptedPartList)
        .signedParts(signedPartList)
        .version(1) // MUST be 1
        .keyStore(keyStore)
        .keySource(BeaconKeySource.builder()
            .single(SingleKeyStore.builder()
                .keyId(branchKeyId)
                .cacheTTL(6000)
                .build())
            .build())
        .build()
);
```

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

**Lihat contoh kode lengkapnya**: [BeaconConfig.cs](https://github.com/aws/aws-database-encryption-sdk-dynamodb/tree/main/Examples/runtimes/net/src/searchableencryption/complexexample/BeaconConfig.cs)

**Konfigurasi suar majemuk**

Contoh berikut mendefinisikan daftar bagian terenkripsi dan ditandatangani secara lokal dalam konfigurasi suar majemuk.

```
var compoundBeaconList = new List<CompoundBeacon>();       
var exampleCompoundBeacon = new CompoundBeacon
 {
    Name = "compoundBeaconName",
    Split = ".",
    Encrypted = encryptedPartList,
    Signed = signedPartList,                        
    Constructors = constructorList 
 };
compoundBeaconList.Add(exampleCompoundBeacon);
```

**Definisi versi suar**

Contoh berikut mendefinisikan daftar bagian terenkripsi dan ditandatangani secara global dalam versi beacon. [Untuk informasi selengkapnya tentang mendefinisikan versi beacon, lihat Menggunakan beacon.](using-beacons.md)

```
var beaconVersions = new List<BeaconVersion>
{
    new BeaconVersion
    {
        StandardBeacons = standardBeaconList,
        CompoundBeacons = compoundBeaconList,
        EncryptedParts = encryptedPartsList,
        SignedParts = signedPartsList,
        Version = 1, // MUST be 1
        KeyStore = keyStore,
        KeySource = new BeaconKeySource
        {
            Single = new SingleKeyStore
            {
                KeyId = branchKeyId,
                CacheTTL = 6000
            }
        }
    }
};
```

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

**Lihat contoh kode lengkap**: [beacon\$1config.rs](https://github.com/aws/aws-database-encryption-sdk-dynamodb/blob/main/releases/rust/db_esdk/examples/searchableencryption/complexexample/beacon_config.rs)

**Konfigurasi suar majemuk**

Contoh berikut mendefinisikan daftar bagian terenkripsi dan ditandatangani secara lokal dalam konfigurasi suar majemuk.

```
let compound_beacon_list = vec![
    CompoundBeacon::builder()
        .name("compound_beacon_name")
        .split(".")
        .encrypted(encrypted_parts_list)
        .signed(signed_parts_list)
        .constructors(constructor_list)
        .build()?
```

**Definisi versi suar**

Contoh berikut mendefinisikan daftar bagian terenkripsi dan ditandatangani secara global dalam versi beacon. [Untuk informasi selengkapnya tentang mendefinisikan versi beacon, lihat Menggunakan beacon.](using-beacons.md)

```
let beacon_versions = BeaconVersion::builder()
    .standard_beacons(standard_beacon_list)
    .compound_beacons(compound_beacon_list)
    .encrypted_parts(encrypted_parts_list)
    .signed_parts(signed_parts_list)
    .version(1) // MUST be 1
    .key_store(key_store.clone())
    .key_source(BeaconKeySource::Single(
        SingleKeyStore::builder()
            .key_id(branch_key_id)
            .cache_ttl(6000)
            .build()?,
    ))
    .build()?;
let beacon_versions = vec![beacon_versions];
```

------

Anda dapat menentukan bagian [terenkripsi dan bagian yang](#encrypted-parts) [ditandatangani](#signed-parts) dalam daftar yang ditentukan secara lokal atau global. Kami merekomendasikan untuk menentukan bagian terenkripsi dan ditandatangani Anda dalam daftar global dalam versi [suar](using-beacons.md#beacon-version) bila memungkinkan. Dengan mendefinisikan bagian terenkripsi dan ditandatangani secara global, Anda dapat menentukan setiap bagian sekali dan kemudian menggunakan kembali bagian-bagian tersebut dalam beberapa konfigurasi suar majemuk. Jika Anda hanya ingin menggunakan bagian terenkripsi atau ditandatangani sekali, Anda dapat mendefinisikannya dalam daftar lokal dalam konfigurasi suar majemuk. Anda dapat mereferensikan bagian lokal dan global dalam [daftar konstruktor](#constructor-parts) Anda.

Jika Anda menentukan daftar bagian terenkripsi dan ditandatangani secara global, Anda harus memberikan daftar bagian konstruktor yang mengidentifikasi semua kemungkinan cara suar majemuk dapat merakit bidang dalam konfigurasi suar majemuk Anda.

**catatan**  
Untuk menentukan daftar bagian terenkripsi dan ditandatangani secara global, Anda harus menggunakan SDK Enkripsi AWS Database versi 3.2 atau yang lebih baru. Terapkan versi baru ke semua pembaca sebelum mendefinisikan bagian baru secara global.  
Anda tidak dapat memperbarui konfigurasi suar yang ada untuk menentukan daftar bagian terenkripsi dan ditandatangani secara global.

Untuk mengkonfigurasi suar majemuk, berikan nilai berikut.

**Nama suar**  
Nama yang Anda gunakan saat menanyakan bidang terenkripsi.  
Nama suar dapat berupa nama yang sama dengan bidang terenkripsi atau bidang virtual, tetapi tidak bisa nama yang sama dengan bidang yang tidak terenkripsi. Tidak ada dua suar yang dapat memiliki nama suar yang sama. Untuk bantuan menentukan nama beacon terbaik untuk implementasi Anda, lihat [Memilih nama suar](choosing-beacon-name.md).

**Karakter split**  
Karakter yang digunakan untuk memisahkan bagian-bagian yang membentuk suar majemuk Anda.  
Karakter split tidak dapat muncul dalam nilai plaintext dari salah satu bidang tempat suar majemuk dibangun.

**Daftar bagian terenkripsi**  
Mengidentifikasi `ENCRYPT_AND_SIGN` bidang yang termasuk dalam suar majemuk.  
Setiap bagian harus menyertakan nama dan awalan. Nama bagian harus merupakan nama suar standar yang dibangun dari bidang terenkripsi. Awalan dapat berupa string apa saja, tetapi harus unik. Bagian terenkripsi tidak dapat memiliki awalan yang sama dengan bagian yang ditandatangani. Sebaiknya gunakan nilai pendek yang membedakan bagian dari bagian lain yang dilayani oleh suar majemuk.  
Kami merekomendasikan untuk menentukan bagian terenkripsi Anda secara global bila memungkinkan. Anda dapat mempertimbangkan untuk mendefinisikan bagian terenkripsi secara lokal jika Anda hanya bermaksud menggunakannya dalam satu suar majemuk. Bagian terenkripsi yang didefinisikan secara lokal tidak dapat memiliki awalan atau nama yang sama dengan bagian terenkripsi yang didefinisikan secara global.  

```
List<EncryptedPart> encryptedPartList = new ArrayList<>();
EncryptedPart encryptedPartExample = EncryptedPart.builder()
    .name("standardBeaconName")
    .prefix("E-")
    .build();
encryptedPartList.add(encryptedPartExample);
```

```
var encryptedPartList = new List<EncryptedPart>();
var encryptedPartExample = new EncryptedPart
 {
    Name = "compoundBeaconName",
    Prefix = "E-"
 };
encryptedPartList.Add(encryptedPartExample);
```

```
let encrypted_parts_list = vec![
    EncryptedPart::builder()
        .name("standard_beacon_name")
        .prefix("E-")
        .build()?
];
```

**Daftar bagian yang ditandatangani**  
Mengidentifikasi bidang yang ditandatangani termasuk dalam suar majemuk.  
Bagian yang ditandatangani adalah opsional. Anda dapat mengonfigurasi suar majemuk yang tidak mereferensikan bagian yang ditandatangani.
Setiap bagian harus menyertakan nama, sumber, dan awalan. Sumbernya adalah `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` bidang `SIGN_ONLY` atau yang diidentifikasi oleh bagian tersebut. Sumber harus berupa nama bidang atau indeks yang mengacu pada nilai bidang bersarang. Jika nama bagian Anda mengidentifikasi sumber, Anda dapat menghilangkan sumber dan SDK Enkripsi AWS Database akan secara otomatis menggunakan nama sebagai sumbernya. Sebaiknya tentukan sumber sebagai nama bagian bila memungkinkan. Awalan dapat berupa string apa saja, tetapi harus unik. Bagian yang ditandatangani tidak dapat memiliki awalan yang sama dengan bagian terenkripsi. Sebaiknya gunakan nilai pendek yang membedakan bagian dari bagian lain yang dilayani oleh suar majemuk.  
Kami merekomendasikan untuk menentukan suku cadang Anda yang ditandatangani secara global bila memungkinkan. Anda dapat mempertimbangkan untuk mendefinisikan bagian yang ditandatangani secara lokal jika Anda hanya bermaksud menggunakannya dalam satu suar majemuk. Bagian yang ditandatangani secara lokal tidak dapat memiliki awalan atau nama yang sama dengan bagian ditandatangani yang ditentukan secara global.  

```
List<SignedPart> signedPartList = new ArrayList<>();
SignedPart signedPartExample = SignedPart.builder()
    .name("signedFieldName")
    .prefix("S-")
    .build();
signedPartList.add(signedPartExample);
```

```
var signedPartsList = new List<SignedPart>
{
    new SignedPart { Name = "signedFieldName1", Prefix = "S-" },
    new SignedPart { Name = "signedFieldName2", Prefix = "SF-" }
};
```

```
let signed_parts_list = vec![
    SignedPart::builder()
        .name("signed_field_name_1")
        .prefix("S-")
        .build()?,
   SignedPart::builder()
        .name("signed_field_name_2")
        .prefix("SF-")
        .build()?,     
];
```

**Daftar konstruktor**  
Mengidentifikasi *konstruktor* yang menentukan cara berbeda bahwa bagian terenkripsi dan ditandatangani dapat dirakit oleh suar majemuk. Anda dapat mereferensikan bagian lokal dan global dalam daftar konstruktor Anda.  
Jika Anda membangun suar majemuk Anda dari bagian terenkripsi dan ditandatangani yang didefinisikan secara global, Anda harus memberikan daftar konstruktor.  
Jika Anda tidak menggunakan bagian terenkripsi atau ditandatangani yang didefinisikan secara global untuk membangun suar majemuk Anda, daftar konstruktor bersifat opsional. Jika Anda tidak menentukan daftar konstruktor, AWS Database Encryption SDK merakit suar majemuk dengan konstruktor default berikut.  
+ Semua bagian yang ditandatangani dalam urutan mereka ditambahkan ke daftar bagian yang ditandatangani
+ Semua bagian terenkripsi dalam urutan mereka ditambahkan ke daftar bagian terenkripsi
+ Semua bagian diperlukan  
**Konstruktor**  
Setiap konstruktor adalah daftar terurut dari *bagian-bagian konstruktor* yang mendefinisikan satu cara bahwa suar majemuk dapat dirakit. Bagian konstruktor digabungkan bersama dalam urutan mereka ditambahkan ke daftar, dengan setiap bagian dipisahkan oleh karakter split yang ditentukan.   
Setiap bagian konstruktor menamai bagian terenkripsi atau bagian yang ditandatangani, dan menentukan apakah bagian itu diperlukan atau opsional dalam konstruktor. Misalnya, jika Anda ingin menanyakan suar majemuk pada`Field1`,, dan `Field1.Field2``Field1.Field2.Field3`, tandai dan `Field3` sebagai opsional `Field2` dan buat satu konstruktor.  
Setiap konstruktor harus memiliki setidaknya satu bagian yang diperlukan. Sebaiknya buat bagian pertama di setiap konstruktor yang diperlukan sehingga Anda dapat menggunakan `BEGINS_WITH` operator dalam kueri Anda.  
Konstruktor berhasil jika semua bagian yang diperlukan ada dalam catatan. Saat Anda menulis catatan baru, suar majemuk menggunakan daftar konstruktor untuk menentukan apakah suar dapat dirakit dari nilai yang diberikan. Ini mencoba untuk merakit suar dalam urutan bahwa konstruktor ditambahkan ke daftar konstruktor, dan menggunakan konstruktor pertama yang berhasil. Jika tidak ada konstruktor yang berhasil, suar tidak ditulis ke catatan.  
Semua pembaca dan penulis harus menentukan urutan konstruktor yang sama untuk memastikan bahwa hasil kueri mereka benar.
Gunakan prosedur berikut untuk menentukan daftar konstruktor Anda sendiri.  

1. Buat bagian konstruktor untuk setiap bagian terenkripsi dan bagian yang ditandatangani untuk menentukan apakah bagian itu diperlukan atau tidak.

   Nama bagian konstruktor harus nama suar standar atau bidang bertanda tangan yang diwakilinya.

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

   ```
   ConstructorPart field1ConstructorPart = ConstructorPart.builder()
           .name("Field1")
           .required(true)
           .build();
   ```

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

   ```
   var field1ConstructorPart = new ConstructorPart { Name = "Field1", Required = true };
   ```

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

   ```
   let field_1_constructor_part = ConstructorPart::builder()
       .name("field_1")
       .required(true)
       .build()?;
   ```

------

1. **Buat konstruktor untuk setiap cara yang mungkin bahwa suar majemuk dapat dirakit menggunakan bagian konstruktor yang Anda buat di Langkah 1.**

   Misalnya, jika Anda ingin menanyakan `Field1.Field2.Field3` dan`Field4.Field2.Field3`, maka Anda harus membuat dua konstruktor. `Field1`dan keduanya `Field4` dapat diperlukan karena mereka didefinisikan dalam dua konstruktor terpisah.

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

   ```
   // Create a list for Field1.Field2.Field3 queries
   List<ConstructorPart> field123ConstructorPartList = new ArrayList<>();
   field123ConstructorPartList.add(field1ConstructorPart);
   field123ConstructorPartList.add(field2ConstructorPart);
   field123ConstructorPartList.add(field3ConstructorPart);
   Constructor field123Constructor = Constructor.builder()
           .parts(field123ConstructorPartList)
           .build();
   // Create a list for Field4.Field2.Field1 queries
   List<ConstructorPart> field421ConstructorPartList = new ArrayList<>();
   field421ConstructorPartList.add(field4ConstructorPart);
   field421ConstructorPartList.add(field2ConstructorPart);
   field421ConstructorPartList.add(field1ConstructorPart);
   Constructor field421Constructor = Constructor.builder()
           .parts(field421ConstructorPartList)
           .build();
   ```

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

   ```
   // Create a list for Field1.Field2.Field3 queries
    var field123ConstructorPartList = new Constructor
   {
       Parts = new List<ConstructorPart> { field1ConstructorPart, field2ConstructorPart, field3ConstructorPart }
   };
   // Create a list for Field4.Field2.Field1 queries        
   var field421ConstructorPartList = new Constructor
   {
       Parts = new List<ConstructorPart> { field4ConstructorPart, field2ConstructorPart, field1ConstructorPart }
   };
   ```

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

   ```
   // Create a list for field1.field2.field3 queries
   let field1_field2_field3_constructor = Constructor::builder()
       .parts(vec![
           field1_constructor_part,
           field2_constroctor_part.clone(),
           field3_constructor_part,
       ])
       .build()?;
   
   // Create a list for field4.field2.field1 queries
   let field4_field2_field1_constructor = Constructor::builder()
       .parts(vec![
           field4_constructor_part,
           field2_constroctor_part.clone(),
           field1_constructor_part,
       ])
       .build()?;
   ```

------

1. Buat daftar konstruktor yang mencakup semua konstruktor yang Anda buat di **Langkah** 2.

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

   ```
   List<Constructor> constructorList = new ArrayList<>();
   constructorList.add(field123Constructor);
   constructorList.add(field421Constructor);
   ```

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

   ```
   var constructorList = new List<Constructor>
   {
       field123Constructor,
       field421Constructor
   };
   ```

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

   ```
   let constructor_list = vec![
       field1_field2_field3_constructor,
       field4_field2_field1_constructor,
   ];
   ```

------

1. Tentukan `constructorList` kapan Anda membuat suar majemuk Anda.

# Contoh konfigurasi
<a name="beacon-config-examples"></a>


****  

|  | 
| --- |
| Pustaka enkripsi sisi klien kami diubah namanya menjadi SDK Enkripsi AWS Database. Panduan pengembang ini masih memberikan informasi tentang Klien Enkripsi [DynamoDB](legacy-dynamodb-encryption-client.md). | 

Contoh berikut menunjukkan cara mengkonfigurasi beacon standar dan majemuk. Konfigurasi berikut tidak memberikan panjang suar. Untuk bantuan menentukan panjang suar yang sesuai untuk konfigurasi Anda, lihat [Memilih panjang suar](choosing-beacon-length.md).

Untuk melihat contoh kode lengkap yang menunjukkan cara mengkonfigurasi dan menggunakan beacon, lihat contoh enkripsi [Java](https://github.com/aws/aws-database-encryption-sdk-dynamodb//tree/main/Examples/runtimes/java/DynamoDbEncryption/src/main/java/software/amazon/cryptography/examples/searchableencryption), [.NET](https://github.com/aws/aws-database-encryption-sdk-dynamodb/tree/main/Examples/runtimes/net/src/searchableencryption/), dan [Rust](https://github.com/aws/aws-database-encryption-sdk-dynamodb/blob/main/releases/rust/db_esdk/examples/searchableencryption/) yang dapat dicari di repositori -dynamodb aktif. aws-database-encryption-sdk GitHub

**Topics**
+ [Beacon standar](#standard-config-examples)
+ [Suar majemuk](#compound-config-examples)

## Beacon standar
<a name="standard-config-examples"></a>

Jika Anda ingin menanyakan `inspector_id_last4` bidang untuk kecocokan persis, buat suar standar menggunakan konfigurasi berikut.

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

```
List<StandardBeacon> standardBeaconList = new ArrayList<>();
StandardBeacon exampleStandardBeacon = StandardBeacon.builder()
    .name("inspector_id_last4")
    .length(beaconLengthInBits)
    .build();
standardBeaconList.add(exampleStandardBeacon);
```

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

```
var standardBeaconList = new List<StandardBeacon>>);
StandardBeacon exampleStandardBeacon = new StandardBeacon
  {
    Name = "inspector_id_last4",
    Length = 10
  };
standardBeaconList.Add(exampleStandardBeacon);
```

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

```
let last4_beacon = StandardBeacon::builder()
    .name("inspector_id_last4")
    .length(10)
    .build()?;
                        
let unit_beacon = StandardBeacon::builder().name("unit").length(30).build()?;

let standard_beacon_list = vec![last4_beacon, unit_beacon];
```

------

## Suar majemuk
<a name="compound-config-examples"></a>

Jika Anda ingin menanyakan `UnitInspection` database `inspector_id_last4` dan`inspector_id_last4.unit`, buat suar majemuk dengan konfigurasi berikut. Suar majemuk ini hanya membutuhkan bagian [terenkripsi](configure-beacons.md#encrypted-parts).

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

```
// 1. Create standard beacons for the inspector_id_last4 and unit fields.
List<StandardBeacon> standardBeaconList = new ArrayList<>();
StandardBeacon inspectorBeacon = StandardBeacon.builder()
    .name("inspector_id_last4")
    .length(beaconLengthInBits)
    .build();
standardBeaconList.add(inspectorBeacon);

StandardBeacon unitBeacon = StandardBeacon.builder()
    .name("unit")
    .length(beaconLengthInBits)
    .build();
standardBeaconList.add(unitBeacon);        

// 2. Define the encrypted parts.
List<EncryptedPart> encryptedPartList = new ArrayList<>();

// Each encrypted part needs a name and prefix
// The name must be the name of the standard beacon
// The prefix must be unique
// For this example we use the prefix "I-" for "inspector_id_last4"
// and "U-" for "unit"
EncryptedPart encryptedPartInspector = EncryptedPart.builder()
    .name("inspector_id_last4")
    .prefix("I-")
    .build();
encryptedPartList.add(encryptedPartInspector);

EncryptedPart encryptedPartUnit = EncryptedPart.builder()
    .name("unit")
    .prefix("U-")
    .build();
encryptedPartList.add(encryptedPartUnit);   

// 3. Create the compound beacon.
// This compound beacon only requires a name, split character, 
// and list of encrypted parts
CompoundBeacon inspectorUnitBeacon = CompoundBeacon.builder()
    .name("inspectorUnitBeacon")
    .split(".")
    .sensitive(encryptedPartList)
    .build();
```

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

```
// 1. Create standard beacons for the inspector_id_last4 and unit fields.
StandardBeacon inspectorBeacon = new StandardBeacon
 {
   Name = "inspector_id_last4",
   Length = 10
 };
standardBeaconList.Add(inspectorBeacon);
StandardBeacon unitBeacon = new StandardBeacon
 {
    Name = "unit",
    Length = 30
 };  
standardBeaconList.Add(unitBeacon);
                
// 2. Define the encrypted parts.
var last4EncryptedPart = new EncryptedPart

// Each encrypted part needs a name and prefix
// The name must be the name of the standard beacon
// The prefix must be unique
// For this example we use the prefix "I-" for "inspector_id_last4"
// and "U-" for "unit"
var last4EncryptedPart = new EncryptedPart
 {
   Name = "inspector_id_last4",
   Prefix = "I-"
 };
encryptedPartList.Add(last4EncryptedPart);

var unitEncryptedPart = new EncryptedPart
 {
   Name = "unit",
   Prefix = "U-"
 };
encryptedPartList.Add(unitEncryptedPart); 

// 3. Create the compound beacon.
// This compound beacon only requires a name, split character, 
// and list of encrypted parts
var compoundBeaconList = new List<CompoundBeacon>>);
var inspectorCompoundBeacon = new CompoundBeacon
  {
      Name = "inspector_id_last4",
      Split = ".",
      Encrypted = encryptedPartList
  };
compoundBeaconList.Add(inspectorCompoundBeacon);
```

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

```
// 1. Create standard beacons for the inspector_id_last4 and unit fields.
let last4_beacon = StandardBeacon::builder()
    .name("inspector_id_last4")
    .length(10)
    .build()?;
                        
let unit_beacon = StandardBeacon::builder().name("unit").length(30).build()?;

let standard_beacon_list = vec![last4_beacon, unit_beacon];
                        
// 2. Define the encrypted parts.
// The name must be the name of the standard beacon
// The prefix must be unique
// For this example we use the prefix "I-" for "inspector_id_last4"
// and "U-" for "unit"
let encrypted_parts_list = vec![
    EncryptedPart::builder()
        .name("inspector_id_last4")
        .prefix("I-")
        .build()?,
    EncryptedPart::builder().name("unit").prefix("U-").build()?,
];

// 3. Create the compound beacon
// This compound beacon only requires a name, split character, 
// and list of encrypted parts
let compound_beacon_list = vec![CompoundBeacon::builder()
    .name("last4UnitCompound")
    .split(".")
    .encrypted(encrypted_parts_list)
    .build()?];
```

------

# Menggunakan beacon
<a name="using-beacons"></a>


****  

|  | 
| --- |
| Pustaka enkripsi sisi klien kami diubah namanya menjadi SDK Enkripsi AWS Database. Panduan pengembang ini masih memberikan informasi tentang Klien Enkripsi [DynamoDB](legacy-dynamodb-encryption-client.md). | 

Beacon memungkinkan Anda untuk mencari catatan terenkripsi tanpa mendekripsi seluruh database yang sedang ditanyakan. Beacon dirancang untuk diimplementasikan dalam database baru yang tidak berpenghuni. Setiap suar yang dikonfigurasi dalam database yang ada hanya akan memetakan catatan baru yang ditulis ke database. Beacon dihitung dari nilai plaintext bidang, setelah bidang dienkripsi, tidak ada cara bagi beacon untuk memetakan data yang ada. Setelah Anda menulis catatan baru dengan suar, Anda tidak dapat memperbarui konfigurasi suar. Namun, Anda dapat menambahkan menambahkan beacon baru untuk bidang baru yang Anda tambahkan ke catatan Anda.

Setelah Anda mengkonfigurasi beacon Anda, Anda harus menyelesaikan langkah-langkah berikut sebelum Anda mulai mengisi database Anda dan melakukan query pada beacon Anda.

1. **Buat keyring AWS KMS Hierarkis**

   Untuk menggunakan enkripsi yang dapat dicari, Anda harus menggunakan [keyring AWS KMS Hierarkis](use-hierarchical-keyring.md) untuk menghasilkan, mengenkripsi, dan mendekripsi kunci [data](concepts.md#data-key) yang digunakan untuk melindungi catatan Anda.

   [Setelah Anda mengkonfigurasi beacon Anda, kumpulkan [prasyarat keyring Hierarkis dan buat keyring Hierarkis](use-hierarchical-keyring.md#hierarchical-keyring-prereqs) Anda.](use-hierarchical-keyring.md#initialize-hierarchical-keyring)

   Untuk detail selengkapnya tentang mengapa keyring Hierarkis diperlukan, lihat [Menggunakan keyring Hierarkis untuk enkripsi yang dapat dicari](use-hierarchical-keyring.md#searchable-encryption-hierarchical-keyrings).

1. 

   **Tentukan versi beacon**

   Tentukan `keyStore``keySource`, daftar semua suar standar yang Anda konfigurasikan, daftar semua suar majemuk yang Anda konfigurasikan, daftar bagian terenkripsi, daftar bagian yang ditandatangani, dan versi suar. Anda harus menentukan `1` untuk versi beacon. Untuk panduan tentang mendefinisikan Anda`keySource`, lihat[Mendefinisikan sumber kunci suar Anda](use-hierarchical-keyring.md#beacon-key-source).

   Contoh Java berikut mendefinisikan versi beacon untuk database penyewa tunggal. [Untuk bantuan mendefinisikan versi beacon untuk database multitenant, lihat Enkripsi yang dapat dicari untuk database multitenant.](searchable-encryption-multitenant.md)

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

   ```
    List<BeaconVersion> beaconVersions = new ArrayList<>();
   beaconVersions.add(
       BeaconVersion.builder()
           .standardBeacons(standardBeaconList)
           .compoundBeacons(compoundBeaconList)
           .encryptedParts(encryptedPartsList)
           .signedParts(signedPartsList)
           .version(1) // MUST be 1
           .keyStore(keyStore)
           .keySource(BeaconKeySource.builder()
               .single(SingleKeyStore.builder()
                   .keyId(branchKeyId)
                   .cacheTTL(6000)
                   .build())
               .build())
           .build()
   );
   ```

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

   ```
   var beaconVersions = new List<BeaconVersion>
   {
       new BeaconVersion
       {
           StandardBeacons = standardBeaconList,
           CompoundBeacons = compoundBeaconList,
           EncryptedParts = encryptedPartsList,
           SignedParts = signedPartsList,
           Version = 1, // MUST be 1
           KeyStore = branchKeyStoreName,
           KeySource = new BeaconKeySource
           {
               Single = new SingleKeyStore
               {
                   KeyId = branch-key-id,
                   CacheTTL = 6000
               }
           }
       }
   };
   ```

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

   ```
   let beacon_version = BeaconVersion::builder()
       .standard_beacons(standard_beacon_list)
       .compound_beacons(compound_beacon_list)
       .version(1) // MUST be 1
       .key_store(key_store.clone())
       .key_source(BeaconKeySource::Single(
           SingleKeyStore::builder()
               // `keyId` references a beacon key.
               // For every branch key we create in the keystore,
               // we also create a beacon key.
               // This beacon key is not the same as the branch key,
               // but is created with the same ID as the branch key.
               .key_id(branch_key_id)
               .cache_ttl(6000)
               .build()?,
       ))
       .build()?;
   let beacon_versions = vec![beacon_version];
   ```

------

1. **Konfigurasikan indeks sekunder**

   Setelah [Anda mengkonfigurasi beacon](configure-beacons.md) Anda, Anda harus mengkonfigurasi indeks sekunder yang mencerminkan setiap suar sebelum Anda dapat mencari di bidang terenkripsi. Untuk informasi selengkapnya, lihat [Mengkonfigurasi indeks sekunder dengan beacon](ddb-searchable-encryption.md#ddb-beacon-indexes).

1. **Tentukan tindakan [kriptografi](concepts.md#crypt-actions) Anda**

   Semua bidang yang digunakan untuk membangun suar standar harus ditandai. `ENCRYPT_AND_SIGN` Semua bidang lain yang digunakan untuk membangun beacon harus ditandai atau. `SIGN_ONLY` `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`

1. **Konfigurasikan klien SDK Enkripsi AWS Database**

   Untuk mengonfigurasi klien SDK Enkripsi AWS Database yang melindungi item tabel di tabel DynamoDB Anda, [lihat pustaka enkripsi sisi klien Java](ddb-java.md) untuk DynamoDB.

## Meminta suar
<a name="querying-beacons"></a>

Jenis suar yang Anda konfigurasikan menentukan jenis kueri yang dapat Anda lakukan. Beacon standar menggunakan ekspresi filter untuk melakukan pencarian kesetaraan. Compound beacon menggabungkan string plaintext literal dan beacon standar untuk melakukan kueri kompleks. Saat Anda menanyakan data terenkripsi, Anda mencari nama suar.

Anda tidak dapat membandingkan nilai dari dua beacon standar, bahkan jika mereka mengandung plaintext dasar yang sama. Dua beacon standar akan menghasilkan dua tag HMAC yang berbeda untuk nilai plaintext yang sama. Akibatnya, beacon standar tidak dapat melakukan kueri berikut.
+ `beacon1 = beacon2`
+ `beacon1 IN (beacon2)`
+ `value IN (beacon1, beacon2, ...)`
+ `CONTAINS(beacon1, beacon2)`

Compound beacon dapat melakukan query berikut.
+ `BEGINS_WITH(a)`, di mana `a` mencerminkan seluruh nilai bidang tempat suar majemuk rakitan dimulai. Anda tidak dapat menggunakan `BEGINS_WITH` operator untuk mengidentifikasi nilai yang dimulai dengan substring tertentu. Namun, Anda dapat menggunakan`BEGINS_WITH(S_)`, di mana `S_` mencerminkan awalan untuk bagian yang dimulai dengan suar majemuk rakitan.
+ `CONTAINS(a)`, di mana `a` mencerminkan seluruh nilai bidang yang terkandung dalam suar majemuk rakitan. Anda tidak dapat menggunakan `CONTAINS` operator untuk mengidentifikasi catatan yang berisi substring tertentu atau nilai dalam satu set.

  Misalnya, Anda tidak dapat melakukan `CONTAINS(path, "a"` kueri yang `a` mencerminkan nilai dalam satu set.
+ Anda dapat membandingkan [bagian yang ditandatangani](configure-beacons.md#signed-parts) dari suar majemuk. Saat membandingkan bagian yang ditandatangani, Anda dapat menambahkan awalan bagian [terenkripsi secara opsional ke satu atau beberapa bagian yang](configure-beacons.md#encrypted-parts) ditandatangani, tetapi Anda tidak dapat menyertakan nilai bidang terenkripsi dalam kueri apa pun.

  Misalnya, Anda dapat membandingkan bagian yang ditandatangani dan kueri pada `signedField1 = signedField2` atau`value IN (signedField1, signedField2, ...)`.

  Anda juga dapat membandingkan bagian yang ditandatangani dan awalan dari bagian terenkripsi dengan kueri pada. `signedField1.A_ = signedField2.B_`
+ `field BETWEEN a AND b`, di mana `a` dan `b` merupakan bagian yang ditandatangani. Anda secara opsional dapat menambahkan awalan dari bagian terenkripsi ke satu atau beberapa bagian yang ditandatangani, tetapi Anda tidak dapat menyertakan nilai bidang terenkripsi dalam kueri apa pun.

Anda harus menyertakan awalan untuk setiap bagian yang Anda sertakan dalam kueri pada suar majemuk. Misalnya, jika Anda membuat suar majemuk,, dari dua bidang`compoundBeacon`, `encryptedField` dan`signedField`, Anda harus menyertakan awalan yang dikonfigurasi untuk dua bagian tersebut saat Anda menanyakan suar.

```
compoundBeacon = E_encryptedFieldValue.S_signedFieldValue
```

# Enkripsi yang dapat dicari untuk database multitenant
<a name="searchable-encryption-multitenant"></a>


****  

|  | 
| --- |
| Pustaka enkripsi sisi klien kami diubah namanya menjadi SDK Enkripsi AWS Database. Panduan pengembang ini masih memberikan informasi tentang Klien Enkripsi [DynamoDB](legacy-dynamodb-encryption-client.md). | 

Untuk mengimplementasikan enkripsi yang dapat dicari di database Anda, Anda harus menggunakan keyring [AWS KMS Hierarkis](use-hierarchical-keyring.md). Keyring AWS KMS Hierarkis menghasilkan, mengenkripsi, dan mendekripsi kunci data yang digunakan untuk melindungi catatan Anda. Ini juga menciptakan kunci suar yang digunakan untuk menghasilkan suar. Saat menggunakan keyring AWS KMS Hierarkis dengan database multitenant, ada kunci cabang dan kunci suar yang berbeda untuk setiap penyewa. Untuk menanyakan data terenkripsi dalam database multitenant, Anda harus mengidentifikasi bahan kunci suar yang digunakan untuk menghasilkan suar yang Anda kueri. Untuk informasi selengkapnya, lihat [Menggunakan keyring Hierarkis untuk enkripsi yang dapat dicari](use-hierarchical-keyring.md#searchable-encryption-hierarchical-keyrings).

Saat Anda menentukan [versi beacon](using-beacons.md#beacon-version) untuk database multitenant, tentukan daftar semua beacon standar yang Anda konfigurasikan, daftar semua suar majemuk yang Anda konfigurasikan, versi suar, dan a. `keySource` Anda harus [mendefinisikan sumber kunci suar Anda](use-hierarchical-keyring.md#beacon-key-source) sebagai`MultiKeyStore`, dan menyertakan`keyFieldName`, waktu cache untuk hidup untuk cache kunci suar lokal, dan ukuran cache maksimum untuk cache kunci suar lokal.

Jika Anda mengonfigurasi [suar yang ditandatangani](configure.md#signed-beacons), mereka harus disertakan dalam suar Anda. `compoundBeaconList` Signed beacon adalah jenis suar majemuk yang mengindeks dan melakukan kueri kompleks pada dan bidang. `SIGN_ONLY` `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`

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

```
List<BeaconVersion> beaconVersions = new ArrayList<>();
    beaconVersions.add(
        BeaconVersion.builder()
                .standardBeacons(standardBeaconList)
                .compoundBeacons(compoundBeaconList)
                .version(1) // MUST be 1
                .keyStore(branchKeyStoreName)
                .keySource(BeaconKeySource.builder()
                        .multi(MultiKeyStore.builder()
                                .keyFieldName(keyField)
                                .cacheTTL(6000)
                                .maxCacheSize(10)
                        .build())
                .build())
        .build()
    );
```

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

```
var beaconVersions = new List<BeaconVersion>
{
    new BeaconVersion
    {
        StandardBeacons = standardBeaconList,
        CompoundBeacons = compoundBeaconList,
        EncryptedParts = encryptedPartsList,
        SignedParts = signedPartsList,
        Version = 1, // MUST be 1
        KeyStore = branchKeyStoreName,
        KeySource = new BeaconKeySource
        {
            Multi = new MultiKeyStore
            {
                KeyId = branch-key-id,
                CacheTTL = 6000,
                MaxCacheSize = 10
            }
        }
    }
};
```

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

```
let beacon_version = BeaconVersion::builder()
    .standard_beacons(standard_beacon_list)
    .compound_beacons(compound_beacon_list)
    .version(1) // MUST be 1
    .key_store(key_store.clone())
    .key_source(BeaconKeySource::Multi(
        MultiKeyStore::builder()
            // `keyId` references a beacon key.
            // For every branch key we create in the keystore,
            // we also create a beacon key.
            // This beacon key is not the same as the branch key,
            // but is created with the same ID as the branch key.
            .key_id(branch_key_id)
            .cache_ttl(6000)
            .max_cache_size(10)
            .build()?,
    ))
    .build()?;
let beacon_versions = vec![beacon_version];
```

------

**keyFieldName**  
[`keyFieldName`](use-hierarchical-keyring.md#keyFieldName)Mendefinisikan nama bidang yang menyimpan yang `branch-key-id` terkait dengan kunci suar yang digunakan untuk menghasilkan suar untuk penyewa tertentu.  
Saat Anda menulis catatan baru ke database Anda, `branch-key-id` yang mengidentifikasi kunci suar yang digunakan untuk menghasilkan suar apa pun untuk catatan itu disimpan di bidang ini.  
Secara default, `keyField` adalah bidang konseptual yang tidak secara eksplisit disimpan dalam database Anda. [SDK Enkripsi AWS Database mengidentifikasi `branch-key-id` dari [kunci data](concepts.md#data-key) terenkripsi dalam [deskripsi material](concepts.md#material-description) dan menyimpan nilai dalam konseptual `keyField` untuk Anda referensikan di suar majemuk dan suar bertanda tangan.](configure.md#signed-beacons) Karena deskripsi materi ditandatangani, konseptual `keyField` dianggap sebagai bagian yang ditandatangani.  
Anda juga dapat memasukkan `keyField` dalam tindakan kriptografi Anda sebagai `SIGN_ONLY` atau `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` bidang untuk secara eksplisit menyimpan bidang dalam database Anda. Jika Anda melakukan ini, Anda harus secara manual memasukkan `branch-key-id` dalam `keyField` setiap kali Anda menulis catatan ke database Anda.

## Menanyakan beacon dalam database multitenant
<a name="query-multitenant-beacons"></a>

Untuk menanyakan suar, Anda harus menyertakan kueri `keyField` dalam kueri Anda untuk mengidentifikasi bahan kunci suar yang sesuai yang diperlukan untuk menghitung ulang suar. Anda harus menentukan yang `branch-key-id` terkait dengan kunci suar yang digunakan untuk menghasilkan suar untuk catatan. Anda tidak dapat menentukan [nama ramah](use-hierarchical-keyring.md#branch-key-id-supplier) yang mengidentifikasi penyewa `branch-key-id` di pemasok ID kunci cabang. Anda dapat memasukkan `keyField` dalam kueri Anda dengan cara berikut.

**Suar majemuk**  
Apakah Anda secara eksplisit menyimpan `keyField` dalam catatan Anda atau tidak, Anda dapat memasukkan `keyField` langsung ke dalam suar majemuk Anda sebagai bagian yang ditandatangani. Bagian yang `keyField` ditandatangani harus diperlukan.  
Misalnya, jika Anda ingin membangun suar majemuk,, dari dua bidang`compoundBeacon`, `encryptedField` dan`signedField`, Anda juga harus menyertakan `keyField` sebagai bagian yang ditandatangani. Hal ini memungkinkan Anda untuk melakukan query berikut pada`compoundBeacon`.  

```
compoundBeacon = E_encryptedFieldValue.S_signedFieldValue.K_branch-key-id
```

**Suar yang ditandatangani**  
 AWS Database Encryption SDK menggunakan beacon standar dan gabungan untuk menyediakan solusi enkripsi yang dapat dicari. Beacon ini harus menyertakan setidaknya satu bidang terenkripsi. Namun, AWS Database Encryption SDK juga mendukung [beacon bertanda tangan](configure.md#signed-beacons) yang dapat dikonfigurasi seluruhnya dari `SIGN_ONLY` plaintext dan field. `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`  
Beacon yang ditandatangani dapat dibangun dari satu bagian. Apakah Anda secara eksplisit menyimpan `keyField` dalam catatan Anda atau tidak, Anda dapat membuat suar yang ditandatangani dari `keyField` dan menggunakannya untuk membuat kueri gabungan yang menggabungkan kueri pada suar yang `keyField` ditandatangani dengan kueri di salah satu beacon Anda yang lain. Misalnya, Anda dapat melakukan kueri berikut.  

```
keyField = K_branch-key-id AND compoundBeacon = E_encryptedFieldValue.S_signedFieldValue
```
Untuk bantuan mengonfigurasi suar bertanda tangan, lihat [Membuat beacon yang ditandatangani](configure.md#signed-beacons)

**Query langsung pada `keyField`**  
Jika Anda menentukan `keyField` dalam tindakan kriptografi Anda dan secara eksplisit menyimpan bidang dalam catatan Anda, Anda dapat membuat kueri gabungan yang menggabungkan kueri pada suar Anda dengan kueri di file. `keyField` Anda dapat memilih untuk menanyakan langsung `keyField` jika Anda ingin menanyakan suar standar. Misalnya, Anda dapat melakukan kueri berikut.  

```
keyField = branch-key-id AND standardBeacon = S_standardBeaconValue
```