

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

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

旨在 AWS Encryption SDK for JavaScript 为在 Node.js 中编写 Web 浏览器应用程序 JavaScript 或使用编写 Web 服务器应用程序的开发人员提供客户端加密库。

与的所有实现一样 AWS Encryption SDK， AWS Encryption SDK for JavaScript 提供了高级数据保护功能。这些功能包括[信封加密](concepts.md#envelope-encryption)、其他经过身份验证的数据 (AAD) 以及安全、经过身份验证且对称的密钥[算法套件](concepts.md#crypto-algorithm)，如具有密钥派生和签名的 256 位 AES-GCM。

的所有特定于语言的实现 AWS Encryption SDK 都被设计为可互操作，但要遵守语言的限制。有关语言限制的详细信息 JavaScript，请参阅[的兼容性 AWS Encryption SDK for JavaScript](javascript-compatibility.md)。

**了解更多**
+ 有关使用编程的详细信息 AWS Encryption SDK for JavaScript，请参阅上的[aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/)存储库 GitHub。
+ 有关编程示例，请参阅[AWS Encryption SDK for JavaScript 例子](js-examples.md)以及存储[库中的示例浏览器](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/example-browser)和[示例节点](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/example-node)模块。[aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/)
+  有关使用在 Web 应用程序中加密数据的真实示例，请参阅 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/)。 AWS Encryption SDK for JavaScript 

**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 命令行界](crypto-cli.md)面）对其进行解密。 AWS Encryption SDK for JavaScript 而且，您可以使用 AWS Encryption SDK for JavaScript 来解密由的其他语言实现生成的[加密消息](concepts.md#message)。 AWS Encryption SDK

但是，在使用时 AWS Encryption SDK for JavaScript，您需要注意 JavaScript 语言实现和 Web 浏览器中的一些兼容性问题。

此外，在使用不同的语言实施时，请务必配置兼容的主密钥提供程序、主密钥和密钥环。有关更多信息，请参阅 [密钥环兼容性](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 版开始，Node.js 支持以下 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>

某些 Web 浏览器不支持 AWS Encryption SDK for JavaScript 所需的基本加密操作。您可以通过为浏览器实现的 WebCrypto API 配置备用来弥补一些缺失的操作。

**Web 浏览器限制**

以下限制是所有 Web 浏览器通用的：
+  WebCrypto API 不支持 PKCS1v15 密钥封装。
+ 浏览器不支持 192 位密钥。

**所需的加密操作**

 AWS Encryption SDK for JavaScript 需要在 Web 浏览器中执行以下操作。如果浏览器不支持这些操作，则它与 AWS Encryption SDK for JavaScript不兼容。
+ 浏览器必须包含 `crypto.getRandomValues()`，这是一种生成加密随机值的方法。有关支持的 Web 浏览器版本的信息`crypto.getRandomValues()`，请参阅[我能否使用加密货币。 getRandomValues()？](https://caniuse.com/#feat=getrandomvalues) 。

**所需的回退**

 AWS Encryption SDK for JavaScript 需要在 Web 浏览器中使用以下库和操作。如果您支持的 Web 浏览器不满足这些要求，您必须配置回退。否则，尝试在浏览器中 AWS Encryption SDK for JavaScript 使用将失败。
+ 该 WebCrypto API在Web应用程序中执行基本的加密操作，但并非适用于所有浏览器。有关支持 Web 加密的 Web 浏览器版本的信息，请参阅[我是否可以使用 Web 加密？](https://caniuse.com/#feat=cryptography)。
+ 现代版本的 Safari 网络浏览器不支持 AES-GCM 零字节加密，这是必需的。 AWS Encryption SDK 如果浏览器实现了 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) 函数中，指定一个支持缺少的功能的库。以下示例使用 Microsoft JavaScript Research 密码学库 (`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 中模块的信息 JavaScript， AWS Encryption SDK 请参阅，[中的模块 AWS Encryption SDK for JavaScript](javascript-modules.md)以及[aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules)存储库中每个模块中的`README.md`文件 GitHub。

**注意**  
[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)  
您可以安全地从 AWS Encryption SDK for JavaScript 版本 2.0.*x* 及更高版本更新为最新版本，无需更改任何代码或数据。但是，版本 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 package manager](https://www.npmjs.com/get-npm)。

例如，要安装包含在 `client-node` Node.js AWS Encryption SDK for JavaScript 中使用编程所需的所有模块的模块，请使用以下命令。

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

要安装该`client-browser`模块（包括需要在浏览器 AWS Encryption SDK for JavaScript 中使用编程的所有模块），请使用以下命令。

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

有关如何使用的工作示例 AWS Encryption SDK for JavaScript，请参阅[aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/)存储库中的`example-node`和`example-browser`模块中的示例 GitHub。

# 中的模块 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)  
包括在 Node.js 中使用编程所需的所有模块。 AWS Encryption SDK for JavaScript 

[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)  
 AWS Encryption SDK for JavaScript 在 Node.js 中导出使用编程的工作示例。包括不同类型的密钥环和不同类型的数据的示例。

[hkdf-node](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/hkdf-node)  
导出[基于 HMAC 的密钥派生函数](https://en.wikipedia.org/wiki/HKDF) (HKDF)，Node.js AWS Encryption SDK for JavaScript 中的在特定算法套件中使用该函数。浏览器 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 中支持[原始 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 中支持[原始 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)  
在浏览器中导出支持[数据密钥缓存](data-key-caching.md)功能 JavaScript 的函数。

[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)  
导出在浏览器中支持[原始 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)  
导出在浏览器中支持[原始 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)  
导出原始 AES 和 RSA 密钥环所需的函数。

[serialize](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/serialize)  
导出该开发工具包用于序列化其输出的函数。

[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 加密和解密数据。

你可以在上的 e [xample-node 和 example-](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/example-node) [browser 模块中找到更多使用示例](https://github.com/aws/aws-encryption-sdk-javascript/tree/master/modules/example-browser)。 AWS Encryption SDK for JavaScript [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/) GitHub在安装 `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，您可以在调用实例化客户端的新`buildClient`函数时设置承诺策略。 AWS Encryption SDK `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 密钥的纯文本数据密钥和该数据密钥的一个加密副本，包括生成器密钥。要解密数据，您需要解密任一加密数据密钥。  
要在中 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) 标识）。  
如果您打算重复使用密 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，您可以在调用实例化客户端的新`buildClient`函数时设置承诺策略。 AWS Encryption SDK `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 中必须至少有一个能够解密加密消息中的一个加密数据密钥。由于没有生成任何数据密钥，您不需要在解密密钥环中指定生成器密钥。如果这样做，将按相同的方式处理生成器密钥和附加密钥。  
[要在中 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 中的一个的密钥环。在运行该代码之前，请将示例密钥 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 中的一个。  

```
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 使用密钥环解密其中一个加密的数据密钥。然后，它使用明文数据密钥以解密数据。  
如果调用成功，则 `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')
})
```
如果加密上下文检查成功，您可以返回明文数据。