

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

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

このセクションでは、 で使用される概念を紹介し AWS Encryption SDK、用語集とリファレンスを提供します。これは、 の AWS Encryption SDK 仕組みと説明に使用する用語を理解するのに役立つように設計されています。

サポートが必要ですか?
+ がエン[ベロープ暗号化](#envelope-encryption) AWS Encryption SDK を使用してデータを保護する方法について説明します。
+ エンベロープ暗号化の要素、データを保護する[データキー](#DEK)およびデータキーを保護する[ラッピングキー](#master-key)についての説明。
+ どのラッピングキーを使用するかを決める[キーリング](#keyring)と[マスターキープロバイダー](#master-key-provider)についての説明。
+ 暗号化プロセスの整合性を向上させる[暗号化コンテキスト](#encryption-context)についての説明。これはオプションですが、推奨されるベストプラクティスです。
+ 暗号化メソッドが返す[暗号化されたメッセージ](#message)についての説明。
+ その後、 AWS Encryption SDK 任意の[プログラミング言語で](programming-languages.md) を使用する準備が整いました。

**Topics**
+ [エンベロープ暗号化](#envelope-encryption)
+ [データキー](#DEK)
+ [ラッピングキー](#master-key)
+ [キーリングおよびマスターキープロバイダー](#keyring)
+ [暗号化コンテキスト](#encryption-context)
+ [暗号化されたメッセージ](#message)
+ [アルゴリズムスイート](#crypto-algorithm)
+ [暗号化マテリアルマネージャー](#crypt-materials-manager)
+ [対称暗号化と非対称暗号化](#symmetric-key-encryption)
+ [キーコミットメント](#key-commitment)
+ [コミットメントポリシー](#commitment-policy)
+ [デジタル署名](#digital-sigs)

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

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

**データキーの保護**  
は、各メッセージを一意のデータキーで AWS Encryption SDK 暗号化します。その後、指定したラッピングキーでデータキーを暗号化します。返される暗号化されたメッセージの暗号化されたデータを使用して、暗号化されたデータキーが保存されます。  
ラッピングキーを指定するには、[キーリング](#keyring)または[マスターキープロバイダー](#master-key-provider)を使用します。  

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


**複数のラッピングキーで同じデータを暗号化する**  
複数のラッピングキーでデータキーを暗号化できます。ユーザーごとに異なるラッピングキーを指定したり、異なるタイプのラッピングキーを指定したり、場所ごとにそのように指定したい場合があります。各ラッピングキーでは、それぞれ同じデータキーを暗号化します。は、暗号化されたデータを含むすべての暗号化されたデータキーを暗号化されたメッセージに AWS Encryption SDK 保存します。  
データを復号するには、この暗号化されたデータキーのいずれかを復号できるラッピングキーを指定する必要があります。  

![\[各ラッピングキーは同じデータキーを暗号化するため、ラッピングキーごとに 1 つの暗号化されたデータキーになります。\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/multiple-wrapping-keys-70.png)


**複数のアルゴリズムの強度の結合**  
デフォルトでは、 は AES-GCM 対称暗号化、キー取得関数 (HKDF)、および署名を備えた高度な[アルゴリズムスイート](supported-algorithms.md) AWS Encryption SDK を使用します。データキーを暗号化するには、ラッピングキーに適した[対称または非対称の暗号化アルゴリズム](#symmetric-key-encryption)を指定できます。  
一般的に、対称キー暗号化アルゴリズムは迅速で、非対称または*パブリックキー暗号化*よりも小さい暗号化テキストが生成されます。一方、パブリックキーのアルゴリズムはロールを本質的に分離し、キー管理を簡単にします。それぞれの強みを組み合わせるには、対称キー暗号化でデータを暗号化し、次にデータキーをパブリックキー暗号化で暗号化します。

## データキー
<a name="DEK"></a>

*データキー*は、データの暗号化に AWS Encryption SDK で使用される暗号化キーです。各データキーは、暗号化キーの要件に準拠したバイト配列です。[データキーキャッシュを使用している場合を除き](data-key-caching.md)、 AWS Encryption SDK は一意のデータキーを使用して各メッセージを暗号化します。

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

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

**ヒント**  
では AWS Encryption SDK、*データキー*と*データ暗号化キー*を区別します。デフォルトのスイートを含むサポートされている[アルゴリズムスイート](#crypto-algorithm)のいくつかは、データキーが暗号化の上限に到達することを防ぐ、[キー取得関数](https://en.wikipedia.org/wiki/Key_derivation_function)を使用します。キー取得関数は、データキーを入力として受け取り、データの暗号化に実際に使用されたデータ暗号化キーを返します。そのため、データは、データキー「によって」暗号化されているというよりは、データキーの「下で」暗号化されていると言えます。

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

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

ラッピングキー はキー暗号化キーであり、 AWS Encryption SDK ではこれを使用して、データを暗号化する [データキー](#DEK) を暗号化します。それぞれのプレーンテキストのデータキーは、1 つまたは複数のラッピングキーで暗号化することができます。[キーリング](#keyring)または[マスターキープロバイダー](#master-key-provider)の設定時に、データの保護に使用するラッピングキーを決定します。

**注記**  
*ラッピングキー*は、キーリングまたはマスターキープロバイダー内のキーを参照します。*マスターキー*は一般的に、マスターキープロバイダーを使用するときにインスタンス化する `MasterKey` クラスと関連します。

は、 (AWS KMS) 対称 [AWS KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys) ([マルチリージョン KMS キーを含む](configure.md#config-mrks))、raw AES-GCM (Advanced Encryption Standard/Galois Counter Mode) キー、raw RSA キーなど AWS Key Management Service 、一般的に使用されるいくつかのラッピングキー AWS Encryption SDK をサポートしています。また、独自のラッピングキーを拡張または実装することもできます。

エンベロープ暗号化を使用する場合は、認可されていないアクセスからラッピングキーを保護する必要があります。これは、次のいずれかの方法で行うことができます。
+ この目的のために設計された [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 Encryption SDK と統合され AWS KMS 、ラッピングキーの保護と使用に役立ちます。ただし、 AWS Encryption SDK には AWS または AWS のサービスは必要ありません。

## キーリングおよびマスターキープロバイダー
<a name="keyring"></a>

暗号化と復号に使用するラッピングキーを指定するには、キーリングまたはマスターキープロバイダーを使用します。が提供するキーリングとマスターキープロバイダーを使用する AWS Encryption SDK か、独自の実装を設計できます。 AWS Encryption SDK では、言語制約の対象となりながらも相互に互換性のあるキーリングとマスターキープロバイダーが提供されます。詳細については、「[キーリングの互換性](choose-keyring.md#keyring-compatibility)」を参照してください。

*キーリング*は、データキーの生成、暗号化、復号を行います。キーリングを定義するとき、データキーを暗号化する[ラッピングキー](#master-key)を指定できます。ほとんどのキーリングは、少なくとも 1 つのラッピングキーを指定するか、ラッピングキーを提供および保護するサービスを指定します。追加の設定オプションを使用して、ラッピングキーのないキーリングや、より複雑なキーリングを定義することもできます。が AWS Encryption SDK 定義するキーリングの選択と使用については、「」を参照してください[キーリング](choose-keyring.md)。

キーリングは、次のプログラミング言語でサポートされています。
+ AWS Encryption SDK for C
+ AWS Encryption SDK for JavaScript
+ AWS Encryption SDK .NET 用
+ のバージョン 3.*x* AWS Encryption SDK for Java
+ オプションの [Cryptographic Material Providers Library](https://github.com/aws/aws-cryptographic-material-providers-library) (MPL) 依存関係とともに使用する場合の AWS Encryption SDK for Pythonのバージョン 4.*x*。
+  AWS Encryption SDK for Rust のバージョン 1.*x* 
+  AWS Encryption SDK for Go のバージョン 0.1.*x* 以降

*マスターキープロバイダー*はキーリングの代替品です。マスターキープロバイダーは、指定したラッピングキー (またはマスターキー) を返します。各マスターキーは 1 つのマスターキープロバイダーに関連付けられていますが、マスターキープロバイダーは通常複数のマスターキーを提供しています。マスターキープロバイダーは、Java、Python、および AWS Encryption CLI でサポートされています。

暗号化には、キーリング (またはマスターキープロバイダー) を指定する必要があります。復号化には、同じキーリング (またはマスターキープロバイダー) を指定することも、別のキーリングを指定することもできます。暗号化時に、 AWS Encryption SDK は指定したすべてのラッピングキーを使用してデータキーを暗号化します。復号化するとき、 AWS Encryption SDK では、指定したラッピングキーのみを使用して、暗号化されたデータキーを復号します。復号化のラッピングキーの指定はオプションですが、 AWS Encryption SDK [ベストプラクティス](best-practices.md)です。

ラッピングキーの指定の詳細については、「[ラッピングキーの選択](configure.md#config-keys)」を参照してください。

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

暗号化オペレーションのセキュリティを向上させるには、データを暗号化するためのすべてのリクエストに暗号化コンテキストを含めます。暗号化コンテキストの使用はオプションですが、暗号化のベストプラクティスとして使用することをお勧めします。

*暗号化コンテキスト*は、任意のシークレットではない追加認証データを含む名前と値のペアのセットです。暗号化コンテキストには選択した任意のデータを含むことができますが、一般的には、ファイルの種類、目的、または所有権などの、ログ記録と追跡に有用なデータが含まれます。データを暗号化する場合、暗号化コンテキストは暗号化されたデータに暗号化されてバインドされます。これにより、データを復号するために同じ暗号化コンテキストが必要になります。 AWS Encryption SDK より返る[暗号化されたメッセージ](#message)のヘッダーには、プレーンテキストの暗号化コンテキストが含まれます。

が AWS Encryption SDK 使用する暗号化コンテキストは、指定した暗号化コンテキストと、[暗号化マテリアルマネージャー](#crypt-materials-manager) (CMM) が追加するパブリックキーペアで構成されます。具体的には、[署名付きの暗号化アルゴリズム](algorithms-reference.md)を使用する度に、予約名 `aws-crypto-public-key` と、パブリック検証キーを表す値で構成される暗号化コンテキストに名前と値のペアが CMM によって追加されます。暗号化コンテキスト`aws-crypto-public-key`の名前は によって予約 AWS Encryption SDK され、暗号化コンテキストの他のペアの名前として使用することはできません。詳細については、*メッセージ形式リファレンス*の「[AAD](message-format.md#header-aad)」を参照してください。

以下の暗号化コンテキストの例は、リクエストで指定した 2 つの暗号化コンテキストペアと、CMM によって追加されるパブリックキーのペアで構成されます。

```
"Purpose"="Test", "Department"="IT", aws-crypto-public-key=<public key>
```

データを復号するには、暗号化されたメッセージを渡します。は暗号化されたメッセージヘッダーから暗号化コンテキストを抽出 AWS Encryption SDK できるため、暗号化コンテキストを個別に指定する必要はありません。ただし、暗号化コンテキストは、暗号化された適切なメッセージを復号していることを確認するのに役立ちます。
+ [AWS Encryption SDK コマンドラインインターフェイス](crypto-cli.md) (CKI) において、復号コマンドで暗号化コンテキストを指定した場合、CLI で、プレーンテキストのデータが返る前に、暗号化されたメッセージの暗号化コンテキストにその値が存在することが検証されます。
+ 他のプログラミング言語実装では、復号レスポンスに暗号化コンテキストとプレーンテキストデータが含まれます。アプリケーションの復号関数では、プレーンテキストデータを返す前に、復号レスポンスの暗号化コンテキストに暗号化リクスとの暗号化コンテキスト (またはサブセット) が含まれていることを常に確認する必要があります。

**注記**  
次のバージョンでは、[必要な暗号化コンテキスト CMM](configure.md#config-required-encryption-context-cmm) がサポートされています。これを使用して、すべての暗号化リクエストで暗号化コンテキストを要求できます。  
のバージョン 3.*x* AWS Encryption SDK for Java
 AWS Encryption SDK for .NET のバージョン 4.*x* 以降
オプションの [Cryptographic Material Providers Library](https://github.com/aws/aws-cryptographic-material-providers-library) (MPL) 依存関係とともに使用する場合の AWS Encryption SDK for Pythonのバージョン 4.*x*。
 AWS Encryption SDK for Rust のバージョン 1.*x* 
 AWS Encryption SDK for Go のバージョン 0.1.*x* 以降

暗号化コンテキストを選択する際、シークレットではないことに注意してください。暗号化コンテキストは、 AWS Encryption SDK が返す[暗号化されたメッセージ](#message)のヘッダーのプレーンテキストに表示されます。を使用している場合 AWS Key Management Serviceは、 などの監査レコードやログに暗号化コンテキストがプレーンテキストで表示されることもあります AWS CloudTrail。

コード内の暗号化コンテキストを送信および検証する例については、使用している[プログラミング言語](programming-languages.md)の例を参照してください。

## 暗号化されたメッセージ
<a name="message"></a>

でデータを暗号化すると AWS Encryption SDK、暗号化されたメッセージが返されます。

*暗号化されたメッセージ*は、データキーの暗号化されたコピーと共に暗号化されたデータを含む、小型で[書式設定されたデータ構造](message-format.md)、アルゴリズム ID、および必要に応じて[暗号化コンテキスト](#encryption-context)と[デジタル署名](#digital-sigs)です。 AWS Encryption SDK の暗号化オペレーションは暗号化されたメッセージを返し、復号オペレーションは暗号化されたメッセージを入力として受け取ります。

暗号化されたデータとその暗号化されたデータキーを組み合わせることで、復号オペレーションを合理化し、暗号化するデータから暗号化されたデータキーを個別に保存して管理する必要がなくなります。

暗号化されたメッセージに関する技術情報については、「[暗号化されたメッセージの形式](message-format.md)」を参照してください。

## アルゴリズムスイート
<a name="crypto-algorithm"></a>

はアルゴリズムスイート AWS Encryption SDK を使用して、暗号化および復号オペレーションが返す[暗号化されたメッセージ](#message)内のデータを暗号化および署名します。 AWS Encryption SDK では、いくつかの[アルゴリズムスイート](supported-algorithms.md)がサポートされています。サポートされているすべてのスイートは、Advanced Encryption Standard (AES) を主なアルゴリズムとして、他のアルゴリズムや値と組み合わせて使用します。

は、すべての暗号化オペレーションのデフォルトとして推奨アルゴリズムスイート AWS Encryption SDK を確立します。標準とベストプラクティスの向上に伴い、デフォルトは変更される可能性があります。データの暗号化リクエスト内、または[暗号化マテリアルマネージャー (CMM)](#crypt-materials-manager) の作成時に、代替のアルゴリズムスイートを指定できます。ただし、状況からして代替が必須でない限り、デフォルトを使用することをお勧めします。現在のデフォルトは、HMAC ベースの抽出および展開[キー取得関数](https://en.wikipedia.org/wiki/HKDF) ([HKDF](https://en.wikipedia.org/wiki/HKDF)) を使用する AES-GCM、[キーコミットメント](#key-commitment)、[楕円曲線 DSA (ECDSA)](#digital-sigs) 署名、256 ビット暗号化キーです。

アプリケーションで高いパフォーマンスを必要とし、データを暗号化するユーザーとデータを復号化するユーザーが同等に信頼できる場合は、デジタル署名のないアルゴリズムスイートを指定することを検討してください。ただし、キーコミットメントとキー取得関数を含むアルゴリズムスイートを強くお勧めします。これらの機能のないアルゴリズムスイート機能は、下位互換性のためにのみサポートされています。

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

暗号化マテリアルマネージャー (CMM) は、データの暗号化と復号化に使用される暗号化マテリアルを組み立てます。*暗号化マテリアル*には、プレーンテキストおよび暗号化されたデータキー、オプションのメッセージ署名キーが含まれます。CMM を直接操作することは決してありません。このためには、暗号化メソッドおよび復号メソッドを使用します。

 AWS Encryption SDK が提供するデフォルトの CMM または[キャッシュ CMM ](data-key-caching.md)を使用するか、カスタム CMM を記述できます。CMM は指定できますが、必須ではありません。キーリングまたはマスターキープロバイダーを指定すると、 によってデフォルトの CMM AWS Encryption SDK が作成されます。デフォルトの CMM は、指定したキーリングまたはマスターキープロバイダーから暗号化マテリアルまたは復号マテリアルを取得します。これには、[AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)(AWS KMS) などの暗号化サービスの呼び出しが含まれる場合があります。

CMM は AWS Encryption SDK とキーリング (またはマスターキープロバイダー) の間の連絡係として機能するため、ポリシーの適用やキャッシュのサポートなど、カスタマイズや拡張に理想的なポイントです。は、データキーキャッシュをサポートするキャッシュ CMM AWS Encryption SDK を提供します。 [データキーキャッシュ](data-key-caching.md)

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

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

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

はエン[ベロープ暗号化](#envelope-encryption) AWS Encryption SDK を使用します。データは対称データキーで暗号化されます。対称データキーを 1 つ以上の対称または非対称のラッピングキーで暗号化します。返される[暗号化されたメッセージ](#message)には、暗号化されたデータおよび少なくとも 1 つの暗号化されたデータキーのコピーが含まれます。

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

**データキーの暗号化 (対称暗号化または非対称暗号化)**  
暗号化および復号化のオペレーションに指定する[キーリング](#keyring)または[マスターキープロバイダー](#master-key-provider)により、対称データキーの暗号化および復号化方法が決まります。キーリングなどの対称暗号化を使用するキーリングまたはマスター AWS KMS キープロバイダー、または raw RSA キーリングや などの非対称暗号化を使用するキーリングまたはマスターキープロバイダーを選択できます`JceMasterKey`。

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

は*、キーコミットメント* (*堅牢性*とも呼ばれます) AWS Encryption SDK をサポートしています。これは、各暗号文を 1 つのプレーンテキストにのみ復号化できることを保証するセキュリティプロパティです。これを行うために、キーコミットメントでは、メッセージを暗号化したデータキーのみが復号化に使用されることが保証されます。キーコミットメントによる暗号化と復号化は、[AWS Encryption SDK のベストプラクティス](best-practices.md)です。

最新の対称暗号 (AES を含む) では、 AWS Encryption SDK が各プレーンテキストメッセージの暗号化に使用する、[一意のデータキー](#DEK)などの単一のシークレットキーでプレーンテキストが暗号化されます。同じデータキーでこのデータを復号すると、元のデータと同じプレーンテキストが返されます。別のキーで復号化すると、通常は失敗します。ただし、2 つの異なるキーで暗号化テキストを復号化することは可能です。まれに、数バイトの暗号化テキストを別の理解可能なプレーンテキストに復号化できるキーを見つけることは可能です。

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

このシナリオを防ぐために、 は暗号化および復号時のキーコミットメント AWS Encryption SDK をサポートします。がキーコミットメントでメッセージを AWS Encryption SDK 暗号化すると、暗号文を生成した一意のデータキーを、シークレット以外のデータキー識別子である*キーコミットメント文字列*に暗号的にバインドします。その後、キーコミットメント文字列は、暗号化されたメッセージのメタデータに保存されます。キーコミットメントを使用してメッセージを復号すると、 AWS Encryption SDK はデータキーがその暗号化されたメッセージの唯一のキーであることを確認します。データキーの検証が失敗すると、復号オペレーションは失敗します。

キーコミットメントのサポートは、バージョン 1.7.*x* で導入されました。このバージョンではキーコミットメントでメッセージを復号化できますが、キーコミットメントによる暗号化はできません。このバージョンを使用して、キーコミットメントで暗号化テキストを復号化する機能を完全にデプロイできます。バージョン 2.0.*x* では、キーコミットメントが完全にサポートされます。デフォルトでは、キーコミットメントでのみ暗号化および復号化が行われます。これは、 の以前のバージョンで暗号化された暗号文を復号する必要がないアプリケーションに最適です AWS Encryption SDK。

キーコミットメントによる暗号化と復号化がベストプラクティスですが、使用時期を決定し、それを採用するペースを調整できます。バージョン 1.7.*x* 以降、 は[デフォルトのアルゴリズムスイート](supported-algorithms.md)を設定し、使用できるアルゴリズムスイートを制限する[コミットメントポリシー](#commitment-policy) AWS Encryption SDK をサポートしています。このポリシーにより、データをキーコミットメントで暗号化および復号化するかどうかが決まります。

キーコミットメントでは、[暗号化メッセージがわずかに大きくなり (\$1 30 バイト)](message-format.md)、処理に時間がかかります。アプリケーションでサイズやパフォーマンスに注意が必要である場合は、キーコミットメントをオプトアウトすることもできます。しかし、必要である場合にのみオプトアウトしてください。

バージョン 1.7.*x* および 2.0.*x* への移行、およびキーコミットメント機能に関する詳細については、[の移行 AWS Encryption SDK](migration.md) を参照してください。キーコミットメントに関する技術情報については、[AWS Encryption SDK アルゴリズムリファレンス](algorithms-reference.md) および [AWS Encryption SDK メッセージ形式のリファレンス](message-format.md) を参照してください。

## コミットメントポリシー
<a name="commitment-policy"></a>

*コミットメントポリシー*は、アプリケーションが[キーコミットメント](#key-commitment)で暗号化および復号化を行うかどうかを決定する構成設定です。キーコミットメントによる暗号化と復号化は、[AWS Encryption SDK のベストプラクティス](best-practices.md)です。

コミットメントポリシーには 3 つの値があります。

**注記**  
テーブル全体を表示するには、水平または垂直にスクロールする必要があります。


**コミットメントポリシーの値**  

| 値 | キーコミットメントで暗号化 | キーコミットメントなしで暗号化 | キーコミットメントで復号化 | キーコミットメントなしで復号化 | 
| --- | --- | --- | --- | --- | 
| ForbidEncryptAllowDecrypt | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-no.png)  | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-yes.png)  | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-yes.png) | 
| RequireEncryptAllowDecrypt | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-no.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-yes.png) | 
| RequireEncryptRequireDecrypt | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-no.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/ja_jp/encryption-sdk/latest/developer-guide/images/icon-no.png) | 

コミットメントポリシー設定は AWS Encryption SDK バージョン 1.7.*x* で導入されました。すべてのサポート対象[プログラミング言語](programming-languages.md)で有効です。
+ `ForbidEncryptAllowDecrypt` は、キーコミットメントの有無にかかわらず復号しますが、キーコミットメントでは暗号化しません。この値は、バージョン 1.7.*x* で導入され、アプリケーションを実行しているすべてのホストがキーコミットメントで暗号化された暗号文に遭遇する前に、キーコミットメントで復号する準備をするように設計されています。
+ `RequireEncryptAllowDecrypt` では常にキーコミットメントで暗号化されます。復号化は、キーコミットメントが使用されているかどうかにかかわらず可能です。バージョン 2.0.*x* で導入されたこの値では、キーコミットメントによる暗号化を開始できますが、キーコミットメントによらない従来の暗号化テキストを復号化できます。
+ `RequireEncryptRequireDecrypt` では、キーコミットメントでのみ暗号化および復号化が行われます。この値がバージョン 2.0.*x* のデフォルトです。この値は、すべての暗号化テキストがキーコミットメントで暗号化されていることが確実な場合に使用します。

コミットメントポリシー設定により、使用できるアルゴリズムスイートが決まります。バージョン 1.7.*x* 以降、 は、署名の有無にかかわらず、キーコミットメントの[アルゴリズムスイート](supported-algorithms.md) AWS Encryption SDK をサポートしています。コミットメントポリシーと競合するアルゴリズムスイートを指定した場合、 AWS Encryption SDK はエラーを返します。

コミットメントポリシーの設定については、[コミットメントポリシーの設定](migrate-commitment-policy.md) を参照してください。

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

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

この問題を回避するため、 では、暗号化されたメッセージの末尾に楕円曲線デジタル署名アルゴリズム (ECDSA) 署名の追加 AWS Encryption SDK がサポートされています。署名アルゴリズムスイートを使用すると、 は暗号化されたメッセージごとに一時的なプライベートキーとパブリックキーのペア AWS Encryption SDK を生成します。は AWS Encryption SDK 、パブリックキーをデータキーの暗号化コンテキストに保存し、プライベートキーを破棄します。これにより、パブリックキーで検証する別の署名を誰も作成できなくなります。このアルゴリズムは、暗号化されたデータキーをメッセージヘッダー内の追加の認証済みデータとしてバインドし、メッセージを復号化できるユーザーがパブリックキーを変更したり、署名の検証に影響を与えたりするのを防ぎます。

署名の検証では、復号化に大きなパフォーマンスコストがかかります。データを暗号化するユーザーとデータを復号化するユーザーが同等に信頼されている場合は、署名を含まないアルゴリズムスイートの使用を検討してください。

**注記**  
キーリングまたはラッピング暗号化マテリアルへのアクセスがエンクリプタと復号器の間で区別されない場合、デジタル署名は暗号化値を提供しません。

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

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