加密上下文
注意
您不能在使用非对称 KMS 密钥或 HMAC KMS 密钥的加密操作中指定加密上下文。非对称算法和 MAC 算法不支持加密上下文。
所有具有对称加密 KMS 密钥的 Amazon KMS 加密操作都接受加密上下文,即一组可选的非机密键值对,其中包含有关数据的其他上下文信息。您可以在 Amazon KMS 中的 Encrypt 操作中插入加密上下文,从而增强 Amazon KMS API 解密调用的授权和可审计性。Amazon KMS 将加密上下文作为额外验证数据(AAD)来支持经过身份验证的加密。加密上下文以加密方式绑定到加密文字,以便需要使用相同的加密上下文解密数据。
加密上下文不是密钥,且没有加密。它以明文显示在 Amazon CloudTrail 日志中,以便您可以使用它来标识和分类加密操作。您的加密上下文不应包含敏感信息。我们建议您的加密上下文描述正在加密或解密的数据。例如,在加密文件时,您可以将文件路径的一部分用作加密上下文。
"encryptionContext": { "department": "10103.0" }
例如,当加密使用 Amazon Elastic Block Store (Amazon EBS) CreateSnapshot 操作创建的卷和快照时,Amazon EBS 使用卷 ID 作为加密上下文值。
"encryptionContext": { "aws:ebs:id": "vol-abcde12345abc1234" }
您还可以使用加密上下文来细化或限制对您账户中 Amazon KMS keys 的访问。您可以使用加密上下文作为授权中的约束,以及作为策略语句中的条件。加密上下文密钥及其值可以是包含 aws 的任意字符串。这些值与 Amazon 生成的标签(例如 aws:cloudformation:stack-name)截然不同。有关更多信息,请参阅 kms:EncryptionContext:context-key。
要了解如何使用加密上下文来保护加密数据的完整性,请参阅 安全博客上的博文 Amazon Key Management ServiceHow to Protect the Integrity of Your Encrypted Data by Using
加密上下文规则
Amazon KMS 对加密上下文密钥和值强制执行以下规则。
-
加密上下文对中的键和值必须是简单的文本字符串。如果您使用其他类型(例如整数或浮点),则 Amazon KMS 会将它解释为字符串。
-
加密上下文中的密钥和值可以包括 Unicode 字符。如果加密上下文包含密钥策略或 IAM policy 中不允许的字符,则您将无法在策略条件密钥中指定加密上下文,例如 kms:EncryptionContext:context-key 和 kms:EncryptionContextKeys。有关密钥策略文档规则的详细信息,请参阅 密钥策略格式。有关 IAM policy 档规则的详细信息,请参阅《IAM 用户指南》中的 IAM 名称要求。
策略中的加密上下文
加密上下文主要用于验证完整性和真实性。但是,您也可以使用加密上下文来控制对密钥策略和 IAM policy 中对称加密 Amazon KMS keys 的访问。
kms:EncryptionContext: 和 kms:EncryptionContextKeys 条件键仅在请求包括特定加密上下文密钥或键值对时允许(或拒绝)权限。
例如,以下密钥策略语句允许 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" } } }
有关这些加密上下文条件键的更多信息,请参阅 Amazon KMS 的条件键。
授权中的加密上下文
创建授权时可以包含授权约束,从而设定授予权限的条件。Amazon KMS 支持 EncryptionContextEquals 和 EncryptionContextSubset 这两种授权约束,并且这两种约束都涉及密码操作请求中的加密上下文。在使用这些授权约束时,授权中的权限仅在加密操作请求中的加密上下文满足授权约束的要求时有效。
例如,您可以将 EncryptionContextEquals 授权约束添加到允许 GenerateDataKey 操作的授权中。使用此约束时,授权仅在请求中的加密上下文与授权约束中的加密上下文大小写完全匹配时,允许操作。
$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$
有关授权约束的详细信息,请参阅 使用授权约束。有关授权的详细信息,请参阅 Amazon KMS 中的授权。
记录加密上下文
Amazon KMS 使用 Amazon CloudTrail 记录加密上下文,以便您可以确定访问了哪些 KMS 密钥和数据。日志条目会准确显示哪些 KMS 密钥被用来加密或解密了由日志条目中的加密上下文引用的特定数据。
重要
由于加密上下文会被记录,它不得包含敏感信息。
存储加密上下文
为了简化在调用 Decrypt 或 ReEncrypt 操作时任何加密上下文的使用,可以将加密上下文与加密数据存储在一起。我们建议您仅存储足够的加密上下文,以帮助您在需要用于加密或解密时创建完整的加密上下文。
例如,如果加密上下文是文件的完全限定路径,仅将该路径部分与加密文件内容存储在一起。然后,当您需要完整的加密上下文时,可以从存储的片段重建它。如果有人擅自改动文件,例如重命名或将其移动到其他位置,加密上下文值更改,解密请求将失败。