选择信标类型 - AWS 数据库加密 SDK

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

选择信标类型

我们的客户端加密库已重命名为 AWS 数据库加密 SDK。本开发人员指南仍提供有关 DynamoDB 加密客户端的信息。

使用可搜索的加密,您可以通过将加密字段中的明文值映射到信标来搜索加密记录。您配置的信标类型决定您可以执行的查询类型。

强烈建议您在配置信标之前确定并计划需要执行的查询类型。配置信标后,必须先为每个信标配置二级索引,然后才能搜索加密的字段。有关更多信息,请参阅 通过使用信标配置二级索引

信标在写入字段的明文值和实际存储在数据库中的加密值之间创建映射。您无法比较两个标准信标的值,即使其中包含相同的底层明文。两个标准信标将为相同的明文值生成两个不同的 HMAC 标签。因此,标准信标无法执行以下查询。

  • beacon1 = beacon2

  • beacon1 IN (beacon2)

  • value IN (beacon1, beacon2, ...)

  • CONTAINS(beacon1, beacon2)

只有比较复合信标的签名部分,您才能执行上述查询,但 CONTAINS 运算符除外,您可以将其与复合信标一起使用,以识别组合信标所包含的加密或签名字段的完整值。比较签名的部分时,您可以选择包含加密部分的前缀,但不能包括字段的加密值。有关标准信标和复合信标可以执行的查询类型的更多信息,参阅查询信标

查看数据库访问模式时,请考虑以下可搜索的加密解决方案。以下示例定义了满足不同的加密和查询要求需要配置哪个信标。

标准信标

标准信标只能执行相等搜索。您可以使用标准信标执行以下查询。

查询单个已加密字段

如果您要识别包含加密字段特定值的记录,请创建标准信标。

在以下示例中,考虑一个名为 UnitInspection 的数据库,该数据库用于跟踪生产设施的检查数据。数据库中的每条记录都包含名为 work_idinspection_dateinspector_id_last4unit 的字段。完整的检查人员 ID 是一个介于 0 到 99999999 之间的数字。但是,为了确保数据集的均匀分布,inspector_id_last4 只存储检查人员 ID 的最后四位数字。数据库中的每个字段都由主键 work_id 标识。inspector_id_last4unit 字段在加密操作中被标记为 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 字段。

要获得配置标准信标的帮助,请参阅配置标准信标

查询虚拟字段

虚拟字段是由一个或多个源字段构成的概念字段。如果要对加密字段的特定分段执行相等搜索,或者对多个字段的连接执行相等搜索,请使用虚拟字段构造标准信标。所有虚拟字段都必须至少包括一个加密的源字段。

以下示例为 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 值以您指定的最后四位数字结尾的所有记录。

查询多个字段的连接
注意

以下示例演示了您可以使用虚拟字段执行的转换和查询的类型。在应用中,本示例中使用的示例字段可能不符合信标的分布关联唯一性建议。

如果要对 FirstNameLastName 字段的连接执行相等搜索,则可以创建一个虚拟 NameTag 字段,该字段由 FirstName 字段的第一个字母后跟 LastName 字段组成,全部用小写字母。使用此虚拟字段来构造标准信标。然后,请使用标准信标创建二级索引。您可以使用此二级索引在虚拟字段上查询 NameTag=mjones

必须至少对其中一个源字段进行加密。可以加密 FirstNameLastName 中的一个,或者同时加密此两者。任何纯文本源字段都必须标记为SIGN_ONLYSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT在您的加密操作中。

如需帮助配置虚拟字段和使用虚拟字段的信标,请参阅创建虚拟字段

复合信标

复合信标根据文字明文字符串和标准信标创建索引,以执行复杂的数据库操作。您可以使用复合信标执行以下查询。

在单个索引上查询加密字段组合

如果您需要在单个索引上查询加密字段的组合,请创建一个复合信标,该信标将为每个加密字段构造的各个标准信标组合在一起,形成一个索引。

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

在以下示例中,考虑一个名为 UnitInspection 的数据库,该数据库用于跟踪生产设施的检查数据。数据库中的每条记录都包含名为 work_idinspection_dateinspector_id_last4unit 的字段。完整的检查人员 ID 是一个介于 0 到 99999999 之间的数字。但是,为了确保数据集的均匀分布,inspector_id_last4 只存储检查人员 ID 的最后四位数字。数据库中的每个字段都由主键 work_id 标识。inspector_id_last4unit 字段在加密操作中被标记为 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_last4unit 字段创建不同的标准信标。然后,通过两个标准信标创建一个复合信标。

配置复合信标后,创建一个二级索引,以将复合信标指定为分区键。使用此二级索引查询 inspector_id_last4.unit 上的完全匹配项。例如,您可以查询此信标以查找检查人员对给定单位执行的检查列表。

对已加密字段的组合执行复杂查询

如果要在 inspector_id_last4inspector_id_last4.unit 上查询 UnitInspection 数据库,请先为 inspector_id_last4unit 字段创建不同的标准信标。然后,通过两个标准信标创建一个复合信标。

配置复合信标后,创建二级索引,以将复合信标指定为排序键。使用此二级索引查询 UnitInspection 数据库以获得以特定检查人员开头的条目,或者查询数据库以获得特定单位 ID 范围内由特定检查人员检查过的所有单元的列表。您还可以在 inspector_id_last4.unit 上执行完全匹配搜索。

如需帮助配置复合信标,请参阅配置复合信标

在单个索引上查询加密字段和明文字段的组合

如果您需要在单个索引上查询加密字段和明文字段的组合,请创建一个复合信标,该信标将各个标准信标和明文字段组合在一起,形成一个索引。用于构造复合信标的纯文本字段必须标记,SIGN_ONLY或者SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT在您的加密操作中标记。

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

在以下示例中,考虑一个名为 UnitInspection 的数据库,该数据库用于跟踪生产设施的检查数据。数据库中的每条记录都包含名为 work_idinspection_dateinspector_id_last4unit 的字段。完整的检查人员 ID 是一个介于 0 到 99999999 之间的数字。但是,为了确保数据集的均匀分布,inspector_id_last4 只存储检查人员 ID 的最后四位数字。数据库中的每个字段都由主键 work_id 标识。inspector_id_last4unit 字段在加密操作中被标记为 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 字段在加密操作中被标记为 ENCRYPT_AND_SIGN。所有已加密部分都需要自己的标准信标。inspection_date 字段被标记为 SIGN_ONLY,且不需要标准信标。接下来,从 inspection_date 字段和 inspector_id_last4 标准信标创建复合信标。

配置复合信标后,创建一个二级索引,以将复合信标指定为分区键。使用此二级索引查询数据库以获得与特定检查人员和检查日期完全匹配的记录。例如,您可以查询数据库以获取 ID 结尾为 8744 的检查人员在特定日期进行的所有检查的列表。

对字段的组合执行复杂查询

如果要查询数据库以获得在 inspection_date 范围内进行的检查,或者查询数据库以获得受 inspector_id_last4inspection_date 约束的在特定 inspector_id_last4.unit 进行的检查,请先为 inspector_id_last4unit 字段创建不同的标准信标。然后,从明文 inspection_date 字段和两个标准信标创建复合信标。

配置复合信标后,创建二级索引,以将复合信标指定为排序键。使用此二级索引对特定检查人员在特定日期进行的检查执行查询。例如,您可以查询数据库中以获得同一日期检查的所有单位的列表。或者,您可以查询数据库以获取在给定的检查日期范围间对特定单位进行的所有检查的列表。

如需帮助配置复合信标,请参阅配置复合信标