

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 选择信标类型
<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`、`inspection_date`、`inspector_id_last4` 和 `unit` 的字段。完整的检查人员 ID 是一个介于 0 到 99999999 之间的数字。但是，为了确保数据集的均匀分布，`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` 字段，则请创建一个虚拟字段来标识您计划查询的分段。  
使用 `Suffix(4)` 构造的虚拟 `Last4SSN` 字段构造便于您查询 `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` 中的一个，或者同时加密此两者。任何纯文本源字段都必须标记为`SIGN_ONLY`或`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`在您的[加密](concepts.md#crypt-actions)操作中。

如需帮助配置虚拟字段和使用虚拟字段的信标，请参阅[创建虚拟字段](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`、`inspection_date`、`inspector_id_last4` 和 `unit` 的字段。完整的检查人员 ID 是一个介于 0 到 99999999 之间的数字。但是，为了确保数据集的均匀分布，`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
}
```

**对已加密字段的组合执行相等搜索**  
如果要查询 `UnitInspection` 数据库以获得 `inspector_id_last4.unit` 上的完全匹配项，请先为 `inspector_id_last4` 和 `unit` 字段创建不同的标准信标。然后，通过两个标准信标创建一个复合信标。  
配置复合信标后，创建一个二级索引，以将复合信标指定为分区键。使用此二级索引查询 `inspector_id_last4.unit` 上的完全匹配项。例如，您可以查询此信标以查找检查人员对给定单位执行的检查列表。

**对已加密字段的组合执行复杂查询**  
如果要在 `inspector_id_last4` 和 `inspector_id_last4.unit` 上查询 `UnitInspection` 数据库，请先为 `inspector_id_last4` 和 `unit` 字段创建不同的标准信标。然后，通过两个标准信标创建一个复合信标。  
配置复合信标后，创建二级索引，以将复合信标指定为排序键。使用此二级索引查询 `UnitInspection` 数据库以获得以特定检查人员开头的条目，或者查询数据库以获得特定单位 ID 范围内由特定检查人员检查过的所有单元的列表。您还可以在 `inspector_id_last4.unit` 上执行完全匹配搜索。

如需帮助配置复合信标，请参阅[配置复合信标](configure-beacons.md#config-compound-beacons)。

### 在单个索引上查询加密字段和明文字段的组合
<a name="se-example4"></a>

如果您需要在单个索引上查询加密字段和明文字段的组合，请创建一个复合信标，该信标将各个标准信标和明文字段组合在一起，形成一个索引。用于构造复合信标的纯文本字段必须标记，`SIGN_ONLY`或者`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`在您的[加密](concepts.md#crypt-actions)操作中标记。

配置复合信标后，您可以创建一个二级索引，以将复合信标指定为分区键来执行完全匹配查询，或者使用排序键来执行更复杂的查询。将复合信标指定为排序键的二级索引可以执行完全匹配查询和更为自定义的复杂查询。

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

在以下示例中，考虑一个名为 `UnitInspection` 的数据库，该数据库用于跟踪生产设施的检查数据。数据库中的每条记录都包含名为 `work_id`、`inspection_date`、`inspector_id_last4` 和 `unit` 的字段。完整的检查人员 ID 是一个介于 0 到 99999999 之间的数字。但是，为了确保数据集的均匀分布，`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
}
```

**对字段的组合执行相等搜索**  
如果要查询 `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)。