

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

# 選擇信標類型
<a name="choosing-beacon-type"></a>


****  

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

使用可搜尋的加密，您可以透過將加密欄位中的純文字值與*信標*映射來搜尋加密的記錄。您設定的信標類型決定您可以執行的查詢類型。

我們強烈建議識別和規劃您在設定信標之前需要執行的查詢類型。[設定信標](configure-beacons.md)之後，您必須先為每個信標設定次要索引，才能搜尋加密的欄位。如需詳細資訊，請參閱[使用信標設定次要索引](ddb-searchable-encryption.md#ddb-beacon-indexes)。

信標會在寫入欄位的純文字值與實際存放在資料庫中的加密值之間建立映射。您無法比較兩個標準信標的值，即使它們包含相同的基礎純文字。兩個標準信標將為相同的純文字值產生兩個不同的 HMAC 標籤。因此，標準信標無法執行下列查詢。
+ `beacon1 = beacon2`
+ `beacon1 IN (beacon2)`
+ `value IN (beacon1, beacon2, ...)`
+ `CONTAINS(beacon1, beacon2)`

只有在您比較複合信標的[簽章部分](configure-beacons.md#signed-parts)時，才能執行上述查詢，但 `CONTAINS`運算子除外，您可以搭配複合信標使用，以識別組合信標包含的加密或簽章欄位的完整值。當您比較已簽署組件時，您可以選擇包含[加密組件](configure-beacons.md#encrypted-parts)的字首，但不能包含欄位的加密值。如需標準和複合信標可執行之查詢類型的詳細資訊，請參閱[查詢信標](using-beacons.md#querying-beacons)。

在檢閱資料庫存取模式時，請考慮下列可搜尋的加密解決方案。下列範例定義要設定哪些信標以滿足不同的加密和查詢需求。

## 標準信標
<a name="plan-standard-beacon"></a>

[標準信標](beacons.md#standard-beacon-overview)只能執行等式搜尋。您可以使用標準信標來執行下列查詢。

### 查詢單一加密欄位
<a name="se-example1"></a>

如果您想要識別包含加密欄位特定值的記錄，請建立標準信標。

#### 範例
<a name="example1"></a>

針對下列範例，請考慮名為 的資料庫`UnitInspection`，以追蹤生產設施的檢查資料。資料庫中的每個記錄都包含稱為 `work_id`、`inspector_id_last4`、 `inspection_date`和 的欄位`unit`。完整檢測器 ID 是介於 0 到 99，999，999 之間的數字。不過，為了確保資料集均勻分佈， `inspector_id_last4`只會存放檢測器 ID 的最後四位數字。資料庫中的每個欄位都由主索引鍵 識別`work_id`。`inspector_id_last4` 和 `unit` 欄位會在[密碼編譯動作](concepts.md#crypt-actions)`ENCRYPT_AND_SIGN`中標記。

以下是`UnitInspection`資料庫中純文字項目的範例。

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

**查詢記錄中的單一加密欄位**  
如果 `inspector_id_last4` 欄位需要加密，但您仍然需要查詢其是否完全相符，請從 `inspector_id_last4` 欄位建構標準信標。然後，使用標準信標來建立次要索引。您可以使用此次要索引來查詢加密`inspector_id_last4`欄位。

如需設定標準信標的說明，請參閱[設定標準信標](configure-beacons.md#config-standard-beacons)。

### 查詢虛擬欄位
<a name="se-example2"></a>

[虛擬欄位](beacons.md#virtual-field)是從一或多個來源欄位建構的概念欄位。如果您想要對加密欄位的特定區段執行相等性搜尋，或對多個欄位的串連執行相等性搜尋，請從虛擬欄位建構標準信標。所有虛擬欄位必須至少包含一個加密的來源欄位。

#### 範例
<a name="example2"></a>

下列範例會建立`Employees`資料庫的虛擬欄位。以下是`Employees`資料庫中的純文字記錄範例。

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

**查詢加密欄位的區段**  
在此範例中， `SSN` 欄位已加密。  
如果您想要使用社會安全號碼的最後四位數字查詢`SSN`欄位，請建立虛擬欄位來識別您計劃查詢的客群。  
由 建構的虛擬`Last4SSN`欄位`Suffix(4)`可讓您查詢 `Last4SSN=0000`。使用此虛擬欄位來建構標準信標。然後，使用標準信標來建立次要索引。您可以使用此次要索引來查詢虛擬欄位。此查詢會傳回`SSN`值以您指定的後四位數字結尾的所有記錄。

**查詢多個欄位的串連**  
下列範例示範您可以使用虛擬欄位執行的轉換和查詢類型。在應用程式中，此範例中使用的範例欄位可能不符合信標的[分佈](searchable-encryption.md#searchable-encryption-distribution)和[相互關聯](searchable-encryption.md#searchable-encryption-correlated-values)唯一性建議。
如果您想要對 `FirstName`和 `LastName` 欄位的串連執行相等性搜尋，您可以建立虛擬`NameTag`欄位，該欄位是從`FirstName`欄位的第一個字母開始建構，後面接著 `LastName` 欄位，全部為小寫。使用此虛擬欄位來建構標準信標。然後，使用標準信標來建立次要索引。您可以使用此次要索引來`NameTag=mjones`查詢虛擬欄位。  
至少必須加密其中一個來源欄位。`FirstName` 或 `LastName` 可以加密，或兩者都可以加密。任何純文字來源欄位都必須在您的[密碼編譯動作](concepts.md#crypt-actions)`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`中標示為 `SIGN_ONLY`或 。

如需設定虛擬欄位和使用它們的信標的說明，請參閱[建立虛擬欄位](configure-beacons.md#create-virtual-field)。

## 複合信標
<a name="plan-compound-beacons"></a>

[複合信標](beacons.md#compound-beacon-overview)會從文字純文字字串和標準信標建立索引，以執行複雜的資料庫操作。您可以使用複合信標來執行下列查詢。

### 查詢單一索引上加密欄位的組合
<a name="se-example3"></a>

如果您需要查詢單一索引上加密欄位的組合，請建立複合信標，該信標會結合為每個加密欄位建構的個別標準信標，以形成單一索引。

設定複合信標之後，您可以建立次要索引，指定複合信標做為分割區索引鍵來執行完全相符的查詢，或使用排序索引鍵來執行更複雜的查詢。將複合信標指定為排序索引鍵的次要索引可以執行完全相符的查詢和更自訂的複雜查詢。

#### 範例
<a name="example3"></a>

針對下列範例，請考慮名為 的資料庫`UnitInspection`，以追蹤生產設施的檢查資料。資料庫中的每個記錄都包含稱為 `work_id`、`inspector_id_last4`、 `inspection_date`和 的欄位`unit`。完整檢測器 ID 是介於 0 到 99，999，999 之間的數字。不過，為了確保資料集均勻分佈， `inspector_id_last4`只會存放檢測器 ID 的最後四位數字。資料庫中的每個欄位都由主索引鍵 識別`work_id`。[密碼編譯動作](concepts.md#crypt-actions)`ENCRYPT_AND_SIGN`中會標記 `inspector_id_last4`和 `unit` 欄位。

以下是`UnitInspection`資料庫中純文字項目的範例。

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

**對加密欄位的組合執行相等性搜尋**  
如果您想要在 上查詢`UnitInspection`資料庫的完全相符項目`inspector_id_last4.unit`，請先為 `inspector_id_last4`和 `unit` 欄位建立不同的標準信標。然後，從兩個標準信標建立複合信標。  
設定複合信標之後，請建立次要索引，將複合信標指定為分割區索引鍵。使用此次要索引查詢 上的完全相符項目`inspector_id_last4.unit`。例如，您可以查詢此信標，以尋找檢查器為指定單位執行的檢查清單。

**對加密欄位的組合執行複雜的查詢**  
如果您想要查詢 `inspector_id_last4`和 上的`UnitInspection`資料庫`inspector_id_last4.unit`，請先為 `inspector_id_last4`和 `unit` 欄位建立不同的標準信標。然後，從兩個標準信標建立複合信標。  
設定複合信標之後，請建立次要索引，指定複合信標做為排序索引鍵。使用此次要索引查詢`UnitInspection`資料庫是否有以特定檢測器開頭的項目，或查詢資料庫以取得特定檢測器檢查之特定單位 ID 範圍內所有單位的清單。您也可以在 上執行完全相符的搜尋`inspector_id_last4.unit`。

如需設定複合信標的說明，請參閱[設定複合信標](configure-beacons.md#config-compound-beacons)。

### 查詢單一索引上加密和純文字欄位的組合
<a name="se-example4"></a>

如果您需要查詢單一索引上加密和純文字欄位的組合，請建立複合信標，結合個別標準信標和純文字欄位以形成單一索引。用於建構複合信標的純文字欄位必須在[密碼編譯動作](concepts.md#crypt-actions)`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`中標記 `SIGN_ONLY`或 。

設定複合信標之後，您可以建立次要索引，指定複合信標做為分割區索引鍵來執行完全相符的查詢，或使用排序索引鍵來執行更複雜的查詢。將複合信標指定為排序索引鍵的次要索引可以執行完全相符的查詢和更自訂的複雜查詢。

#### 範例
<a name="example4"></a>

針對下列範例，請考慮名為 的資料庫`UnitInspection`，以追蹤生產設施的檢查資料。資料庫中的每個記錄都包含稱為 `work_id`、`inspector_id_last4`、 `inspection_date`和 的欄位`unit`。完整檢測器 ID 是介於 0 到 99，999，999 之間的數字。不過，為了確保資料集均勻分佈， `inspector_id_last4`只會存放檢測器 ID 的最後四位數字。資料庫中的每個欄位都由主索引鍵 識別`work_id`。[密碼編譯動作](concepts.md#crypt-actions)`ENCRYPT_AND_SIGN`中會標記 `inspector_id_last4`和 `unit` 欄位。

以下是`UnitInspection`資料庫中純文字項目的範例。

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

**在欄位組合上執行相等性搜尋**  
如果您想要查詢`UnitInspection`資料庫是否有特定檢查人員在特定日期執行的檢查，請先為 `inspector_id_last4` 欄位建立標準信標。`inspector_id_last4` 欄位會在[密碼編譯動作](concepts.md#crypt-actions)`ENCRYPT_AND_SIGN`中標記。所有加密的組件都需要自己的標準信標。`inspection_date` 欄位已標記`SIGN_ONLY`，不需要標準信標。接著，從 `inspection_date` 欄位和`inspector_id_last4`標準信標建立複合信標。  
設定複合信標之後，請建立次要索引，將複合信標指定為分割區索引鍵。使用此次要索引來查詢資料庫是否有與特定檢查器和檢查日期完全相符的記錄。例如，您可以查詢資料庫，以取得 ID 結尾為 的檢查器在特定日期`8744`執行的所有檢查清單。

**在欄位組合上執行複雜的查詢**  
如果您想要查詢資料庫是否有在 `inspection_date`範圍內執行的檢查，或查詢資料庫是否有對 `inspector_id_last4`或 `inspection_date`限制的特定執行的檢查`inspector_id_last4.unit`，請先為 `inspector_id_last4`和 `unit` 欄位建立不同的標準信標。然後，從純文字`inspection_date`欄位和兩個標準信標建立複合信標。  
設定複合信標之後，請建立次要索引，指定複合信標做為排序索引鍵。使用此次要索引，對特定檢查器在特定日期執行的檢查執行查詢。例如，您可以查詢資料庫，以取得在相同日期檢查的所有單位清單。或者，您可以在指定的檢查日期範圍內，查詢資料庫以取得在特定單位上執行的所有檢查清單。

如需設定複合信標的說明，請參閱[設定複合信標](configure-beacons.md#config-compound-beacons)。