AWS KMS解密:如何配置KMS密钥?

时间:2019-07-09 11:30:27

标签: amazon-web-services aws-kms

对于如何使用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密钥。这是否意味着以某种方式在密文blob中对KMS密钥进行了加密?如果是这样

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

3 个答案:

答案 0 :(得分:0)

您的示例来自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"
}

它将在解密期间使用。

答案 1 :(得分:0)

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)

答案 2 :(得分:0)

出于此答案的目的,我假设您使用的是具有对称加密的 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 的权限?

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

<块引用>

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

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