

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

# AWS Database Encryption SDK とは
<a name="what-is-database-encryption-sdk"></a>


****  

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

 AWS Database Encryption SDK は、データベース設計にクライアント側の暗号化を含めることができる一連のソフトウェアライブラリです。 AWS Database Encryption SDK は、レコードレベルの暗号化ソリューションを提供します。どのフィールドを暗号化し、データの真正性を保証する署名にどのフィールドを含めるかを指定します。伝送中および保管時の機密データを暗号化することで、 AWSなどのサードパーティーがお客様のプレーンテキストデータを使用することはできません。 AWS Database Encryption SDK は、Apache 2.0 ライセンスに基づいて、無償で提供されています。

このデベロッパーガイドでは、 AWS Database Encryption SDK の概念的な概要を説明します。これには、[アーキテクチャの概要](concepts.md)、[データを保護する方法](how-it-works.md)の詳細、[サーバー側の暗号化](client-server-side.md)との違い、使用開始に役立つ[アプリケーションの重要なコンポーネントの選択](configure.md)に関するガイダンスが含まれます。

 AWS Database Encryption SDK は、*属性*レベルの暗号化で Amazon DynamoDB をサポートします。

 AWS Database Encryption SDK には次の利点があります。

**データベースアプリケーション向けに特別に設計**  
 AWS Database Encryption SDK を使用するには、暗号化の専門家である必要はありません。この実装には、既存のアプリケーションで動作するように設計されたヘルパーメソッドが含まれます。  
必要なコンポーネントを作成して設定すると、暗号化クライアントは、データベースへの追加時にレコードを透過的に暗号化して署名し、取得時に検証および復号します。

**セキュアな暗号化と署名を含む**  
 AWS Database Encryption SDK には、一意のデータ暗号化キーを使用して各レコードのフィールド値を暗号化し、フィールドの追加や削除、暗号化された値のスワップなどの不正な変更から保護するためにレコードに署名する安全な実装が含まれています。

