AWS Encryption SDK の概念 - AWS Encryption SDK

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

AWS Encryption SDK の概念

このセクションでは、AWS Encryption SDK で使用される概念について説明するとともに用語集とリファレンスを提供します。これが考案されたのは、AWS Encryption SDK の仕組みおよびその説明に使用される用語を理解できるようにするためです。

サポートが必要ですか?

エンベロープ暗号化

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

データキーの保護

AWS Encryption SDK では、各メッセージを一意のデータキーで暗号化します。その後、指定したラッピングキーでデータキーを暗号化します。返される暗号化されたメッセージの暗号化されたデータを使用して、暗号化されたデータキーが保存されます。

ラッピングキーを指定するには、キーリングまたはマスターキープロバイダーを使用します。


                            を使用したエンベロープ暗号化AWS Encryption SDK
複数のラッピングキーで同じデータを暗号化する

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

データを復号するには、この暗号化されたデータキーのいずれかを復号できるラッピングキーを指定する必要があります。


                            各ラッピングキーは同じデータキーを暗号化するため、ラッピングキーごとに 1 つの暗号化されたデータキーになります。
複数のアルゴリズムの強度の結合

データを暗号化するには、デフォルトの場合、AWS Encryption SDK では、AES-GCM 対称暗号化、キー取得関数 (HKDF)、および署名を含む高度なアルゴリズムスイートを使用します。データキーを暗号化するには、ラッピングキーに適した対称または非対称の暗号化アルゴリズムを指定できます。

一般的に、対称キー暗号化アルゴリズムは迅速で、非対称またはパブリックキー暗号化よりも小さい暗号化テキストが生成されます。しかし、パブリックキーのアルゴリズムはロールを本質的に分離し、キー管理を簡単にします。それぞれの強みを組み合わせるには、対称キー暗号化でデータを暗号化し、次にデータキーをパブリックキー暗号化で暗号化します。

データキー

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

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

データキーを保護するために、AWS Encryption SDK では、ラッピングキーまたはマスターキーと呼ばれる 1 つ以上のキー暗号化キーを使用してデータキーを暗号化します。AWS Encryption SDK でプレーンテキストデータキーを使用して暗号化されたデータは、メモリから速やかに削除されます。その後、暗号化オペレーションで返る暗号化されたメッセージの暗号化されたデータを使用して、暗号化されたデータキーが保存されます。詳細については、「AWS Encryption SDK のしくみ」を参照してください。

ヒント

AWS Encryption SDK では、データ暗号化キーデータキーが区別されます。デフォルトのスイートを含むサポートされているアルゴリズムスイートのいくつかは、データキーが暗号化の上限に到達することを防ぐ、キー取得関数を使用します。キー取得関数は、データキーを入力として受け取り、データの暗号化に実際に使用されたデータ暗号化キーを返します。そのため、データは、データキー「によって」暗号化されているというよりは、データキーの「下で」暗号化されていると言えます。

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

ラッピングキー

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

注記

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

-AWS Encryption SDKなど、一般的に使用されるいくつかのラッピングキーをサポートしています。AWS Key Management Service(AWS KMS) 対称AWS KMS keysを含むマルチリージョンの KMS キー)、raw AES-GCM (Advanced Encryption Standard/Galois Counter Mode) キー、raw RSA キー また、独自のラッピングキーを拡張または実装することもできます。

エンベロープ暗号化を使用する場合は、認可されていないアクセスからラッピングキーを保護する必要があります。これは、次のいずれかの方法で行うことができます。

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

キーリングおよびマスターキープロバイダー

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

キーリングは、データキーの生成、暗号化、復号を行います。キーリングを定義するとき、データキーを暗号化するラッピングキーを指定できます。ほとんどのキーリングは、少なくとも 1 つのラッピングキーを指定するか、ラッピングキーを提供および保護するサービスを指定します。追加の設定オプションを使用して、ラッピングキーのないキーリングや、より複雑なキーリングを定義することもできます。AWS Encryption SDK で定義するキーリングの選択と使用については、キーリングの使用 を参照してください。キーリングは C、C #/.NET、および JavaScript でサポートされます。

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

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

ラッピングキーを指定する方法については、「」を参照してください。ラッピングキーを選択する

暗号化コンテキスト

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

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

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

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

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

データを復号するには、暗号化されたメッセージを渡します。AWS Encryption SDK では、暗号化されたメッセージのヘッダーから暗号化コンテキストを抽出することができるため、暗号化コンテキストを別々に指定する必要はありません。ただし、暗号化コンテキストは、暗号化された適切なメッセージを復号していることを確認するのに役立ちます。

  • AWS Encryption SDKコマンドラインインターフェイス (CKI) において、復号コマンドで暗号化コンテキストを指定した場合、CLI で、プレーンテキストのデータが返る前に、暗号化されたメッセージの暗号化コンテキストにその値が存在することが検証されます。

  • 他のプログラミング言語の実装では、復号レスポンスに暗号化コンテキストとプレーンテキストデータが含まれます。アプリケーションの復号関数では、プレーンテキストデータを返す前に、復号レスポンスの暗号化コンテキストに暗号化リクスとの暗号化コンテキスト (またはサブセット) が含まれていることを常に確認する必要があります。

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

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

暗号化されたメッセージ

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

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

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

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

アルゴリズムスイート

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

