

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

# AWS Encryption SDK for JavaScript
<a name="javascript"></a>

 AWS Encryption SDK for JavaScript は、JavaScript でウェブブラウザアプリケーションを記述しているデベロッパーや Node.js でウェブサーバーアプリケーションを記述しているデベロッパー向けに、クライアント側の暗号化ライブラリを提供するように設計されています。

のすべての実装と同様に AWS Encryption SDK、 は高度なデータ保護機能 AWS Encryption SDK for JavaScript を提供します。これには[エンベロープ暗号化](concepts.md#envelope-encryption)、追加の認証データ (AAD)、キー取得および署名で使用する 256 ビット AES-GCM などのセキュアで認証済みの対称キー[アルゴリズムスイート](concepts.md#crypto-algorithm)などが含まれます。

のすべての言語固有の実装 AWS Encryption SDK は、言語の制約に従って相互運用できるように設計されています。JavaScript の言語による制約の詳細については、「[の互換性 AWS Encryption SDK for JavaScript](javascript-compatibility.md)」を参照してください。

**詳細はこちら**
+ を使用したプログラミングの詳細については AWS Encryption SDK for JavaScript、GitHub の [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/) リポジトリを参照してください。
+ プログラミング例については、[aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/) リポジトリの「[AWS Encryption SDK for JavaScript 例](js-examples.md)」および [example-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/example-browser) と [example-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/example-node) モジュールを参照してください。
+  を使用してウェブアプリケーションのデータを暗号化 AWS Encryption SDK for JavaScript する実際の例については、 AWS セキュリティブログの「 [AWS Encryption SDK for JavaScript と Node.js を使用してブラウザで暗号化を有効にする方法](https://aws.amazon.com/blogs/security/how-to-enable-encryption-browser-aws-encryption-sdk-javascript-node-js/)」を参照してください。

**Topics**
+ [互換性](javascript-compatibility.md)
+ [インストール](javascript-installation.md)
+ [モジュール](javascript-modules.md)
+ [例](js-examples.md)

# の互換性 AWS Encryption SDK for JavaScript
<a name="javascript-compatibility"></a>

 AWS Encryption SDK for JavaScript は、 の他の言語実装と相互運用できるように設計されています AWS Encryption SDK。ほとんどの場合、 でデータを暗号化 AWS Encryption SDK for JavaScript し、 [AWS Encryption SDK コマンドラインインターフェイス](crypto-cli.md)を含む他の言語実装で復号できます。また、 を使用して AWS Encryption SDK for JavaScript 、 の他の言語実装によって生成された[暗号化されたメッセージを](concepts.md#message)復号できます AWS Encryption SDK。

ただし、 を使用する場合は AWS Encryption SDK for JavaScript、JavaScript 言語の実装とウェブブラウザにおけるいくつかの互換性の問題に注意する必要があります。

また、他の言語の実装を使用する場合は、必ず互換性のあるマスターキープロバイダー、マスターキー、キーリングを設定してください。詳細については、「[キーリングの互換性](choose-keyring.md#keyring-compatibility)」を参照してください。

## AWS Encryption SDK for JavaScript 互換性
<a name="javascript-language-compatibility"></a>

の JavaScript 実装は、次の点で他の言語実装 AWS Encryption SDK とは異なります。
+ の暗号化オペレーション AWS Encryption SDK for JavaScript は、フレーム化されていない暗号文を返しません。ただし、 AWS Encryption SDK for JavaScript は、 の他の言語実装によって返されるフレーム暗号文と非フレーム暗号文を復号します AWS Encryption SDK。
+ Node.js のバージョン 12.9.0 以降で、以下の RSA キーのラッピングオプションをサポートしています。
  + OAEP と SHA1、SHA256、SHA384、SHA512
  + OAEP と SHA1 および MGF1 と SHA1
  + PKCS1v15
+ バージョン 12.9.0 より前の Node.js では、以下の RSA キーのラッピングオプションのみをサポートしています。
  + OAEP と SHA1 および MGF1 と SHA1
  + PKCS1v15

## ブラウザの互換性
<a name="javascript-browser-compatibility"></a>

ウェブブラウザによっては、 AWS Encryption SDK for JavaScript が必要とする基本的な暗号化オペレーションがサポートされていません。ブラウザが実装している WebCrypto API のフォールバックを設定することで、不足しているオペレーションの一部を補うことができます。

**ウェブブラウザの制限事項**

以下の制限は、すべてのウェブブラウザに共通です。
+ WebCrypto API では、PKCS1v15 のキーのラッピングはサポートされていません。
+ ブラウザでは、192 ビットキーはサポートされていません。

**必要な暗号化オペレーション**

では、ウェブブラウザで以下のオペレーション AWS Encryption SDK for JavaScript が必要です。ブラウザでこれらのオペレーションがサポートされていない場合は、 AWS Encryption SDK for JavaScriptとの互換性がありません。
+ ブラウザには、暗号化の乱数を生成するメソッドである `crypto.getRandomValues()` が含まれている必要があります。`crypto.getRandomValues()` をサポートしているウェブブラウザのバージョンについては、「[Can I Use crypto.getRandomValues()?](https://caniuse.com/#feat=getrandomvalues)」を参照してください。

**必要なフォールバック**

には、ウェブブラウザで次のライブラリとオペレーション AWS Encryption SDK for JavaScript が必要です。これらの要件を満たしていないウェブブラウザをサポートする場合は、フォールバックを設定する必要があります。そうしないと、ブラウザ AWS Encryption SDK for JavaScript で を使用しようとすると失敗します。
+ ウェブアプリケーションで基本的な暗号化オペレーションを行う WebCrypto API は、すべてのブラウザで使用できるわけではありません。ウェブでの暗号化をサポートしているウェブブラウザのバージョンについては、「[Can I Use Web Cryptography?](https://caniuse.com/#feat=cryptography)」を参照してください。
+ Safari ウェブブラウザの最新バージョンは、 が AWS Encryption SDK 必要とする 0 バイトの AES-GCM 暗号化をサポートしていません。ブラウザが WebCrypto API を実装しているが、AES-GCM を使用してゼロバイトを暗号化できない場合、 はゼロバイト暗号化にのみフォールバックライブラリ AWS Encryption SDK for JavaScript を使用します。他のすべてのオペレーションには、WebCrypto API を使用します。

いずれかの制限のフォールバックを設定するには、コードに次のステートメントを追加します。[configureFallback](https://github.com/aws/aws-encryption-sdk-javascript/blob/master/modules/web-crypto-backend/src/backend-factory.ts#L78) 関数に不足している機能をサポートするライブラリを指定します。この例では、マイクロソフトリサーチの JavaScript 暗号化ライブラリ (`msrcrypto`) を使用していますが、互換性のあるライブラリに置き換えることができます。詳しい例については、[fallback.ts](https://github.com/aws/aws-encryption-sdk-javascript/blob/master/modules/example-browser/src/fallback.ts) を参照してください。

```
import { configureFallback } from '@aws-crypto/client-browser'
configureFallback(msrCrypto)
```

# のインストール AWS Encryption SDK for JavaScript
<a name="javascript-installation"></a>

 AWS Encryption SDK for JavaScript は、相互依存モジュールのコレクションで構成されています。このモジュールのいくつかは、一緒に動作するように設計されたモジュールの集まりです。一部のモジュールは、単独で動作するように設計されています。すべての実装に必要なモジュールはほんの少しです。また、特殊な場合にのみ必要なモジュールもほんの少しです。for AWS Encryption SDK JavaScript のモジュールの詳細については、 [のモジュール AWS Encryption SDK for JavaScript](javascript-modules.md)および GitHub の [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules) リポジトリの各モジュールの `README.md` ファイルを参照してください。

**注記**  
2.0.0 より AWS Encryption SDK for JavaScript 前の のすべてのバージョンは[end-of-supportフェーズ](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html#version-life-cycle)にあります。  
バージョン 2.0.x 以降から AWS Encryption SDK for JavaScript の最新バージョンにコードやデータを変更せずに安全に更新できます。ただし、バージョン 2.0.x で導入された[新しいセキュリティ機能](about-versions.md#version-2)には下位互換性がありません。1.7.x より前のバージョンから 2.0.x 以降のバージョンに更新するには、まず AWS Encryption SDK for JavaScriptの最新の 1.x バージョンに更新する必要があります。詳細については、「[の移行 AWS Encryption SDK](migration.md)」を参照してください。

モジュールをインストールするには、[npm パッケージマネージャー](https://www.npmjs.com/get-npm)を使用します。

例えば、 AWS Encryption SDK for JavaScript Node.js の でプログラムするために必要なすべてのモジュールを含む `client-node`モジュールをインストールするには、次のコマンドを使用します。

```
npm install @aws-crypto/client-node
```

 AWS Encryption SDK for JavaScript ブラウザで を使用してプログラムするために必要なすべてのモジュールを含む `client-browser` モジュールをインストールするには、次のコマンドを使用します。

```
npm install @aws-crypto/client-browser
```

の使用方法の実例については AWS Encryption SDK for JavaScript、GitHub の [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/) リポジトリの `example-node`および `example-browser`モジュールの例を参照してください。

# のモジュール AWS Encryption SDK for JavaScript
<a name="javascript-modules"></a>

のモジュール AWS Encryption SDK for JavaScript を使用すると、プロジェクトに必要なコードを簡単にインストールできます。

## JavaScript Node.js 用のモジュール
<a name="jsn-modules-node"></a>

[client-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/client-node)  
 AWS Encryption SDK for JavaScript Node.js の でプログラムするために必要なすべてのモジュールが含まれています。

[caching-materials-manager-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/caching-materials-manager-node)  
Node.js の [でデータキーキャッシュ](data-key-caching.md)機能をサポートする関数 AWS Encryption SDK for JavaScript をエクスポートします。

[decrypt-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/decrypt-node)  
データとデータストリームを表す暗号化されたメッセージを復号および検証する関数をエクスポートします。これは、`client-node` モジュールに含まれています。

[encrypt-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/encrypt-node)  
さまざまなタイプのデータを暗号化して署名する関数をエクスポートします。これは、`client-node` モジュールに含まれています。

[example-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/example-node)  
Node.js の を使用したプログラミングの実例 AWS Encryption SDK for JavaScript をエクスポートします。さまざまなタイプのキーリングやさまざまなタイプのデータの例が含まれています。

[hkdf-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/hkdf-node)  
 AWS Encryption SDK for JavaScript Node.js の [が特定のアルゴリズムスイートで使用する HMAC ベースのキー導出関数](https://en.wikipedia.org/wiki/HKDF) (HKDF) をエクスポートします。ブラウザ AWS Encryption SDK for JavaScript の は、WebCrypto API のネイティブ HKDF 関数を使用します。

[integration-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/integration-node)  
Node.js AWS Encryption SDK for JavaScript の が の他の言語実装と互換性があることを確認するテストを定義します AWS Encryption SDK。

[kms-keyring-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/kms-keyring-node)  
Node.js の AWS KMS キーリングをサポートする関数をエクスポートします。

[raw-aes-keyring-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/raw-aes-keyring-node)  
Node.js で [Raw AES キーリング](use-raw-aes-keyring.md)をサポートする関数をエクスポートします。

[raw-rsa-keyring-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/raw-rsa-keyring-node)  
Node.js で [Raw RSA キーリング](use-raw-rsa-keyring.md)をサポートする関数をエクスポートします。

## JavaScript ブラウザ用のモジュール
<a name="jsn-modules-browser"></a>

[client-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/client-browser)  
ブラウザで を使用してプログラムするために必要なすべてのモジュール AWS Encryption SDK for JavaScript が含まれています。

[caching-materials-manager-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/caching-materials-manager-browser)  
ブラウザで JavaScript の[データキーキャッシュ](data-key-caching.md)機能をサポートする関数をエクスポートします。

[decrypt-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/decrypt-browser)  
データとデータストリームを表す暗号化されたメッセージを復号および検証する関数をエクスポートします。

[encrypt-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/encrypt-browser)  
さまざまなタイプのデータを暗号化して署名する関数をエクスポートします。

[example-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/example-browser)  
ブラウザ AWS Encryption SDK for JavaScript での を使用したプログラミングの実例。さまざまなタイプのキーリングやさまざまなタイプのデータの例が含まれています。

[integration-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/integration-browser)  
ブラウザのスクリプトが AWS Encryption SDK for Javaの他の言語実装と互換性があることを確認するテストを定義します AWS Encryption SDK。

[kms-keyring-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/kms-keyring-browser)  
ブラウザで [AWS KMS キーリング](use-kms-keyring.md)をサポートする関数をエクスポートします。

[raw-aes-keyring-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/raw-aes-keyring-browser)  
ブラウザで [Raw AES キーリング](use-raw-aes-keyring.md)をサポートする関数をエクスポートします。

[raw-rsa-keyring-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/raw-rsa-keyring-browser)  
ブラウザで [Raw RSA キーリング](use-raw-rsa-keyring.md)をサポートする関数をエクスポートします。

## すべての実装用のモジュール
<a name="jsn-modules-all"></a>

[cache-material](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/cache-material)  
[データキーキャッシュ](data-key-caching.md)機能をサポートします。各データキーでキャッシュされる暗号化マテリアルを収集するためのコードを提供します。

[kms-keyring](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/kms-keyring)  
[KMS キーリング](use-kms-keyring.md)をサポートする関数をエクスポートします。

[material-management](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/material-management)  
[暗号化マテリアルマネージャー](concepts.md#crypt-materials-manager) (CMM) を実装します。

[raw-keyring](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/raw-keyring)  
Raw AES キーリングと Raw RSA キーリングに必要な関数をエクスポートします。

[serialize](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/serialize)  
SDK が出力をシリアル化するために使用する関数をエクスポートします。

[web-crypto-backend](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/web-crypto-backend)  
ブラウザの で WebCrypto API を使用する関数をエクスポート AWS Encryption SDK for JavaScript します。

# AWS Encryption SDK for JavaScript 例
<a name="js-examples"></a>

以下の例では、 AWS Encryption SDK for JavaScript を使用してデータの暗号化と復号を行う方法を示します。

を使用するその他の例については、GitHub AWS Encryption SDK for JavaScript の [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/)[-encryption-sdk-javascript リポジトリの example-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/example-node) モジュールと [example-browser](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/example-browser) モジュールを参照してください。これらのサンプルモジュールは、`client-browser` モジュールや `client-node` モジュールのインストール時にはインストールされません。

**詳しいサンプルコードについては**、ノードの場合は [kms\$1simple.ts](https://github.com/aws/aws-encryption-sdk-javascript/blob/master/modules/example-node/src/kms_simple.ts)、ブラウザの場合は [kms\$1simple.ts](https://github.com/aws/aws-encryption-sdk-javascript/blob/master/modules/example-browser/src/kms_simple.ts) を参照してください。

**Topics**
+ [

## AWS KMS キーリングによるデータの暗号化
](#javascript-example-encrypt)
+ [

## AWS KMS キーリングを使用したデータの復号化
](#javascript-example-decrypt)

## AWS KMS キーリングによるデータの暗号化
<a name="javascript-example-encrypt"></a>

次の例は、 を使用して短い文字列またはバイト配列を AWS Encryption SDK for JavaScript 暗号化および復号する方法を示しています。

この例では、 [AWS KMS キーリング](use-kms-keyring.md)を使用しています。これは、 AWS KMS key を使用してデータキーを生成および暗号化するキーリングの一種です。の作成については AWS KMS key、「 *AWS Key Management Service デベロッパーガイド*」の[「キーの作成](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)」を参照してください。 AWS KMS キーリング AWS KMS keys で を識別する方法については、「」を参照してください。 [AWS KMS キーリング AWS KMS keys での の識別](use-kms-keyring.md#kms-keyring-id)

ステップ 1: コミットメントポリシーを設定します。  
のバージョン 1.7.*x* 以降では AWS Encryption SDK for JavaScript、 AWS Encryption SDK クライアントをインスタンス化する新しい`buildClient`関数を呼び出すときにコミットメントポリシーを設定できます。`buildClient` 関数は、コミットメントポリシーを表す列挙値を取ります。更新された `encrypt` 関数と `decrypt` 関数が返されて、暗号化および復号化時にコミットメントポリシーが適用されます。  
次の例では、 `buildClient`関数を使用してデフォルトの[コミットメントポリシー](migrate-commitment-policy.md) を指定します`REQUIRE_ENCRYPT_REQUIRE_DECRYPT`。を使用して`buildClient`、暗号化されたメッセージ内の暗号化されたデータキーの数を制限することもできます。詳細については、「[暗号化されたデータキーの制限](configure.md#config-limit-keys)」を参照してください。  

```
import {
  KmsKeyringBrowser,
  KMS,
  getClient,
  buildClient,
  CommitmentPolicy,
} from '@aws-crypto/client-browser'

const { encrypt, decrypt } = buildClient(
  CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT
)
```

```
import {
  KmsKeyringNode,
  buildClient,
  CommitmentPolicy,
} from '@aws-crypto/client-node'
                                
const { encrypt, decrypt } = buildClient(
  CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT
)
```

ステップ 2: キーリングを作成します。  
暗号化用の AWS KMS キーリングを作成します。  
 AWS KMS キーリングで暗号化する場合は、*ジェネレーターキー*、つまりプレーンテキストのデータキーを生成して暗号化する AWS KMS key ために使用される を指定する必要があります。また、同じプレーンテキストのデータキーを暗号化する*追加のキー*を必要な数だけ指定することもできます。キーリングは、プレーンテキストのデータキーと、ジェネレーターキーを含むキーリング AWS KMS key 内の各 の暗号化されたデータキーの 1 つのコピーを返します。データを復号するには、この暗号化されたデータキーのいずれかを復号する必要があります。  
で暗号化キーリング AWS KMS keys の を指定するには AWS Encryption SDK for JavaScript、[サポートされている任意の AWS KMS キー識別子](use-kms-keyring.md#kms-keyring-id)を使用できます。この例では、[エイリアス ARN](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-alias-ARN) で指定するジェネレーターキーと[キー ARN](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN) で指定する 1 つの追加のキーを使用します。  
キー AWS KMS リングを復号化に再利用する場合は、キー ARNs を使用してキーリング AWS KMS keys 内の を識別する必要があります。
このコードを実行する前に、サンプル AWS KMS key 識別子を有効な識別子に置き換えます。キーリングの [AWS KMS keysを使用するために必要なアクセス許可](use-kms-keyring.md#kms-keyring-permissions)を持っている必要があります。  
まず、ブラウザの認証情報を指定します。この AWS Encryption SDK for JavaScript の例では、認証情報の定数を実際の認証情報に置き換える [webpack.DefinePlugin](https://webpack.js.org/plugins/define-plugin/) を使用しています。ただし、認証情報の指定には任意の方法を使用することができます。次に、認証情報を使用して AWS KMS クライアントを作成します。  

```
declare const credentials: {accessKeyId: string, secretAccessKey:string, sessionToken:string }

const clientProvider = getClient(KMS, {
  credentials: {
    accessKeyId,
    secretAccessKey,
    sessionToken
  }
})
```
次に、ジェネレーターキーと追加キー AWS KMS keys の を指定します。次に、 クライアントと を使用して AWS KMS AWS KMS キーリングを作成します AWS KMS keys。  

```
const generatorKeyId = 'arn:aws:kms:us-west-2:111122223333:alias/EncryptDecrypt'
const keyIds = ['arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab']

const keyring = new KmsKeyringBrowser({ clientProvider, generatorKeyId, keyIds })
```

```
const generatorKeyId = 'arn:aws:kms:us-west-2:111122223333:alias/EncryptDecrypt'
const keyIds = ['arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab']

const keyring = new KmsKeyringNode({ generatorKeyId, keyIds })
```

ステップ 3: 暗号化コンテキストを設定します。  
[暗号化コンテキスト](concepts.md#encryption-context)は、任意の、シークレットではない追加認証データです。暗号化時に暗号化コンテキストを指定すると、 は暗号化コンテキストを暗号化テキストに AWS Encryption SDK 暗号化バインドし、データの復号に同じ暗号化コンテキストが必要になります。暗号化コンテキストの使用はオプションですが、ベストプラクティスとして推奨します。  
暗号化コンテキストのペアを含むシンプルなオブジェクトを作成します。各ペアのキーと値は、文字列である必要があります。  

```
const context = {
  stage: 'demo',
  purpose: 'simple demonstration app',
  origin: 'us-west-2'
}
```

```
const context = {
  stage: 'demo',
  purpose: 'simple demonstration app',
  origin: 'us-west-2'
}
```

ステップ 4: データを暗号化します。  
プレーンテキストのデータを暗号化するには、`encrypt` 関数を呼び出します。 AWS KMS キーリング、プレーンテキストデータ、および暗号化コンテキストを渡します。  
`encrypt` 関数は、暗号化されたデータ、暗号化されたデータキー、重要なメタデータ (暗号化コンテキストや署名など) を含む[暗号化されたメッセージ](concepts.md#message) (`result`) を返します。  
[この暗号化されたメッセージは、サポートされているプログラミング言語の を使用して復号](#javascript-example-decrypt)できます。 AWS Encryption SDK   

```
const plaintext = new Uint8Array([1, 2, 3, 4, 5])

const { result } = await encrypt(keyring, plaintext, { encryptionContext: context })
```

```
const plaintext = 'asdf'

const { result } = await encrypt(keyring, plaintext, { encryptionContext: context })
```

## AWS KMS キーリングを使用したデータの復号化
<a name="javascript-example-decrypt"></a>

を使用して AWS Encryption SDK for JavaScript 暗号化されたメッセージを復号し、元のデータを復元できます。

この例では、「[AWS KMS キーリングによるデータの暗号化](#javascript-example-encrypt)」の例で暗号化したデータを復号します。

ステップ 1: コミットメントポリシーを設定します。  
のバージョン 1.7.*x* 以降では AWS Encryption SDK for JavaScript、 AWS Encryption SDK クライアントをインスタンス化する新しい`buildClient`関数を呼び出すときにコミットメントポリシーを設定できます。`buildClient` 関数は、コミットメントポリシーを表す列挙値を取ります。更新された `encrypt` 関数と `decrypt` 関数が返されて、暗号化および復号化時にコミットメントポリシーが適用されます。  
次の例では、 `buildClient`関数を使用してデフォルトの[コミットメントポリシー](migrate-commitment-policy.md) を指定します`REQUIRE_ENCRYPT_REQUIRE_DECRYPT`。を使用して`buildClient`、暗号化されたメッセージ内の暗号化されたデータキーの数を制限することもできます。詳細については、「[暗号化されたデータキーの制限](configure.md#config-limit-keys)」を参照してください。  

```
import {
  KmsKeyringBrowser,
  KMS,
  getClient,
  buildClient,
  CommitmentPolicy,
} from '@aws-crypto/client-browser'

const { encrypt, decrypt } = buildClient(
  CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT
)
```

```
import {
  KmsKeyringNode,
  buildClient,
  CommitmentPolicy,
} from '@aws-crypto/client-node'
                                
const { encrypt, decrypt } = buildClient(
  CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT
)
```

ステップ 2: キーリングを作成します。  
データを復号するには、`encrypt` 関数が返す[暗号化されたメッセージ](concepts.md#message) (`result`) を渡します。暗号化されたメッセージには、暗号化されたデータ、暗号化されたデータキー、重要なメタデータ (暗号化コンテキストや署名など) が含まれています。  
[AWS KMS キーリング](use-kms-keyring.md)は、復号時にも指定する必要があります。データの暗号化に使用したものと同じキーリングを使用することも、別のキーリングを使用することもできます。成功するには、復号キーリングの少なくとも AWS KMS key 1 つが、暗号化されたメッセージ内の暗号化されたデータキーの 1 つを復号できる必要があります。データキーは生成されないため、復号キーリングでジェネレーターキーを指定する必要はありません。指定しても、ジェネレーターキーと追加のキーは同じように扱われます。  
で復号キーリング AWS KMS key の を指定するには AWS Encryption SDK for JavaScript、[キー ARN](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN) を使用する必要があります。それ以外の場合、 AWS KMS key は認識されません。 AWS KMS キーリング AWS KMS keys で を識別する方法については、「」を参照してください。 [AWS KMS キーリング AWS KMS keys での の識別](use-kms-keyring.md#kms-keyring-id)  
暗号化と復号に同じキーリングを使用する場合は、キー ARNs を使用してキーリング AWS KMS keys 内の を識別します。
この例では、暗号化キーリング AWS KMS keys に の 1 つだけを含むキーリングを作成します。このコードを実行する前に、キー ARN を有効なキー ARN に置き換えます。 AWS KMS keyに対する `kms:Decrypt` アクセス許可が必要です。  
まず、ブラウザの認証情報を指定します。この AWS Encryption SDK for JavaScript の例では、認証情報の定数を実際の認証情報に置き換える [webpack.DefinePlugin](https://webpack.js.org/plugins/define-plugin/) を使用しています。ただし、認証情報の指定には任意の方法を使用することができます。次に、認証情報を使用して AWS KMS クライアントを作成します。  

```
declare const credentials: {accessKeyId: string, secretAccessKey:string, sessionToken:string }

const clientProvider = getClient(KMS, {
  credentials: {
    accessKeyId,
    secretAccessKey,
    sessionToken
  }
})
```
次に、 AWS KMS クライアントを使用して AWS KMS キーリングを作成します。この例では、暗号化キーリング AWS KMS keys から 1 つの のみを使用します。  

```
const keyIds = ['arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab']

const keyring = new KmsKeyringBrowser({ clientProvider, keyIds })
```

```
const keyIds = ['arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab']

const keyring = new KmsKeyringNode({ keyIds })
```

ステップ 3: データを復号します。  
次に、`decrypt` 関数を呼び出します。先ほど作成した復号化キーリング (`keyring`) および `encrypt` 関数が返す[暗号化されたメッセージ](concepts.md#message) (`result`) を渡します。 AWS Encryption SDK はキーリングを使用して、暗号化されたデータキーの 1 つを復号します。次に、そのプレーンテキストのデータキーを使用してデータを復号します。  
呼び出しが成功すると、`plaintext` フィールドにはプレーンテキストの (復号された) データが含まれます。`messageHeader` フィールドには、データの復号に使用した暗号化コンテキストなどの復号プロセスに関するメタデータが含まれます。  

```
const { plaintext, messageHeader } = await decrypt(keyring, result)
```

```
const { plaintext, messageHeader } = await decrypt(keyring, result)
```

ステップ 4: 暗号化コンテキストを確認します。  
データの復号に使用した[暗号化コンテキスト](concepts.md#encryption-context)は、`decrypt` 関数から返されるメッセージヘッダー (`messageHeader`) に含まれます。アプリケーションでプレーンテキストのデータを返す前に、暗号化時に指定した暗号化コンテキストが復号時に使用した暗号化コンテキストに含まれていることを確認します。一致しない場合は、データが改ざんされたか、復号する暗号化テキストを間違ったことを示している可能性があります。  
暗号化コンテキストを確認する際は、完全に一致している必要ありません。署名付きの暗号化アルゴリズムを使用する場合、[暗号化マテリアルマネージャー](concepts.md#crypt-materials-manager) (CMM) は、メッセージを暗号化する前にパブリック署名キーを暗号化コンテキストに追加します。ただし、送信したすべての暗号化コンテキストのペアが返された暗号化コンテキストに含まれている必要があります。  
まず、メッセージヘッダーから暗号化コンテキストを取得します。次に、元の暗号化コンテキスト (`context`) のキーと値の各ペアが、返された暗号化コンテキスト (`encryptionContext`) のキーと値のペアと一致することを確認します。  

```
const { encryptionContext } = messageHeader

Object
  .entries(context)
  .forEach(([key, value]) => {
    if (encryptionContext[key] !== value) throw new Error('Encryption Context does not match expected values')
})
```

```
const { encryptionContext } = messageHeader

Object
  .entries(context)
  .forEach(([key, value]) => {
    if (encryptionContext[key] !== value) throw new Error('Encryption Context does not match expected values')
})
```
暗号化コンテキストを確認して問題がなければ、プレーンテキストのデータを返すことができます。