【问题标题】:AWS KMS Decrypt: How is the KMS Key configured?AWS KMS 解密:如何配置 KMS 密钥?
【发布时间】:2019-11-18 22:51:47
【问题描述】:

对于如何使用 AWS KMS 客户端解密密文 blob,我有点困惑。这是 AWS Docs 中的一个示例:

// Encrypt a data key
//
// Replace the following fictitious CMK ARN with a valid CMK ID or ARN
String keyId = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd- 
56ef-1234567890ab";
ByteBuffer plaintext = ByteBuffer.wrap(new byte[]{1,2,3,4,5,6,7,8,9,0});

EncryptRequest req = new 
EncryptRequest().withKeyId(keyId).withPlaintext(plaintext);
ByteBuffer ciphertext = kmsClient.encrypt(req).getCiphertextBlob();

// Decrypt a data key
//

ByteBuffer ciphertextBlob = Place your ciphertext here;

DecryptRequest req = new DecryptRequest().withCiphertextBlob(ciphertextBlob);
ByteBuffer plainText = kmsClient.decrypt(req).getPlaintext();

解密方法中没有提供 KMS 密钥。这是否意味着 KMS 密钥以某种方式在密文 blob 中加密?如果是这样……

  • 如何授予解密加密密文 blob 的权限?
  • 如果我想解密来自 AWS 服务的值,是否需要创建一个 IAM 角色来执行此操作并配置 KMS 密钥以允许该角色解密?

【问题讨论】:

标签: amazon-web-services aws-kms


【解决方案1】:

你的例子来自Encrypting and Decrypting Data Keys:

这些操作旨在加密和解密data keys。他们在加密操作中使用 AWS KMS customer master key (CMK),并且不能接受超过 4 KB(4096 字节)的数据。尽管您可能会使用它们来加密少量数据,例如密码或 RSA 密钥,但它们并非旨在加密应用程序数据。

CMK:

在 AWS KMS 中创建,并且永远不会让 AWS KMS 处于未加密状态。要使用或管理您的 CMK,您可以通过 AWS KMS 访问它们。

这些操作都使用您的 AWS 设置中配置的主密钥,而不是动态提供的密钥。 Use AWS Management Console 管理这些密钥。

当使用encrypt method时,密钥ID存储在响应中:

{
   "CiphertextBlob": blob,
   "KeyId": "string"
}

解密时会用到。

【讨论】:

  • 我认为这并不能回答我的问题。即使它是您正在加密/解密的数据密钥,解密方法如何工作? kms 密钥是否在密文 blob 中加密?您是否提供 kms 密钥 arn 以通过 IAM 角色进行解密?
  • "使用加密方式时,响应中存储了密钥ID:"解密从哪里获取密钥?
  • 如果我只想对 keyID 使用解密选项怎么办。该怎么做?
  • @Fregal Rooney 我认为 kmsClient 参考了 key 。我们可以调试并了解更多。您是否尝试过不加密解密?
【解决方案2】:
AmazonKeyManagementServiceConfig kmsConfig = new AmazonKeyManagementServiceConfig();
            kmsConfig.UseHttp = true;
            kmsConfig.ServiceURL = serviceEndPoint;
                //create client, specify Region end point or kms config
                AmazonKeyManagementServiceClient kmsClient = new AmazonKeyManagementServiceClient(awsKeyForKMS, awsSecretKeyForKMS, kmsConfig);
                DecryptRequest decryptRequest = new DecryptRequest();
// use hare above created encrypteddatakey to get plaindatakey
                MemoryStream streamEncryptedDataKey = new MemoryStream(Convert.FromBase64String(encryptedDataKey));//convert to stream object
                decryptRequest.CiphertextBlob = streamEncryptedDataKey;
                DecryptResponse decry`enter code here`ptResp = kmsClient.Decrypt(decryptRequest);
                plainDataKey = Convert.ToBase64String(decryptResp.Plaintext.ToArray());
// your decryption logic
             DecryptTexts("encrypted data", PlainKey)

【讨论】:

    【解决方案3】:

    出于此答案的目的,我假设您使用的是具有对称加密的 AWS KMS CMK。

    使用对称密钥时,密文块的内容确实包括用于加密它的 KMS 密钥。在此处查看更多信息:https://docs.aws.amazon.com/kms/latest/developerguide/programming-encryption.html#decryption 他们仍然注意到您应该指定一个密钥来解密它,但由于它位于密文 blob 中,因此不需要。

    但是,该密钥 ID 的存在并不授予使用该密钥解密任何内容的任何权限。您可以拥有一个用户/实体,该用户/实体被允许加密事物而无权使用该密钥解密,包括他们刚刚加密的消息。您可以通过两种不同的方式控制谁可以访问解密功能。​​

    首先是“关键政策”。在评估是否允许访问时,关键策略总是“获胜”是参考的第一个策略。默认情况下,密钥策略设置为“允许任何人使用 IAM 允许的密钥”。 (顺便说一句,IAM 是获取访问权限的第二种方式,但前提是密钥策略允许将其委托给该密钥)。密钥策略仅适用于它们所应用的密钥(即使资源字段为“*”)。密钥策略可以授予对特定实体/用户/账户的访问权限和/或委托给 IAM。您可以在此处阅读有关默认密钥策略的更多信息:https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-default

    第二个是IAM,一般账户权限你可能比较熟悉。您还可以在此处授予对 kms:decrypt 的访问权限,以访问您希望将其应用于的策略声明和资源。

    但是,回到你原来的问题:

    如何授予解密加密密文 blob 的权限?

    通过密钥策略或 IAM 访问 kms:decrypt 权限(当密钥策略中启用对 IAM 的委派时)。

    如果我想解密来自 AWS 服务的值,是否需要创建一个 IAM 角色来执行此操作并配置 KMS 密钥以允许该角色解密?

    无论是谁创建了密钥,如果数据元素受 KMS 密钥保护,则需要授予该密钥访问 kms:decrypt 的权限。 (例外:由于低级别的技术问题,某些 AWS 服务需要授权,例如 EBS,而不是 kms:decrypt,但同样的原则适用)。确保密钥策略启用了 IAM 委派,然后随意将策略附加到允许访问该密钥的 kms:decrypt 的 IAM 角色,以访问具有该角色的该用户/实体的解密操作。当然,您首先需要允许 AWS 使用该密钥进行加密(这是通过委托人是 AWS 服务的密钥策略完成的),但我假设您已经这样做了,因为您的问题是关于解密.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 2022-11-13
      • 2019-07-24
      • 2019-03-07
      • 2016-02-09
      相关资源
      最近更新 更多