**ソースの暗号化マテリアルを使用する**  
 AWS Database Encryption SDK は[、キーリング](concepts.md#keyring-concept)を使用して、レコードを保護する一意のデータ暗号化キーを生成、暗号化、復号します。キーリングは、そのデータキーを暗号化する[ラッピングキー](concepts.md#wrapping-key)を決定します。  
[AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/) (AWS KMS) や [AWS CloudHSM](https://docs.aws.amazon.com/cloudhsm/latest/userguide/) などの暗号化サービスを含む、任意のソースからのラッピングキーを使用できます。 AWS Database Encryption SDK には、 AWS アカウント や AWS のサービスは必要ありません。

**暗号マテリアルのキャッシュのサポート**  
[AWS KMS 階層キーリング](use-hierarchical-keyring.md)は、Amazon DynamoDB テーブルに保持されている AWS KMS 保護された*ブランチキー*を使用して AWS KMS 呼び出しの数を減らし、暗号化および復号オペレーションで使用されるブランチキーマテリアルをローカルにキャッシュする暗号化マテリアルキャッシュソリューションです。これにより、レコードを暗号化または復号する AWS KMS たびに を呼び出すことなく、対称暗号化 KMS キーで暗号化マテリアルを保護できます。 AWS KMS 階層キーリングは、呼び出しを最小限に抑える必要があるアプリケーションに適しています AWS KMS。

**検索可能な暗号化**  
データベース全体を復号せずに、暗号化されたレコードを検索できるデータベースを設計できます。脅威モデルとクエリ要件に応じて、[検索可能な暗号化](searchable-encryption.md)を使用して、暗号化されたデータベースに対して完全一致検索やよりカスタマイズされた複雑なクエリを実行できます。

**マルチテナンシーデータベーススキーマのサポート**  
 AWS Database Encryption SDK を使用すると、各テナントを個別の暗号化マテリアルで分離することで、共有スキーマを持つデータベースに保存されているデータを保護できます。データベース内で複数のユーザーが暗号化オペレーションを実行している場合は、いずれかの AWS KMS キーリングを使用して、暗号化オペレーションで使用する個別のキーを各ユーザーに提供します。詳細については、「[マルチテナンシーデータベースの使用](configure.md#config-multitenant-databases)」を参照してください。

**シームレスなスキーマ更新のサポート**  
 AWS Database Encryption SDK を設定するときは、暗号化および署名するフィールド、署名するフィールド (暗号化しない）、無視するフィールドをクライアントに通知する[暗号化アクション](concepts.md#crypt-actions)を提供します。 AWS Database Encryption SDK を使用してレコードを保護した後でも、[データモデルを変更](ddb-update-data-model.md)できます。暗号化されたフィールドの追加や削除などの暗号化アクションを単一のデプロイで更新できます。

## オープンソースリポジトリで開発
<a name="dbesdk-repos"></a>

 AWS Database Encryption SDK は、GitHub のオープンソースリポジトリで開発されています。これらのリポジトリを使用して、コードを表示したり、問題を読んで送信したりできるほか、実装に固有の情報を検索することもできます。

**AWS Database Encryption SDK for DynamoDB**
+ GitHub の [aws-database-encryption-sdk-dynamodb](https://github.com/aws/aws-database-encryption-sdk-dynamodb/) リポジトリは、Java、.NET、Rust の AWS Database Encryption SDK for DynamoDB の最新バージョンをサポートしています。

   AWS Database Encryption SDK for DynamoDB は、Dafny の製品です。[Dafny](https://github.com/dafny-lang/dafny/blob/master/README.md) は、仕様、実装するコード、およびテストするための証明を記述する検証対応言語です。その結果、機能の正確性を保証するフレームワークで AWS Database Encryption SDK for DynamoDB の機能を実装するライブラリが作成されます。

## サポートとメンテナンス
<a name="support"></a>

 AWS Database Encryption SDK は、バージョニングフェーズやライフサイクルフェーズなど、 AWS SDK とツールが使用するのと同じ[メンテナンスポリシー](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html)を使用します。ベストプラクティスとして、データベースの実装には AWS Database Encryption SDK の利用可能な最新バージョンを使用し、新しいバージョンがリリースされたらアップグレードすることをお勧めします。

詳細については、[AWS SDKs とツールリファレンスガイド」の「SDK とツールのメンテナンスポリシー](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html) AWS SDKs 」を参照してください。

## フィードバックを送る
<a name="feedback"></a>

当社では、お客様からのフィードバックをお待ちしております。質問、コメント、ご報告いただく問題がある場合は、以下のリソースをご利用ください。

 AWS Database Encryption SDK で潜在的なセキュリティ脆弱性を発見した場合は、[AWS セキュリティに通知](https://aws.amazon.com/security/vulnerability-reporting/)してください。GitHub で公開されている問題はご報告いただく必要はありません。

このドキュメントに関するフィードバックを提供するには、任意のページのフィードバックリンクを使用します。

# AWS Database Encryption SDK の概念
<a name="concepts"></a>


****  

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

このトピックでは、 AWS Database Encryption SDK で使用される概念と用語について説明します。

 AWS Database Encryption SDK のコンポーネントがどのように相互作用するかについては、「」を参照してください[AWS Database Encryption SDK の仕組み](how-it-works.md)。

 AWS Database Encryption SDK の詳細については、以下のトピックを参照してください。
+  AWS Database Encryption SDK がエン[ベロープ暗号化](#envelope-encryption)を使用してデータを保護する方法について説明します。
+ エンベロープ暗号化の要素、レコードを保護する[データキー](#data-key)およびデータキーを保護する[ラッピングキー](#wrapping-key)についての説明。
+ どのラッピングキーを使用するかを決めるキーリングについての説明。
+ 暗号化プロセスの整合性を向上させる[暗号化コンテキスト](#encryption-context)についての説明。
+ 暗号化メソッドがレコードに追加する[マテリアルの説明](#material-description)について説明します。
+ どのフィールドを暗号化して署名するかを AWS Database Encryption SDK に指示する[暗号化アクション](#crypt-actions)について説明します。

**Topics**
+ [エンベロープ暗号化](#envelope-encryption)
+ [データキー](#data-key)
+ [ラッピングキー](#wrapping-key)
+ [キーリング](#keyring-concept)
+ [暗号化アクション](#crypt-actions)
+ [マテリアル記述](#material-description)
+ [暗号化コンテキスト](#encryption-context)
+ [暗号化マテリアルマネージャー](#crypt-materials-manager)
+ [対称暗号化と非対称暗号化](#symmetric-key-encryption)
+ [キーコミットメント](#key-commitment)
+ [デジタル署名](#digital-sigs)

## エンベロープ暗号化
<a name="envelope-encryption"></a>

暗号化されたデータのセキュリティは、復号できるデータキーを保護することによって部分的に異なります。1 つの受け入れられているデータキーを保護するベストプラクティスは暗号化することです。これを行うには、*キー暗号化キー*つまり[ラッピングキー](#wrapping-key)と呼ばれる別の暗号化キーが必要です。データキーを暗号化するためにラッピングキーを使用するこの方法は*エンベロープ暗号化*と呼ばれています。

**データキーの保護**  
 AWS Database Encryption SDK は、各フィールドを一意のデータキーで暗号化します。その後、指定したラッピングキーで各データキーを暗号化します。暗号化されたデータキーを[マテリアルの説明](#material-description)に格納します。  
ラッピングキーを指定するには、[キーリング](#keyring-concept)を使用します。  

![\[AWS Database Encryption SDK によるエンベロープ暗号化\]](http://docs.aws.amazon.com/ja_jp/database-encryption-sdk/latest/devguide/images/dbesdk-envelope.png)


**複数のラッピングキーで同じデータを暗号化する**  
複数のラッピングキーを使用してデータキーを暗号化できます。ユーザーごとに異なるラッピングキーを指定したり、異なるタイプのラッピングキーを指定したり、場所ごとにそのように指定したい場合があります。各ラッピングキーでは、それぞれ同じデータキーを暗号化します。 AWS Database Encryption SDK は、暗号化されたすべてのデータキーを、暗号化されたフィールドとともに[マテリアルの説明](#material-description)に保存します。  
データを復号するには、この暗号化されたデータキーを復号できる少なくとも 1 つのラッピングキーを指定する必要があります。

**複数のアルゴリズムの強度の結合**  
デフォルトでは、 AWS Database Encryption SDK は、AES-GCM 対称暗号化、HMAC ベースのキー取得関数 (HKDF)、および [ECDSA 署名](#digital-sigs)を使用する[アルゴリズムスイート](supported-algorithms.md)を使用します。データキーを暗号化するには、ラッピングキーに適した[対称または非対称の暗号化アルゴリズム](#symmetric-key-encryption)を指定できます。  
一般的に、対称キー暗号化アルゴリズムは迅速で、非対称または*パブリックキー暗号化*よりも小さい暗号化テキストが生成されます。ただし、パブリックキーアルゴリズムはロールの本質的な分離を提供します。それぞれの長所を組み合わせるために、パブリックキー暗号化を使用してデータキーを暗号化できます。  
可能な限り、いずれかの AWS KMS キーリングを使用することをお勧めします。[AWS KMS キーリング](use-kms-keyring.md)を使用する場合、ラッピングキー AWS KMS key として非対称 RSA を指定することで、複数のアルゴリズムの長所を組み合わせることができます。また、対称暗号化 KMS キーを使用することもできます。

## データキー
<a name="data-key"></a>

*データキー*は、 AWS Database Encryption SDK が暗号化[アクション](#crypt-actions)`ENCRYPT_AND_SIGN`でマークされたレコード内のフィールドを暗号化するために使用する暗号化キーです。各データキーは、暗号化キーの要件に準拠したバイト配列です。 AWS Database Encryption SDK は、一意のデータキーを使用して各属性を暗号化します。

データキーを指定、生成、実装、拡張、保護、使用する必要はありません。 AWS Database Encryption SDK で暗号化オペレーションや復号オペレーションを呼び出しても、上記のアクションは行われません。

データキーを保護するために、 AWS Database Encryption SDK はラ[ッピングキーと呼ばれる 1](#wrapping-key) *つ以上のキー暗号化キーでデータキーを暗号化*します。 AWS Database Encryption SDK は、プレーンテキストのデータキーを使用してデータを暗号化した後、できるだけ早くメモリから削除します。その後、暗号化されたデータキーを[マテリアルの説明](#material-description)に格納します。詳細については、「[AWS Database Encryption SDK の仕組み](how-it-works.md)」を参照してください。

**ヒント**  
 AWS Database Encryption SDK では、*データキー*と*データ暗号化キー*を区別します。ベストプラクティスとして、サポートされているすべての[アルゴリズムスイート](supported-algorithms.md)は[鍵導出関数](https://en.wikipedia.org/wiki/Key_derivation_function)を使用します。鍵導出関数は、データキーを入力として受け取り、レコードの暗号化に実際に使用されたデータ暗号化キーを返します。そのため、データは、データキー「によって」暗号化されているというよりは、データキーの「下で」暗号化されていると言えます。

暗号化された各データキーには、暗号化したラッピングキーの識別子を含むメタデータが含まれます。このメタデータにより、 AWS Database Encryption SDK は復号時に有効なラッピングキーを識別できます。

## ラッピングキー
<a name="wrapping-key"></a>

ラッピングキーは、 AWS Database Encryption SDK がレコードを暗号化する[データキー](#data-key)を暗号化するために使用するキー暗号化キーです。各データキーは、1 つまたは複数のラッピングキーで暗号化することができます。[キーリング](#keyring-concept)の設定時に、データの保護に使用するラッピングキーを決定します。

![\[1 つのデータキーを複数のラッピングキーで暗号化する\]](http://docs.aws.amazon.com/ja_jp/database-encryption-sdk/latest/devguide/images/dbesdk-wrapping-key.png)


 AWS Database Encryption SDK は、 [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys) (AWS KMS) 対称暗号化 KMS キー ([マルチリージョンキーを含む AWS KMS](use-kms-keyring.md#config-mrks)) と非対称 [RSA KMS キー](https://docs.aws.amazon.com/kms/latest/developerguide/asymmetric-key-specs.html#key-spec-rsa)、raw AES-GCM (Advanced Encryption Standard/Galois Counter Mode) キー、raw RSA キーなど、一般的に使用されるいくつかのラッピングキーをサポートしています。可能な場合は常に、KMS キーを使用することをお勧めします。どのラッピングキーを使用すべきかを知るには、「[ラッピングキーの選択](configure.md#config-keys)」を参照してください。

エンベロープ暗号化を使用する場合は、認可されていないアクセスからラッピングキーを保護する必要があります。これは、次のいずれかの方法で行うことができます。
+ この目的のために設計された [AWS Key Management Service (AWS KMS)](https://aws.amazon.com/kms/) などのサービスを使用します。
+ [https://en.wikipedia.org/wiki/Hardware_security_module](https://en.wikipedia.org/wiki/Hardware_security_module)[ によって提供されているようなAWS CloudHSMハードウェアセキュリティモジュール (HSM)](https://aws.amazon.com/cloudhsm/) を使用します。
+ 他のキー管理ツールやサービスを使用します。

キー管理システムがない場合は、 をお勧めします AWS KMS。 AWS Database Encryption SDK は と統合され AWS KMS 、ラッピングキーの保護と使用に役立ちます。

## キーリング
<a name="keyring-concept"></a>

暗号化と復号に使用するラッピングキーを指定するには、キーリングを使用します。 AWS Database Encryption SDK が提供するキーリングを使用することも、独自の実装を設計することもできます。

*キーリング*は、データキーの生成、暗号化、復号を行います。また、署名内の Hash-Based Message Authentication Code (HMAC) を計算するために使用される MAC キーも生成します。キーリングを定義するとき、データキーを暗号化する[ラッピングキー](#wrapping-key)を指定できます。ほとんどのキーリングは、少なくとも 1 つのラッピングキーを指定するか、ラッピングキーを提供および保護するサービスを指定します。暗号化時に、 AWS Database Encryption SDK はキーリングで指定されたすべてのラッピングキーを使用してデータキーを暗号化します。 AWS Database Encryption SDK が定義するキーリングの選択と使用については、[「キーリングの使用](keyrings.md)」を参照してください。

## 暗号化アクション
<a name="crypt-actions"></a>

暗号化アクションは、レコード内の各フィールドに対してどのアクションを実行するかを暗号化プログラムに指示します。

暗号化アクションの値は次のいずれかになります。
+ **[暗号化して署名]** – フィールドを暗号化します。暗号化されたフィールドを署名に含めます。
+ **[署名のみ]** – 署名にフィールドを含めます。
+ **署名して暗号化コンテキストに含める** – 署名と[暗号化コンテキスト](#encryption-context)に フィールドを含めます。

  デフォルトでは、パーティションキーとソートキーは、暗号化コンテキストに含まれる唯一の属性です。[AWS KMS 階層キーリング](use-hierarchical-keyring.md)のブランチキー ID サプライヤーが暗号化コンテキストからの復号に必要なブランチキーを特定`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`できるように、追加のフィールドを として定義することを検討してください。詳細については、[「ブランチキー ID サプライヤー](use-hierarchical-keyring.md#branch-key-id-supplier)」を参照してください。
**注記**  
`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 暗号化アクションを使用するには、 AWS Database Encryption SDK のバージョン 3.3 以降を使用する必要があります。[データモデルを更新して を含める前に、すべてのリーダー](ddb-update-data-model.md)に新しいバージョンをデプロイします`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`。
+ **[何もしない]** – フィールドを暗号化したり、署名に含めたりしません。

機密データを格納できるすべてのフィールドは、**暗号化と署名**を使用します。プライマリキー値 (DynamoDB テーブルのパーティションキーやソートキーなど) には、**署名のみ**を使用するか**、署名を使用して暗号化コンテキストに を含め**ます。Sign を指定**して暗号化コンテキスト属性に含める**場合、パーティション属性とソート属性も **Sign で、暗号化コンテキストに含める**必要があります。[マテリアルの説明](#material-description)に暗号化アクションを指定する必要はありません。 AWS Database Encryption SDK は、マテリアルの説明が保存されている フィールドに自動的に署名します。

暗号化アクションは慎重に選択してください。不確かな場合は、**暗号化と署名**を使用します。 AWS Database Encryption SDK を使用してレコードを保護すると、既存の `ENCRYPT_AND_SIGN`、、`SIGN_ONLY`または `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`フィールドを に変更したり`DO_NOTHING`、既存の`DO_NOTHING`フィールドに割り当てられた暗号化アクションを変更したりすることはできません。ただし、[データモデルに他の変更を加えること](ddb-update-data-model.md)はできます。例えば、単一のデプロイで暗号化フィールドを追加または削除できます。

## マテリアル記述
<a name="material-description"></a>

マテリアルの説明は、暗号化されたレコードのヘッダーとして機能します。 AWS Database Encryption SDK を使用してフィールドを暗号化して署名すると、エンクリプタは暗号化マテリアルをアセンブルするときにマテリアルの説明を記録し、エンクリプタがレコードに追加する新しいフィールド (`aws_dbe_head`) にマテリアルの説明を保存します。

マテリアルの説明は、データキーの暗号化されたコピーと、暗号化アルゴリズム、[暗号化コンテキスト](#encryption-context)、暗号化と署名の命令などの他の情報を含む、ポータブルな[形式のデータ構造](reference.md#material-description-format)です。暗号化プログラムは、暗号化および署名のために暗号マテリアルをアセンブルする際に、マテリアルの説明を記録します。後で、フィールドを検証および復号するために暗号マテリアルをアセンブルする必要がある場合は、そのマテリアルの説明をガイドとして使用します。

暗号化されたデータキーを暗号化されたフィールドと一緒に格納すると、復号オペレーションが合理化され、暗号化されたデータキーを、そのキーで暗号化したデータとは別に格納および管理する必要がなくなります。

マテリアルの説明に関する技術的な情報については、「[マテリアルの説明の形式](reference.md#material-description-format)」を参照してください。

## 暗号化コンテキスト
<a name="encryption-context"></a>

暗号化オペレーションのセキュリティを向上させるために、 AWS Database Encryption SDK には、レコードを暗号化して署名するすべてのリクエストに暗号化コンテキストが含まれています。

*暗号化コンテキスト*は、任意のシークレットではない追加認証データを含む名前と値のペアのセットです。 AWS Database Encryption SDK には、データベースの論理名とプライマリキー値 (DynamoDB テーブルのパーティションキーとソートキーなど) が暗号化コンテキストに含まれます。フィールドを暗号化して、これに署名する場合、暗号化コンテキストは暗号化されたレコードに暗号化されてバインドされます。これにより、フィールドを復号するために同じ暗号化コンテキストが必要になります。

 AWS KMS キーリングを使用する場合、 AWS Database Encryption SDK は暗号化コンテキストを使用して、キーリングが行う呼び出しで追加の認証データ (AAD) も提供します AWS KMS。

[デフォルトのアルゴリズムスイート](supported-algorithms.md#recommended-algorithms)を使用するたびに、[暗号マテリアルマネージャー](#crypt-materials-manager) (CMM) は、予約名 `aws-crypto-public-key` と、パブリック検証キーを表す値で構成される名前と値のペアを暗号化コンテキストに追加します。パブリック検証キーは[マテリアルの説明](#material-description)に格納されます。

## 暗号化マテリアルマネージャー
<a name="crypt-materials-manager"></a>

暗号マテリアルマネージャー (CMM) は、データの暗号化、復号、署名に使用される暗号マテリアルを組み立てます。[デフォルトのアルゴリズムスイート](supported-algorithms.md#recommended-algorithms)を使用する場合、暗号マテリアルには、プレーンテキストおよび暗号化されたデータキー、対称署名キー、および非対称署名キーが含まれます。CMM を直接操作することは決してありません。このためには、暗号化メソッドおよび復号メソッドを使用します。

CMM は AWS Database Encryption SDK とキーリングの間の連絡係として機能するため、ポリシーの適用のサポートなど、カスタマイズと拡張の理想的なポイントです。CMM を明示的に指定することはできますが、必須ではありません。キーリングを指定すると、 AWS Database Encryption SDK はデフォルトの CMM を作成します。デフォルトの CMM は、指定したキーリングから暗号化マテリアルまたは復号マテリアルを取得します。これには、[AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/) (AWS KMS) などの暗号化サービスの呼び出しが含まれる場合があります。

## 対称暗号化と非対称暗号化
<a name="symmetric-key-encryption"></a>

*対称暗号化*では、データの暗号化と復号化に同じキーが使用されます。

*非対称暗号化*では、数学的に関連するデータキーペアが使用されます。ペアの 1 つのキーでデータが暗号化され、ペアの他のキーだけでデータが復号されます。

 AWS Database Encryption SDK はエン[ベロープ暗号化](#envelope-encryption)を使用します。データは対称データキーで暗号化されます。対称データキーを 1 つ以上の対称または非対称のラッピングキーで暗号化します。データキーの暗号化されたコピーを少なくとも 1 つ含むマテリアルの説明をレコードに追加します。

**データの暗号化 (対称暗号化)**  
データを暗号化するために、 AWS Database Encryption SDK は対称[データキー](#data-key)と、対称暗号化アルゴリズムを含むアルゴリズム[スイート](supported-algorithms.md)を使用します。データを復号するために、 AWS Database Encryption SDK は同じデータキーと同じアルゴリズムスイートを使用します。

**データキーの暗号化 (対称暗号化または非対称暗号化)**  
暗号化および復号のオペレーションに指定する[キーリング](#keyring-concept)により、対称データキーの暗号化および復号方法が決まります。対称暗号化 KMS キーを持つ AWS KMS キーリングなどの対称暗号化を使用するキーリング、または非対称 RSA KMS キーを持つキーリングなどの AWS KMS 非対称暗号化を使用するキーリングを選択できます。

## キーコミットメント
<a name="key-commitment"></a>

 AWS Database Encryption SDK は*、キーコミットメント* (*堅牢性*とも呼ばれます) をサポートしています。これは、各暗号文を 1 つのプレーンテキストにのみ復号できるセキュリティプロパティです。これを実行するために、キーコミットメントを使用することで、レコードを暗号化したデータキーのみが復号に使用されるようになります。 AWS Database Encryption SDK には、すべての暗号化および復号オペレーションに対するキーコミットメントが含まれています。

最新の対称暗号 (AES を含む) のほとんどは、 AWS Database Encryption SDK がレコード`ENCRYPT_AND_SIGN`でマークされた各プレーンテキストフィールドを暗号化するために使用する[一意のデータキー](#data-key)など、1 つのシークレットキーでプレーンテキストを暗号化します。同じデータキーでこのレコードを復号すると、元のデータと同じプレーンテキストが返されます。別のキーで復号化すると、通常は失敗します。2 つの異なるキーを使用して暗号文を復号することは難しいですが、技術的には可能です。まれに、数バイトの暗号化テキストを別の理解可能なプレーンテキストに部分的に複号できるキーを見つけることは可能です。

 AWS Database Encryption SDK は、常に 1 つの一意のデータキーで各属性を暗号化します。複数のラッピングキーでそのデータキーを暗号化する場合がありますが、ラッピングキーは常に同じデータキーを暗号化します。ただし、手動で作成した高度な暗号化されたレコードには、実際には異なるデータキーが含まれて、それぞれ異なるラッピングキーによって暗号化されることがあります。例えば、あるユーザーが暗号化されたレコードを復号すると 0x0 (false) を返し、同じ暗号化されたレコードを別のユーザーが復号すると 0x1 (true) となることがあります。

このシナリオを防ぐために、 AWS Database Encryption SDK には、暗号化および復号時にキーコミットメントが含まれています。暗号化メソッドは、暗号文を生成した一意のデータキーを、データキーの導出を使用してマテリアルの説明に基づいて計算された Hash-based Message Authentication Code (HMAC) であるキーコミットメントに暗号的にバインドします。その後、キーコミットメントを[マテリアルの説明](#material-description)に格納します。キーコミットメントを使用してレコードを復号すると、 AWS Database Encryption SDK はその暗号化されたレコードの唯一のキーがデータキーであることを確認します。データキーの検証が失敗すると、復号オペレーションは失敗します。

## デジタル署名
<a name="digital-sigs"></a>

 AWS Database Encryption SDK は、認証された暗号化アルゴリズム、AES-GCM、および復号プロセスを使用してデータを暗号化し、デジタル署名を使用せずに暗号化されたメッセージの整合性と信頼性を検証します。しかし、AES-GCM は対称キーを使用するため、暗号化テキストの復号化に使用されるデータキーを復号できる人は誰でも、新しい暗号化された暗号化テキストを手動で作成できるようになり、セキュリティ上の懸念が生じる可能性があります。たとえば、 をラッピングキー AWS KMS key として使用すると、 アクセス`kms:Decrypt`許可を持つユーザーは、 を呼び出すことなく暗号化された暗号文を作成できます`kms:Encrypt`。

この問題を回避するために、[デフォルトのアルゴリズムスイート](supported-algorithms.md#recommended-algorithms)は、暗号化されたレコードに Elliptic Curve Digital Signature Algorithm (ECDSA) 署名を追加します。デフォルトのアルゴリズムスイートは、認証された暗号化アルゴリズムである AES-GCM を使用して `ENCRYPT_AND_SIGN` とマークされたレコード内のフィールドを暗号化します。次に、、、および とマークされたレコードのフィールドで`SIGN_ONLY`、ハッシュベースのメッセージ認証コード (HMACs) `ENCRYPT_AND_SIGN`と非対称 ECDSA 署名の両方を計算します`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`。復号プロセスでは、署名を使用して、認可されたユーザーがレコードを暗号化したことを検証します。

デフォルトのアルゴリズムスイートを使用すると、 AWS Database Encryption SDK は暗号化されたレコードごとに一時的なプライベートキーとパブリックキーペアを生成します。 AWS Database Encryption SDK は、パブリックキーを[マテリアルの説明](#material-description)に保存し、プライベートキーを破棄します。これにより、パブリックキーで検証する別の署名を誰も作成できなくなります。このアルゴリズムは、マテリアルの説明で追加の認証済みデータとして暗号化されたデータキーにパブリックキーをバインドし、フィールドのみを復号できるユーザーがパブリックキーを変更したり、署名の検証に影響を与えたりするのを防ぎます。

 AWS Database Encryption SDK には、常に HMAC 検証が含まれています。ECDSA デジタル署名はデフォルトで有効になっていますが、必須ではありません。データを暗号化するユーザーとデータを復号するユーザーが同等に信頼されている場合は、パフォーマンスを改善するためにデジタル署名を含まないアルゴリズムスイートの使用を検討することをお勧めします。代替アルゴリズムスイートの選択の詳細については、「[アルゴリズムスイートの選択](ddb-java-using.md#config-algorithm)」を参照してください。

**注記**  
キーリングがエンクリプタと復号器を区別しない場合、デジタル署名は暗号化値を提供しません。

非対称 RSA [AWS KMS キーリング](use-kms-keyring.md)を含む AWS KMS キーリングは、 AWS KMS キーポリシーと IAM ポリシーに基づいてエンクリプタと復号器を区別できます。

暗号化の性質上、次のキーリングはエンクリプタと復号器を区別できません。
+ AWS KMS 階層キーリング
+ AWS KMS ECDH キーリング
+ Raw AES キーリング
+ Raw RSA キーリング
+ Raw ECDH キーリング

# AWS Database Encryption SDK の仕組み
<a name="how-it-works"></a>


****  

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

 AWS Database Encryption SDK は、データベースに保存するデータを保護するために特別に設計されたクライアント側の暗号化ライブラリを提供します。ライブラリには、拡張が可能でまた変更なしで使用できる安全な実装が含まれています。カスタムコンポーネントの定義と使用の詳細については、データベース実装の GitHub リポジトリを参照してください。

このセクションのワークフローでは、 AWS Database Encryption SDK がデータベース内のデータを暗号化、署名、復号、検証する方法について説明します。これらのワークフローは、抽象的な要素とデフォルト機能を使用した基本的なプロセスを表します。 AWS Database Encryption SDK がデータベース実装と連携する方法の詳細については、「データベースの*暗号化された内容*」トピックを参照してください。

 AWS Database Encryption SDK は、エン[ベロープ暗号化](concepts.md#envelope-encryption)を使用してデータを保護します。各レコードは一意の[データキー](concepts.md#data-key)で暗号化されます。データキーは、暗号化アクションで `ENCRYPT_AND_SIGN` とマークされた各フィールドの一意のデータ暗号化キーを導出するために使用されます。その後、データキーのコピーが、指定したラッピングキーによって暗号化されます。暗号化されたレコードを復号するために、 AWS Database Encryption SDK は、指定したラッピングキーを使用して、少なくとも 1 つの暗号化されたデータキーを復号します。その後、暗号文を復号し、プレーンテキストのエントリを返すことができます。

 AWS Database Encryption SDK で使用される用語の詳細については、「」を参照してください[AWS Database Encryption SDK の概念](concepts.md)。

## 暗号化および署名
<a name="encrypt-and-sign"></a>

 AWS Database Encryption SDK は、データベース内のレコードを暗号化、署名、検証、復号するレコードエンクリプタです。レコードに関する情報と、暗号化して署名するフィールドに関する指示が取り込まれます。指定したラッピングキーから設定された[暗号マテリアルマネージャー](concepts.md#crypt-materials-manager)から、暗号マテリアルとその使用方法に関する指示を取得します。

次のチュートリアルでは、 AWS Database Encryption SDK がデータエントリを暗号化して署名する方法について説明します。

1. 暗号化マテリアルマネージャーは、 AWS Database Encryption SDK に 1 つのプレーンテキストデータキー、指定されたラッピング[キー](concepts.md#data-key)で暗号化されたデータキーのコピー、MAC キーという一意のデータ暗号化キーを提供します。 [ラッピングキー](concepts.md#wrapping-key)
**注記**  
複数のラッピングキーでデータキーを暗号化できます。各ラッピングキーは、データキーの個別のコピーを暗号化します。 AWS Database Encryption SDK は、暗号化されたすべてのデータキーを[マテリアルの説明](concepts.md#material-description)に保存します。 AWS Database Encryption SDK は、マテリアルの説明を格納するレコードに新しいフィールド (`aws_dbe_head`) を追加します。  
MAC キーは、データキーの暗号化された各コピーについて導出されます。MAC キーは、マテリアルの説明には格納されません。代わりに、復号メソッドは、ラッピングキーを使用して MAC キーを再度導出します。

1. 暗号化メソッドは、指定した[暗号化アクション](concepts.md#crypt-actions)で `ENCRYPT_AND_SIGN` とマークされた各フィールドを暗号化します。

1. 暗号化メソッドは、データキーから `commitKey` を導出し、それを使用して[キーコミットメントの値](concepts.md#key-commitment)を生成して、その後にデータキーを破棄します。

1. 暗号化メソッドは、[マテリアルの説明](concepts.md#material-description)をレコードに追加します。マテリアルの説明には、暗号化されたデータキーと、暗号化されたレコードに関する他の情報が含まれます。マテリアルの説明に含まれる情報の詳細なリストについては、「[マテリアルの説明の形式](reference.md#material-description-format)」を参照してください。

1. 暗号化メソッドは、**ステップ 1 **で返された MAC キーを使用して、マテリアルの説明、[暗号化コンテキスト](concepts.md#encryption-context)、および暗号化アクション`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`で `ENCRYPT_AND_SIGN`、`SIGN_ONLY`、または とマークされた各フィールドの正規化におけるハッシュベースのメッセージ認証コード (HMAC) 値を計算します。HMAC の値は、暗号化メソッドがレコードに追加する新しいフィールド (`aws_dbe_foot`) に格納されます。

1. 暗号化メソッドは、マテリアルの説明、暗号化コンテキスト、および `ENCRYPT_AND_SIGN`、、または とマークされた各フィールドの正規化にわたって [ECDSA](concepts.md#digital-sigs) 署名を計算`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`し`SIGN_ONLY`、ECDSA 署名を `aws_dbe_foot`フィールドに保存します。
**注記**  
ECDSA 署名はデフォルトで有効になっていますが、必須ではありません。

1. 暗号化メソッドは、暗号化および署名されたレコードをデータベースに格納します。

## 復号および検証
<a name="decrypt-and-verify"></a>

1. 暗号マテリアルマネージャー (CMM) は、プレーンテキストの[データキー](concepts.md#data-key)および関連付けられた MAC キーを含む、マテリアルの説明に格納されている復号マテリアルを復号メソッドに提供します。

   1. CMM は、指定されたキーリング内の[ラッピングキー](concepts.md#wrapping-key)を使用して暗号化されたデータキーを復号し、プレーンテキストのデータキーを返します。

1. 復号メソッドは、マテリアルの説明内のキーコミットメントの値を比較および検証します。

1. 復号メソッドは、署名フィールド内の署名を検証します。

   これは`ENCRYPT_AND_SIGN`、定義した許可された認証されていないフィールドの`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`リストから、、`SIGN_ONLY`、または とマークされているフィールドを識別します。 [Allowed unsigned attributes](ddb-java-using.md#allowed-unauth)復号メソッドは、**ステップ 1 **で返された MAC キーを使用して、`ENCRYPT_AND_SIGN`、、`SIGN_ONLY`または とマークされたフィールドの HMAC 値を再計算して比較します`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`。その後、[暗号化コンテキスト](concepts.md#encryption-context)に格納されているパブリックキーを使用して [ECDSA 署名](concepts.md#digital-sigs)を検証します。

1. 復号メソッドは、プレーンテキストデータキーを使用して、`ENCRYPT_AND_SIGN` とマークされた各値を復号します。 AWS Database Encryption SDK は、プレーンテキストのデータキーを破棄します。

1. 復号方法は、プレーンテキストレコードを返します。

# AWS Database Encryption SDK でサポートされているアルゴリズムスイート
<a name="supported-algorithms"></a>


****  

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

*アルゴリズムスイート*は、暗号化アルゴリズムと関連する値の集合です。暗号化システムはアルゴリズム実装を使用して暗号文を生成します。

 AWS Database Encryption SDK は、アルゴリズムスイートを使用してデータベース内のフィールドを暗号化して署名します。サポートされているすべてのアルゴリズムスイートは、AES-GCM と呼ばれる Galois/Counter Mode (GCM) を使用した Advanced Encryption Standard (AES) アルゴリズムを使用して raw データを暗号化します。 AWS Database Encryption SDK は 256 ビットの暗号化キーをサポートしています。認証タグの長さは常に 16 バイトです。


**AWS データベース暗号化 SDK アルゴリズムスイート**  

| アルゴリズム | 暗号化アルゴリズム | データキーの長さ (ビット) | キー導出アルゴリズム | 対称署名アルゴリズム | 対称署名アルゴリズム | キーコミットメント | 
| --- | --- | --- | --- | --- | --- | --- | 
| デフォルト | AES-GCM | 256 | SHA-512 を使用する HKDF | HMAC-SHA-384 | P-384 および SHA-384 を使用する ECDSA | SHA-512 を使用する HKDF | 
| ECDSA デジタル署名を使用しない AES-GCM | AES-GCM | 256 | SHA-512 を使用する HKDF | HMAC-SHA-384 | なし | SHA-512 を使用する HKDF | 

**暗号化アルゴリズム**  
使用する暗号化アルゴリズムの名前とモード。 AWS Database Encryption SDK のアルゴリズムスイートは、Galois/Counter Mode (GCM) で Advanced Encryption Standard (AES) アルゴリズムを使用します。  


**データキーの長さ**  
[データキー](concepts.md#data-key)の長さ (ビット単位)。 AWS Database Encryption SDK は 256 ビットのデータキーをサポートしています。データキーは、HMAC extract-and-expandキー取得関数 (HKDF) への入力として使用されます。HKDF の出力は、暗号化アルゴリズムのデータ暗号化キーとして使用されます。

**キー導出アルゴリズム**  
データ暗号化キーを取得するために使用される、HMAC ベースの抽出および展開キー取得関数 (HKDF)。 AWS Database Encryption SDK は、[RFC 5869 で定義された HKDF ](https://tools.ietf.org/html/rfc5869)を使用します。  
+ 使用されるハッシュ関数は SHA-512 です
+ 抽出ステップの場合
  + ソルトは使用されません。RFC の場合、ソルトはゼロの文字列に設定されます。
  + 入力キーマテリアルは、キー[リングのデータキー](concepts.md#keyring-concept)です。
+ 展開ステップの場合
  + 入力疑似ランダムキーは抽出ステップからの出力です。
  + キーラベルは、ビッグエンディアンバイト順序の `DERIVEKEY` 文字列を UTF-8 でエンコードしたバイトです。
  + 入力情報は、アルゴリズム ID とキー ラベルの連結です (この順序)。
  + 出力キーマテリアルの長さは**データキーの長さ**です。この出力は、暗号化アルゴリズムのデータ暗号化キーとして使用されます。

**対称署名アルゴリズム**  
対称署名の生成に使用されるハッシュベースのメッセージ認証コード (HMAC) アルゴリズム。サポートされているすべてのアルゴリズムスイートには、HMAC 検証が含まれています。  
 AWS Database Encryption SDK は、マテリアルの説明と、`ENCRYPT_AND_SIGN`、、`SIGN_ONLY`または とマークされたすべてのフィールドをシリアル化します`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`。次に、暗号化ハッシュ関数アルゴリズム (SHA-384) で HMAC を使用して正規化に署名します。  
対称 HMAC 署名は、 AWS Database Encryption SDK がレコードに追加する新しいフィールド (`aws_dbe_foot`) に保存されます。

**対称署名アルゴリズム**  
非対称デジタル署名を生成するために使用される署名アルゴリズム。  
 AWS Database Encryption SDK は、マテリアルの説明と、`ENCRYPT_AND_SIGN`、、`SIGN_ONLY`または とマークされたすべてのフィールドをシリアル化します`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`。次に、楕円曲線デジタル署名アルゴリズム (ECDSA) を以下の詳細とともに使用して正規化に署名します。  
+ 使用される楕円曲線は、デジタル署名標準 (DSS) (FIPS PUB 186-4) で定義されている P-384 です。 [http://doi.org/10.6028/NIST.FIPS.186-4](http://doi.org/10.6028/NIST.FIPS.186-4)
+ 使用されるハッシュ関数は SHA-384 です。
非対称 ECDSA 署名は、 `aws_dbe_foot`フィールドに対称 HMAC 署名とともに保存されます。  
ECDSA デジタル署名はデフォルトで含まれていますが、必須ではありません。

**キーコミットメント**  
コミットキーの取得に使用される HMAC extract-and-expandキー取得関数 (HKDF)。  
+ 使用されるハッシュ関数は SHA-512 です
+ 抽出ステップの場合
  + ソルトは使用されません。RFC の場合、ソルトはゼロの文字列に設定されます。
  + 入力キーマテリアルは、キー[リングのデータキー](concepts.md#keyring-concept)です。
+ 展開ステップの場合
  + 入力疑似ランダムキーは抽出ステップからの出力です。
  + 入力情報は、`COMMITKEY`文字列の UTF-8-encodedされたバイトをビッグエンディアンバイト順で表したものです。
  + 出力キーマテリアルの長さは 256 ビットです。この出力はコミットキーとして使用されます。
コミットキーは、[マテリアルの説明](reference.md#material-description-format)に対する[レコードコミットメント](reference.md#format-commitment)、つまり個別の 256 ビット Hash-Based Message Authentication Code (HMAC) ハッシュを計算します。アルゴリズムスイートへのキーコミットメントの追加に関する技術的な説明については、Cryptology ePrint Archiveの「[Key Committing AEADs](https://eprint.iacr.org/2020/1153)」を参照してください。

## デフォルトのアルゴリズムスイート
<a name="recommended-algorithms"></a>

デフォルトでは、 AWS Database Encryption SDK は、AES-GCM、HMAC extract-and-expandキー取得関数 (HKDF)、HMAC 検証、ECDSA デジタル署名、キーコミットメント、および 256 ビット暗号化キーを備えたアルゴリズムスイートを使用します。

デフォルトのアルゴリズムスイートには、HMAC 検証 (対称署名) と [ECDSA デジタル署名](concepts.md#digital-sigs) (非対称署名) が含まれます。これらの署名は、 AWS Database Encryption SDK がレコードに追加する新しいフィールド (`aws_dbe_foot`) に保存されます。ECDSA デジタル署名は、認可ポリシーで 1 つのユーザーのセットにデータの暗号化を許可し、別のユーザーのセットにデータの復号を許可する場合に特に便利です。

デフォルトのアルゴリズムスイートでは、[データキーをレコードに結び付ける HMAC ハッシュであるキーコミットメント](concepts.md#key-commitment)も取得されます。キーコミットメント値は、マテリアルの説明とコミットキーから計算された HMAC です。その後、キーコミットメントの値は、マテリアルの説明に格納されます。キーのコミットメントにより、各暗号文は 1 つのプレーンテキストのみに確実に復号されます。これは、暗号化アルゴリズムへの入力として使用されるデータキーを検証することによって行います。暗号化時に、アルゴリズムスイートはキーコミットメント HMAC を取得します。復号する前に、データキーが同じキーコミットメント HMAC を生成することを検証します。一致しない場合、復号呼び出しは失敗します。

## ECDSA デジタル署名を使用しない AES-GCM
<a name="other-algorithms"></a>

デフォルトのアルゴリズムスイートはほとんどのアプリケーションに適していますが、代替アルゴリズムスイートを選択できます。たとえば、一部の信頼モデルは、ECDSA デジタル署名のないアルゴリズムスイートによって満たされます。このスイートは、データを暗号化するユーザーとデータを復号するユーザーが等しく信頼されている場合にのみ使用します。

すべての AWS Database Encryption SDK アルゴリズムスイートには、HMAC 検証 (対称署名) が含まれています。唯一の違いは、ECDSA デジタル署名のない AES-GCM アルゴリズムスイートには、信頼性と否認のない追加のレイヤーを提供する非対称署名がないことです。

たとえば、キーリング 、、`wrappingKeyA``wrappingKeyB`および に複数のラッピングキーがあり`wrappingKeyC`、 を使用してレコードを復号する場合`wrappingKeyA`、HMAC 対称署名は、レコードが にアクセスできるユーザーによって暗号化されたことを確認します`wrappingKeyA`。デフォルトのアルゴリズムスイートを使用した場合、HMACs の同じ検証を提供し`wrappingKeyA`、さらに ECDSA デジタル署名を使用して、レコードが の暗号化アクセス許可を持つユーザーによって暗号化されたことを確認します`wrappingKeyA`。

デジタル署名のない AES-GCM アルゴリズムスイートを選択するには、暗号化設定に次のスニペットを含めます。

------
#### [ Java ]

次のスニペットは、ECDSA デジタル署名のない AES-GCM アルゴリズムスイートを指定します。詳細については、「[AWS Database Encryption SDK for DynamoDB の暗号化設定](ddb-java-using.md#ddb-config-encrypt)」を参照してください。

```
.algorithmSuiteId(
    DBEAlgorithmSuiteId.ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY_SYMSIG_HMAC_SHA384)
```

------
#### [ C\$1 / .NET ]

次のスニペットは、ECDSA デジタル署名のない AES-GCM アルゴリズムスイートを指定します。詳細については、「[AWS Database Encryption SDK for DynamoDB の暗号化設定](ddb-net-using.md#ddb-net-config-encrypt)」を参照してください。

```
AlgorithmSuiteId = DBEAlgorithmSuiteId.ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY_SYMSIG_HMAC_SHA384
```

------
#### [ Rust ]

次のスニペットは、ECDSA デジタル署名のない AES-GCM アルゴリズムスイートを指定します。詳細については、「[AWS Database Encryption SDK for DynamoDB の暗号化設定](ddb-rust-using.md#ddb-rust-config-encrypt)」を参照してください。

```
.algorithm_suite_id(
    DbeAlgorithmSuiteId::AlgAes256GcmHkdfSha512CommitKeyEcdsaP384SymsigHmacSha384,
)
```

------