

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

# 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 キーリング