

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

# 信标
<a name="beacons"></a>



|  | 
| --- |
| 我们的客户端加密库已重命名为 AWS 数据库加密 SDK。本开发人员指南仍提供有关 [DynamoDB 加密客户端](legacy-dynamodb-encryption-client.md)的信息。 | 

信标是一种截断的 Hash-Based 消息身份验证码 (HMAC) 标签，它将纯文本字段值映射到存储在数据库中加密数据旁边的加密、可搜索的标识符。信标不会更改字段的加密状态。当您向配置为可搜索加密的字段写入值时，AWS 数据库加密软件开发工具包会根据纯文本值计算 HMAC，并在分区的上下文中派生信标。完整的 HMAC 唯一对应于纯文本值，但是 SDK 故意截断输出，以便多个不同的明文值可以映射到同一个信标。这些冲突（误报）限制了未经授权的用户推断出有关底层明文的区分信息的能力。

**注意**  
 *Hash-based 消息身份验证码 (HMAC)* 是一种密钥加密哈希函数，通常用于提供完整性和真实性。在可搜索的加密系统中，HMAC 通常用于确定性地从纯文本值中派生*信标*，以便对其进行索引和查询。

全长 HMAC 是确定性的：对于给定的密钥，相同的纯文本值总是会生成相同的信标。这种确定性导致了明文值和信标之间的一对一映射，从而保留了数据的原始频率分布。所有共享相同纯文本值的记录都映射到同一个信标，因此形成一个*等价*类。每个等价类的大小直接反映了相应纯文本值在数据集中出现的频率。

 这种频率保持允许*频率分析攻击，在这种攻击*中，观察者通过将观测到的信标频率与已知或预期的数据分布关联来推断可能的纯文本值。

 **为了缓解频率分析攻击，SDK 使用截断和分区来生成信标。**截断 HMAC 会引入受控碰撞，因此并非等价类中的所有记录都必须共享相同的信标值。此外，将分区标识符整合到信标派生中，可以将相同的纯文本值映射到分区间的不同信标。这些技术共同提高了分布不均匀的数据集的随机性，同时保持了正确和高效的查询行为。

