

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# ビーコンのタイプの選択
<a name="choosing-beacon-type"></a>


****  

|  | 
| --- |
| クライアント側の暗号化ライブラリの名前が AWS Database Encryption SDK に変更されました。このデベロッパーガイドでは、引き続き [DynamoDB Encryption Client](legacy-dynamodb-encryption-client.md) に関する情報を提供します。 | 

検索可能な暗号化では、暗号化されたフィールドのプレーンテキストの値をビーコンでマッピングすることで、暗号化されたレコードを検索できます。設定するビーコンのタイプによって、実行できるクエリのタイプが決まります。

ビーコンを設定する前に、実行する必要があるクエリのタイプを特定して計画することを強くお勧めします。[ビーコンを設定](configure-beacons.md)した後、暗号化されたフィールドを検索する前に、各ビーコンについてセカンダリインデックスを設定する必要があります。詳細については、「[ビーコンを使用したセカンダリインデックスの設定](ddb-searchable-encryption.md#ddb-beacon-indexes)」を参照してください。

ビーコンは、フィールドに書き込まれるプレーンテキストの値と、データベースに実際に格納される暗号化された値との間のマップを作成します。2 つの標準ビーコンの値は、基になる同じプレーンテキストが含まれている場合でも比較できません。2 つの標準ビーコンは、同じプレーンテキストの値について 2 つの異なる 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～99,999,999 の数値です。ただし、データセットが統一的に分布するようにするために、`inspector_id_last4` はインスペクターの ID の下 4 桁のみを格納します。データベース内の各フィールドは、プライマリキー `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)は、1 つ以上のソースフィールドから構築された概念的なフィールドです。暗号化されたフィールドの特定のセグメントについて一致検索を実行する場合、または複数のフィールドの連結に対して一致検索を実行する場合は、仮想フィールドから標準ビーコンを構築します。すべての仮想フィールドには、少なくとも 1 つの暗号化されたソースフィールドが含まれている必要があります。

#### 例
<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` フィールドは暗号化されています。  
社会保障番号の下 4 桁を使用して `SSN` フィールドをクエリする場合は、クエリを実行するセグメントを識別する仮想フィールドを作成します。  
`Suffix(4)` から構築された仮想 `Last4SSN` フィールドを使用すると、`Last4SSN=0000` をクエリできます。この仮想フィールドを使用して、標準ビーコンを構築します。その後、標準ビーコンを使用してセカンダリインデックスを作成します。このセカンダリインデックスを使用して、仮想フィールドをクエリできます。このクエリは、指定した下 4 桁で終わる `SSN` の値を持つすべてのレコードを返します。

**複数のフィールドの連結をクエリする**  
次の例は、仮想フィールドを使用して実行できる変換とクエリのタイプを示しています。アプリケーションでは、この例で使用されているフィールド例は、ビーコンの[分布](searchable-encryption.md#searchable-encryption-distribution)および[相関](searchable-encryption.md#searchable-encryption-correlated-values)の一意性に関する推奨事項を満たしていない可能性があります。
`FirstName` と `LastName` フィールドの連結に対して一致検索を実行する場合は、`FirstName` フィールドの最初の文字と、その後に続く `LastName` フィールドで構築される仮想 `NameTag` フィールドを作成できます (すべて小文字)。この仮想フィールドを使用して、標準ビーコンを構築します。その後、標準ビーコンを使用してセカンダリインデックスを作成します。このセカンダリインデックスを使用して、仮想フィールドの `NameTag=mjones` をクエリできます。  
少なくとも 1 つのソースフィールドを暗号化する必要があります。`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`、`inspection_date`、`inspector_id_last4`、および `unit` と呼ばれるフィールドが含まれています。完全なインスペクター ID は 0～99,999,999 の数値です。ただし、データセットが統一的に分布するようにするために、`inspector_id_last4` はインスペクターの ID の下 4 桁のみを格納します。データベース内の各フィールドは、プライマリキー `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.unit` の完全一致検索のために `UnitInspection` データベースをクエリする場合は、まず `inspector_id_last4` と `unit` のフィールドについての個別の標準ビーコンを作成します。その後、2 つの標準ビーコンから複合ビーコンを作成します。  
複合ビーコンを設定した後、複合ビーコンをパーティションキーとして指定するセカンダリインデックスを作成します。このセカンダリインデックスを使用して、`inspector_id_last4.unit` の完全一致検索のためにクエリを実行します。例えば、このビーコンをクエリして、インスペクターが特定のユニットについて実行した検査のリストを検索できます。

**暗号化されたフィールドの組み合わせに対して複雑なクエリを実行する**  
`inspector_id_last4` と `inspector_id_last4.unit` のために `UnitInspection` データベースをクエリする場合は、まず `inspector_id_last4` と `unit` のフィールドについて個別の標準ビーコンを作成します。その後、2 つの標準ビーコンから複合ビーコンを作成します。  
複合ビーコンを設定した後、複合ビーコンをソートキーとして指定するセカンダリインデックスを作成します。このセカンダリインデックスを使用して、特定のインスペクターで始まるエントリや、特定のインスペクターによって検査された特定のユニット ID 範囲内のすべてのユニットのリストを検索するために `UnitInspection` データベースをクエリできます。`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`、`inspection_date`、`inspector_id_last4`、および `unit` と呼ばれるフィールドが含まれています。完全なインスペクター ID は 0～99,999,999 の数値です。ただし、データセットが統一的に分布するようにするために、`inspector_id_last4` はインスペクターの ID の下 4 桁のみを格納します。データベース内の各フィールドは、プライマリキー `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` もしくは `inspector_id_last4.unit` によって制約されている特定の `inspection_date` に対して実施される検査を検索するためにデータベースをクエリする場合は、まず、`inspector_id_last4` および `unit` フィールドについての個別の標準ビーコンを作成します。その後、プレーンテキスト `inspection_date` フィールドと 2 つの標準ビーコンから複合ビーコンを作成します。  
複合ビーコンを設定した後、複合ビーコンをソートキーとして指定するセカンダリインデックスを作成します。このセカンダリインデックスを使用して、特定のインスペクターが特定の日付に実施した検査を検索するためにクエリを実行します。例えば、同日に検査されたすべてのユニットのリストを取得するために、データベースをクエリできます。または、指定された検査期間中に特定のユニットに対して実行されたすべての検査のリストを取得するために、データベースをクエリできます。

複合ビーコンの設定については、「[複合ビーコンの設定](configure-beacons.md#config-compound-beacons)」を参照してください。