AWS Encryption SDK は、推奨されているアルゴリズムスイートをすべての暗号化オペレーションのデフォルトにします。標準とベストプラクティスの向上に伴い、デフォルトは変更される可能性があります。データの暗号化リクエスト内、または暗号化マテリアルマネージャー (CMM) の作成時に、代替のアルゴリズムスイートを指定できます。ただし、状況からして代替が必須でない限り、デフォルトを使用することをお勧めします。現在のデフォルトは、HMAC ベースの AES-GCM です。 extract-and-expand キー導出関数(HKDF)、キーコミットメント、と楕円曲線 DSA (ECDSA)署名と 256 ビット暗号化キー

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

暗号化マテリアルマネージャー

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

AWS Encryption SDK に用意されているデフォルトの CMM またはキャッシュ CMM を使用するか、カスタムの CMM を作成することができます。CMM は指定できますが、必須ではありません。キーリングまたはマスターキープロバイダーを指定すると、AWS Encryption SDK はデフォルトの CMMを自動で作成します。デフォルトの CMM は、指定したキーリングまたはマスターキープロバイダーから暗号化マテリアルまたは復号マテリアルを取得します。これには、AWS Key Management Service(AWS KMS) などの暗号化サービスの呼び出しが含まれる場合があります。

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

対称暗号化と非対称暗号化

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

非対称暗号化では、数学的に関連するデータキーペアが使用されます。ペアの 1 つのキーでデータが暗号化され、ペアの他のキーだけでデータが復号されます。詳細については、AWS 暗号化サービスおよびツールガイドの「暗号アルゴリズム」を参照してください。

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

データの暗号化 (対称暗号化)

データを暗号化するには、AWS Encryption SDK は対称データキーおよび対称暗号化アルゴリズムを含むアルゴリズムスイートを使用します。データを復号するには、AWS Encryption SDK は、同じデータキーと同じアルゴリズムスイートを使用します。

データキーの暗号化 (対称暗号化または非対称暗号化)

暗号化および復号化のオペレーションに指定するキーリングまたはマスターキープロバイダーにより、対称データキーの暗号化および復号化方法が決まります。AWS KMS キーリングのように対称暗号化を使用するキーリングまたはマスターキープロバイダーを選択するか、Raw RSA キーリングまたは JceMasterKey など、非対称暗号化を使用するものを選択できます。

キーコミットメント

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

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

AWS Encryption SDK では、常に 1 つの一意のデータキーで各プレーンテキストメッセージが暗号化されます。複数のラッピングキー (またはマスターキー) でそのデータキーを暗号化する場合がありますが、ラッピングキーは常に同じデータキーを暗号化します。ただし、手動で作成した高度な暗号化されたメッセージには、実際には異なるデータキーが含まれて、それぞれ異なるラッピングキーによって暗号化されることがあります。例えば、あるユーザーが暗号化されたメッセージを復号すると 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 以降、AWS Encryption SDK ではコミットメントポリシーがサポートされ、デフォルトアルゴリズムスイートを設定して、使用できるアルゴリズムスイートを制限できます。このポリシーにより、データをキーコミットメントで暗号化および復号化するかどうかが決まります。

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

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

コミットメントポリシー

コミットメントポリシーは、アプリケーションがキーコミットメントで暗号化および復号化を行うかどうかを決定する構成設定です。キーコミットメントによる暗号化と復号化は、AWS Encryption SDK のベストプラクティスです。

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

注記

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

コミットメントポリシーの値
キーコミットメントで暗号化 キーコミットメントなしで暗号化 キーコミットメントで復号化 キーコミットメントなしで復号化
ForbidEncryptAllowDecrypt
RequireEncryptAllowDecrypt
RequireEncryptRequireDecrypt

コミットメントポリシー設定は、AWS Encryption SDK バージョン 1.7.x で導入されます。すべてのサポート対象プログラミング言語で有効です。

  • ForbidEncryptAllowDecrypt は、キーコミットメントの有無にかかわらず復号しますが、キーコミットメントでは暗号化しません。バージョン 1.7.x では、これのみがコミットメントポリシーの有効な値で、暗号化と復号化のすべてのオペレーションに使用されます。これは、アプリケーションを実行しているすべてのホストで、キーコミットメントを使用して暗号化された暗号化テキストに遭遇する前に、キーコミットメントを使用して復号化する準備をするように設計されています。

  • RequireEncryptAllowDecrypt では常にキーコミットメントで暗号化されます。復号化は、キーコミットメントが使用されているかどうかにかかわらず可能です。バージョン 2.0.x で導入されたこの値では、キーコミットメントによる暗号化を開始できますが、キーコミットメントによらない従来の暗号化テキストを復号化できます。

  • RequireEncryptRequireDecrypt では、キーコミットメントでのみ暗号化および復号化が行われます。この値がバージョン 2.0.x のデフォルトです。この値は、すべての暗号化テキストがキーコミットメントで暗号化されていることが確実な場合に使用します。

コミットメントポリシー設定により、使用できるアルゴリズムスイートが決まります。バージョン 1.7.x 以降、AWS Encryption SDK では、キーコミットメントのアルゴリズムスイートが署名ありと署名なしでサポートされます。コミットメントポリシーと競合するアルゴリズムスイートを指定した場合、AWS Encryption SDK はエラーを返します。

コミットメントポリシーの設定については、コミットメントポリシーの設定 を参照してください。

デジタル署名

システム間でのデジタルメッセージの整合性を確保するために、メッセージにデジタル署名を適用できます。デジタル署名は常に非対称です。プライベートキーを使用して署名を作成し、元のメッセージに追加します。受信者はパブリックキーを使用して、メッセージが署名後に変更されていないことを確認します。

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

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

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