信标只能由您的[加密](concepts.md#crypt-actions)操作中标有`ENCRYPT_AND_SIGN``SIGN_ONLY`、或`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`的字段构建。信标本身未经过签名或加密。您无法使用标记为 `DO_NOTHING` 的字段构造信标。

[配置信标](configure-beacons.md)后，必须先为每个信标配置二级索引，然后才能搜索加密的字段。有关更多信息，请参阅 [通过使用信标配置二级索引](ddb-searchable-encryption.md#ddb-beacon-indexes)。

**Topics**
+ [了解跨分区的信标派生](#partitioned-beacon-overview)
+ [信标类型](#Beacon.Types)

## 了解跨分区的信标派生
<a name="partitioned-beacon-overview"></a>

分区是信标配置的核心部分，适用于所有信标，包括那些使用单个分区的信标。该模型可确保在所有数据中推导出一致且向前兼容的信标，并允许您随着数据量或分布的变化而随着时间的推移增加分区的数量。通过这样做，您可以减少频率泄漏并加强对分布不均匀的数据集的保护，而无需重写现有项目。

分区通过将项目分布到多个逻辑组来引入受控的随机性。这减少了频率泄漏，限制了信标等效类的大小，并提高了分布偏差属性的安全性和隐私性。

将项目分配给分区时，分区号将合并到信标派生中。在同一个分区中，相同的纯文本值会生成相同的信标，从而保留相等搜索语义。在不同的分区中，相同的纯文本值会产生不同的信标值。这会将较大的等价类分成较小的按分区分组，并有助于扁平信标的整体频率分布。

您可以完全控制如何将每个数据库项目分配给分区。项目可以确定性地放置到特定的分区中，也可以随机分布，以帮助平滑不均匀的数据分布。随机分配对高频值特别有用，因为它会将这些值分布在多个分区中，并降低任何单个分区中的可见浓度。当领域知识表明某些值应限制为更少的分区时，可以使用确定性赋值。

分区标识符不会在加密记录中公开。取而代之的是，分区号被纳入信标派生过程（与纯文本值一起哈希），因此无法通过检查加密数据或信标本身来推断出分区号。这种设计可确保分区分配保持机密，同时仍能提供分区信标的分布和隐私优势。



 **分区对查询的影响**  
分区会影响`Query`操作的执行方式。由于 DynamoDB 查询要求索引信标值完全匹配，并且信标值因分区而异，因此调用者必须独立查询每个分区。如果表有`N`分区：  
+  检索所有匹配的项目需要`N`单独查询。
+  只有`Query`受到影响。
+  `Scan`而且`Get`操作的行为和以前一样。
原因是结构性的：`Scan`读取所有项目，并对特定的键进行`Get`操作；仅`Query`取决于索引中的精确相等，而索引会特定于分区。  
**Fan-out **是指在使用分区信标时，为满足单个逻辑请求而必须发出的 DynamoDB 查询数量。系统提供有**界扇出**，这意味着分区级查询的最大数量是固定的，并且可以根据配置的分区数量进行预测。
 **性能注意事项**   
使用分区会影响每个逻辑请求所需的 DynamoDB 查询数量。性能影响取决于预期的结果大小：  
+  **大型结果集：**当查询返回许多页面时，额外的分区级查询几乎不会增加开销。
+  **Single-item lookups：**如果请求通常返回一个项目并且配置了五个分区，则会发出五个查询（四个查询没有返回任何结果），从而导致速度接近线性。
+  **减少局部性：**项目可能会分散在各个分区中，从而增加检索时间。
 由于每个分区都会触发额外的查询，因此**扇出**是规划性能和容量的重要因素。  
 **性能优势**   
尽管存在额外的查询开销，但在某些情况下，分区仍可以提高性能：  
+  **减少较大的等价类别：**当稀有值与频繁出现的值共享被截断的信标时，对稀有值的查询必须处理许多不相关的匹配项。分区限制了每个等价类的大小并减少了这种开销。
+  **支持更长的信标长度：**配置更多分区可以允许使用更长的信标长度，从而降低误报率并减少所需的解密后过滤量。

## 信标类型
<a name="Beacon.Types"></a>

您配置的信标类型决定了您能够执行的查询类型。支持可搜索加密的信标类型有两种。标准信标执行相等搜索。复合信标则组合文字明文字符串和标准信标来执行复杂的数据库操作。

### 标准信标
<a name="standard-beacon-overview"></a>

标准信标是在数据库中实现可搜索加密的最简单方法。他们只能对单个加密字段或虚拟字段执行相等搜索。要了解如何配置标准信标，请参阅[配置标准信标](configure-beacons.md#config-standard-beacons)。当底层数据分布不均匀时，您还可以使用带有信标的[分区](#partitioned-beacon-overview)来提高随机性。

以下是标准信标的重要概念。



 **信标源**  
构造标准信标所依据的字段称为*信标源*。它用于标识信标需要映射的数据的位置。信标源可以是加密的字段，也可以是*虚拟字段*。每个标准信标中的信标源都必须是唯一的。您不能使用相同的信标源来配置两个信标。  
标准信标可用于对加密或虚拟字段执行相等搜索。或者，它们可以用来构造复合信标以执行更复杂的数据库操作。为了帮助您组织和管理标准信标， AWS 数据库加密 SDK 提供了以下可选*信标样式*，用于定义标准信标的预期用途。有关更多信息，请参阅[定义信标样式](configure-beacons.md#define-beacon-styles)。  
您可以创建对单个加密字段执行相等搜索的标准信标，也可以通过创建虚拟字段来创建对多个`ENCRYPT_AND_SIGN``SIGN_ONLY`、和`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`字段的串联执行相等搜索的标准信标。



**虚拟字段**  
虚拟字段是由一个或多个源字段构成的概念字段。创建虚拟字段不会向记录中写入新字段。虚拟字段未明确存储在数据库中。它用于标准信标配置中，从而向信标提供有关如何识别字段的特定片段或连接记录中的多个字段以执行特定查询的指令。一个虚拟字段需要至少一个加密字段。  
以下示例演示了您可以使用虚拟字段执行的转换和查询的类型。在应用中，本示例中使用的示例字段可能不符合信标的[分布](searchable-encryption.md#searchable-encryption-distribution)和[关联](searchable-encryption.md#searchable-encryption-correlated-values)唯一性建议。
例如，如果要对 `FirstName` 和 `LastName` 字段的连接执行相等搜索，您可以创建以下虚拟字段之一。  
+ 一个虚拟 `NameTag` 字段，由 `FirstName` 字段的第一个字母后跟 `LastName` 字段构造而成，全部使用小写字母。此虚拟字段使您能够查询 `NameTag=mjones`。
+ 一个虚拟 `LastFirst` 字段，由 `LastName` 字段后跟 `FirstName` 字段构造而成。此虚拟字段使您能够查询 `LastFirst=JonesMary`。
或者，如果您要对加密字段的特定片段执行相等搜索，请创建一个用于标识您要查询的片段的虚拟字段。  
例如，如果您要使用 IP 地址的前三个片段查询加密的 `IPAddress` 字段，请创建以下虚拟字段。  
+ 一个虚拟 `IPSegment` 字段，由 `Segments(‘.’, 0, 3)` 构造而成。此虚拟字段使您能够查询 `IPSegment=192.0.2`。该查询返回 `IPAddress` 值以“192.0.2”开头的所有记录。
虚拟字段必须是唯一的。不能用完全相同的源字段构造两个虚拟字段。  
如需帮助配置虚拟字段和使用虚拟字段的信标，请参阅[创建虚拟字段](configure-beacons.md#create-virtual-field)。

### 复合信标
<a name="compound-beacon-overview"></a>

复合信标创建的索引可以提高查询性能，并且使您能够执行更复杂的数据库操作。您可以使用复合信标组合文字明文字符串和标准信标来对加密记录执行复杂的查询，例如从单个索引中查询两种不同的记录类型或使用排序键查询字段组合。有关更多复合信标解决方案示例，参阅[选择信标类型](choosing-beacon-type.md)。

复合信标可以由标准信标或标准信标和带符号字段的组合构建。它们由各部分的列表构造。所有复合信标都应包括用于识别信标中包含的 `ENCRYPT_AND_SIGN` 字段的[加密部分](configure-beacons.md#encrypted-parts)列表。每个 `ENCRYPT_AND_SIGN` 字段都必须用标准信标识别。更复杂的复合信标还可能包括标识信标中包含的一个`SIGN_ONLY`或多个纯文本的带[符号部分](configure-beacons.md#signed-parts)[的列表，以及标识复合信标可以组装`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`字段的所有可能方式的构造器部分](configure-beacons.md#constructor-parts)列表。

**注意**  
 AWS 数据库加密 SDK 还支持*签名信标*，这些信标可以完全通过纯文本`SIGN_ONLY`和字段进行配置。`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`签名信标是一种复合信标，用于对已签名但未加密的字段进行索引和执行复杂查询。有关更多信息，请参阅 [创建签名的信标](configure.md#signed-beacons)。

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

您配置复合信标的方式决定了您可以执行的查询类型。举例来说，您可以将一些已加密和签名的部分设为可选，以提高查询的灵活性。有关复合信标可以执行的查询类型的更多信息，请参阅 [查询信标](using-beacons.md#querying-beacons)。