

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 多租戶資料庫的可搜尋加密
<a name="searchable-encryption-multitenant"></a>


****  

|  | 
| --- |
| 我們的用戶端加密程式庫已重新命名為 AWS 資料庫加密 SDK。此開發人員指南仍提供有關 [DynamoDB 加密用戶端](legacy-dynamodb-encryption-client.md)的資訊。 | 

若要在資料庫中實作可搜尋的加密，您必須使用[AWS KMS 階層式 keyring](use-hierarchical-keyring.md)。 AWS KMS 階層式 keyring 會產生、加密和解密用於保護記錄的資料金鑰。它也會建立用來產生信標的信標金鑰。搭配多租用戶資料庫使用 AWS KMS 階層式 keyring 時，每個租用戶都有不同的分支金鑰和信標金鑰。若要查詢多租戶資料庫中的加密資料，您必須識別用來產生您正在查詢之信標的信標金鑰資料。如需詳細資訊，請參閱[使用階層式 keyring 進行可搜尋的加密](use-hierarchical-keyring.md#searchable-encryption-hierarchical-keyrings)。

當您定義多租戶資料庫的[信標版本](using-beacons.md#beacon-version)時，請指定您設定的所有標準信標清單、您設定的所有複合信標清單、信標版本和 `keySource`。您必須將[信標金鑰來源定義為](use-hierarchical-keyring.md#beacon-key-source) `MultiKeyStore`，並包含 `keyFieldName`、本機信標金鑰快取的存留時間，以及本機信標金鑰快取的快取大小上限。

如果您設定了任何[已簽章的信標](configure.md#signed-beacons)，它們必須包含在您的 中`compoundBeaconList`。簽章信標是一種複合信標，可對 `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) 定義 欄位的名稱，該欄位存放與用於為指定租用戶產生信標的信標金鑰`branch-key-id`相關聯的 。  
當您將新記錄寫入資料庫時，識別用於為該記錄產生任何信標的`branch-key-id`信標金鑰的 會存放在此欄位中。  
根據預設， `keyField`是概念性欄位，不會明確存放在您的資料庫中。 AWS Database Encryption SDK `branch-key-id`會從[材料描述](concepts.md#material-description)中的加密[資料金鑰](concepts.md#data-key)識別 ，並將值存放在概念中，`keyField`供您在複合信標和[簽章信標](configure.md#signed-beacons)中參考。由於材料描述已簽署，因此概念`keyField`會被視為已簽署部分。  
您也可以將 作為 `SIGN_ONLY`或 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 欄位包含在密碼編譯動作`keyField`中，以明確將 欄位存放在資料庫中。如果您這樣做，`keyField`每次將記錄寫入資料庫時，都必須手動將 包含在 `branch-key-id`中。

## 查詢多租戶資料庫中的信標
<a name="query-multitenant-beacons"></a>

若要查詢信標，您必須在查詢`keyField`中包含 ，以識別重新計算信標所需的適當信標金鑰資料。您必須指定與用來產生記錄信標的信標金鑰`branch-key-id`相關聯的 。您無法在分支金鑰 ID 供應商`branch-key-id`中指定識別租戶的[易記名稱](use-hierarchical-keyring.md#branch-key-id-supplier)。您可以透過下列方式將 包含在查詢`keyField`中。

**複合信標**  
無論您是否明確`keyField`將 存放在記錄中，都可以將 `keyField` 直接包含在複合信標中，做為已簽章的部分。`keyField` 簽署的部分必須是必要項目。  
例如，如果您想要`compoundBeacon`從兩個欄位 `encryptedField`和 建構複合信標 ，`signedField`您也必須包含 `keyField`做為已簽章的部分。這可讓您在 上執行下列查詢`compoundBeacon`。  

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

**已簽章的信標**  
 AWS Database Encryption SDK 使用標準和複合信標來提供可搜尋的加密解決方案。這些信標必須至少包含一個加密欄位。不過， AWS 資料庫加密 SDK 也支援[簽署的信標](configure.md#signed-beacons)，這些信標可以完全從純文字`SIGN_ONLY`和`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`欄位設定。  
已簽章的信標可以從單一部分建構。無論您是否明確`keyField`將 存放在記錄中，都可以從 建構已簽章的信標，`keyField`並使用它來建立複合查詢，將`keyField`已簽章信標上的查詢與其中一個信標上的查詢結合在一起。例如，您可以執行下列查詢。  

```
keyField = K_branch-key-id AND compoundBeacon = E_encryptedFieldValue.S_signedFieldValue
```
如需設定簽章信標的說明，請參閱 [建立簽章的信標](configure.md#signed-beacons)

**直接在 上查詢 `keyField`**  
如果您在密碼編譯動作`keyField`中指定 ，並明確將 欄位存放在記錄中，您可以建立複合查詢，將信標上的查詢與 上的查詢結合在一起`keyField`。`keyField` 如果您想要查詢標準信標，您可以選擇直接在 上查詢。例如，您可以執行下列查詢。  

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