

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

# 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')
})
```
暗号化コンテキストを確認して問題がなければ、プレーンテキストのデータを返すことができます。