

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

# 加密上下文
<a name="encrypt_context"></a>

**注意**  
您不能在使用[非对称 KMS 密钥](symmetric-asymmetric.md)或 [HMAC KMS 密钥](hmac.md)的加密操作中指定加密上下文。非对称算法和 MAC 算法不支持加密上下文。

所有使用[对称加密 KMS 密钥的 AWS KMS 加密](symm-asymm-choose-key-spec.md#symmetric-cmks)[操作](kms-cryptography.md#cryptographic-operations)都接受*加密上下文*，这是一组可选的非秘密密钥-值对，可以包含有关数据的其他上下文信息。您可以在中的`Encrypt`操作中插入加密上下文 AWS KMS ，以增强 AWS KMS API 解密调用的授权和可审计性。 AWS KMS 使用加密上下文作为额外的身份验证数据 (AAD) 来支持经过身份验证的加密。加密上下文以加密方式绑定到加密文字，以便需要使用相同的加密上下文解密数据。

加密上下文不是密钥，且没有加密。它以明文显示在 [AWS CloudTrail 日志](logging-using-cloudtrail.md)中，以便您可以使用它来标识和分类加密操作。您的加密上下文不应包含敏感信息。我们建议您的加密上下文描述正在加密或解密的数据。例如，在加密文件时，您可以将文件路径的一部分用作加密上下文。

```
"encryptionContext": {
    "department": "10103.0"
}
```

例如，在加密使用[亚马逊弹性块存储 (Amazon](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AmazonEBS.html) EBS) [CreateSnapshot](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateSnapshot.html)操作创建的卷和快照时，Amazon EBS 使用卷 ID 作为加密上下文值。

```
"encryptionContext": {
  "aws:ebs:id": "vol-abcde12345abc1234"
}
```

您还可以使用加密上下文来优化或限制对您账户 AWS KMS keys 的访问权限。您可以使用加密上下文[作为授权中的约束](grants.md)，以及作为*[策略语句中的条件](policy-conditions.md)*。加密上下文密钥及其值可以是包含 `aws` 的任意字符串。这些值与 [AWS 生成的标签](https://docs.aws.amazon.com/tag-editor/latest/userguide/best-practices-and-strats.html#tag-conventions)（例如 [aws:cloudformation:stack-name](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-resource-tags.html)）截然不同。有关更多信息，请参阅 [kms:EncryptionContext: *上下文*密钥](conditions-kms.md#conditions-kms-encryption-context)。

要了解如何使用加密上下文来保护加密数据的完整性，请参阅 AWS 安全博客 EncryptionContext上的 [“如何通过使用 AWS Key Management Service 来保护加密数据的完整性](https://aws.amazon.com/blogs/security/how-to-protect-the-integrity-of-your-encrypted-data-by-using-aws-key-management-service-and-encryptioncontext/)” 一文。

## 加密上下文规则
<a name="encryption-context-rules"></a>

AWS KMS 对加密上下文密钥和值强制执行以下规则。
+ 加密上下文对中的键和值必须是简单的文本字符串。如果您使用其他类型（例如整数或浮点），则 AWS KMS 会将它解释为字符串。
+ 加密上下文中的密钥和值可以包括 Unicode 字符。如果加密上下文包含密钥策略或 IAM policy 中不允许的字符，则您将无法在策略条件密钥中指定加密上下文，例如 [`kms:EncryptionContext:context-key`](conditions-kms.md#conditions-kms-encryption-context) 和 [`kms:EncryptionContextKeys`](conditions-kms.md#conditions-kms-encryption-context-keys)。有关密钥策略文档规则的详细信息，请参阅 [密钥策略格式](key-policy-overview.md#key-policy-format)。有关 IAM policy 档规则的详细信息，请参阅*《IAM 用户指南》*中的 [IAM 名称要求](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html#reference_iam-quotas-names)。

## 策略中的加密上下文
<a name="encryption-context-authorization"></a>

加密上下文主要用于验证完整性和真实性。但是，您也可以使用加密上下文来控制对密钥策略和 IAM policy 中对称加密 AWS KMS keys 的访问。

仅当请求包含特定的加密上下文密[钥](conditions-kms.md#conditions-kms-encryption-context)或密钥值对时，k [ms:: 和 kms: EncryptionContextKeys](conditions-kms.md#conditions-kms-encryption-context) 条件密钥才允许（或拒绝）权限。EncryptionContext

例如，以下密钥策略语句允许 `RoleForExampleApp` 角色在 `Decrypt` 操作中使用 KMS 密钥。它使用 `kms:EncryptionContext:context-key` 条件键以仅在请求中的加密上下文包含 `AppName:ExampleApp` 加密上下文对时允许此权限。

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/RoleForExampleApp"
  },
  "Action": "kms:Decrypt",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "kms:EncryptionContext:AppName": "ExampleApp"
    }
  }
}
```

有关这些加密上下文条件键的更多信息，请参阅 [的条件键 AWS KMS](policy-conditions.md)。

## 授权中的加密上下文
<a name="encryption-context-grants"></a>

在[创建授权](grants.md)时，可以包括为[授予权限设定条件的授予约束](https://docs.aws.amazon.com/kms/latest/APIReference/API_GrantConstraints.html)。 AWS KMS 支持两个授予限制`EncryptionContextSubset`，`EncryptionContextEquals`和，这两个限制都涉及[加密操作请求中的加密上下文](#encrypt_context)。在使用这些授权约束时，授权中的权限仅在加密操作请求中的加密上下文满足授权约束的要求时有效。

例如，您可以向`EncryptionContextEquals`授权添加允许该[GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)操作的授予约束。使用此约束时，授权仅在请求中的加密上下文与授权约束中的加密上下文大小写完全匹配时，允许操作。

```
$ aws kms create-grant \
    --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
    --grantee-principal arn:aws:iam::111122223333:user/exampleUser \
    --retiring-principal arn:aws:iam::111122223333:role/adminRole \
    --operations GenerateDataKey \
    --constraints EncryptionContextEquals={Purpose=Test}
```

来自被授予者委托人的以下请求将满足 `EncryptionContextEquals` 约束。

```
$ aws kms generate-data-key \
    --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
    --key-spec AES_256 \
    --encryption-context Purpose=Test
```

有关授权约束的详细信息，请参阅 [使用授权约束](create-grant-overview.md#grant-constraints)。有关授权的详细信息，请参阅 [补助金 AWS KMS](grants.md)。

## 记录加密上下文
<a name="encryption-context-auditing"></a>

AWS KMS 用于 AWS CloudTrail 记录加密上下文，以便您可以确定已访问了哪些 KMS 密钥和数据。日志条目会准确显示哪些 KMS 密钥被用来加密或解密了由日志条目中的加密上下文引用的特定数据。

**重要**  
由于加密上下文会被记录，它不得包含敏感信息。

## 存储加密上下文
<a name="encryption-context-storing"></a>

为了简化在调用 [https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) 或 [https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html) 操作时任何加密上下文的使用，可以将加密上下文与加密数据存储在一起。我们建议您仅存储足够的加密上下文，以帮助您在需要用于加密或解密时创建完整的加密上下文。

例如，如果加密上下文是文件的完全限定路径，仅将该路径部分与加密文件内容存储在一起。然后，当您需要完整的加密上下文时，可以从存储的片段重建它。如果有人擅自改动文件，例如重命名或将其移动到其他位置，加密上下文值更改，解密请求将失败。