对于密码文本blob是如何用AWS KMS客户端解密的,我有点困惑。下面是AWS文档的一个示例:
// 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中被加密了?如果是这样..。
发布于 2019-07-09 11:43:31
您的示例来自加密和解密数据密钥
这些操作旨在对数据键进行加密和解密。它们在加密操作中使用AWS 客户主键 (CMK),它们不能接受超过4KB (4096字节)的数据。虽然您可能会使用它们来加密少量数据,例如密码或RSA密钥,但它们并不用于加密应用程序数据。
CMK:
是在AWS KMS中创建的,并且从不让AWS KMS不加密。要使用或管理您的CMK,您可以通过AWS KMS访问它们。
这些操作都使用AWS设置中配置的主键,而不是动态提供的键。使用AWS管理控制台来管理这些密钥。
使用加密法时,密钥ID存储在响应中:
{
"CiphertextBlob": blob,
"KeyId": "string"
}它将在解密过程中使用。
发布于 2021-03-26 19:23:23
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)发布于 2021-06-28 14:11:48
为了解决这个问题,我假设您使用的是带有对称加密的AWS KMS CMK。
当使用对称密钥时,密码文本块的内容确实包括使用哪个KMS密钥对其进行加密。在这里可以看到更多的信息:https://docs.aws.amazon.com/kms/latest/developerguide/programming-encryption.html#decryption,他们仍然注意到您应该指定一个密钥来解密它,但是不需要它,因为它在密码文本块中。
但是,该密钥id的存在并不授予任何权限来使用该密钥解密任何内容。您可以拥有一个用户/实体,该用户/实体允许在不允许使用该密钥解密的情况下对事物进行加密,包括他们刚刚加密的消息。您可以通过两种不同的方式控制谁可以访问解密函数。
第一个是“关键政策”。在评估是否允许访问时,关键策略总是“win”。默认情况下,密钥策略设置为‘允许任何人使用IAM允许的密钥’。(顺便说一句,IAM是获得访问的第二种方式,但前提是密钥策略允许将该密钥委托给它)。键策略仅应用于应用到的键(即使资源字段为“*”)。关键策略可以允许访问特定实体/用户/帐户和/或委托给IAM。您可以在这里阅读更多关于默认密钥策略的内容:https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-default
第二个是IAM,您可能更熟悉普通帐户权限。在这里,您还可以授予对kms的访问权限:对策略语句进行解密,并授予希望将其应用于的资源。
然而,回到你最初的问题:
如何授予解密加密密文blob的权限?
通过对kms的访问:解密权限,通过密钥策略或IAM (当在密钥策略中启用对IAM的委托时)。
如果我想解密AWS服务中的值,是否创建一个IAM角色来这样做,并配置KMS密钥以允许该角色解密?
不管是谁创建了密钥,如果数据元素受到KMS密钥的保护,则需要授予该密钥访问kms:解密的权限。(例外:一些AWS服务需要授权,比如EBS,而不是kms:decrypt,原因是技术级别较低,但同样的原则也适用)。确保密钥策略启用了IAM委托,然后可以将策略附加到允许访问kms的IAM角色:对该密钥解密以访问具有该角色的用户/实体的解密操作。当然,您需要允许AWS首先使用该密钥进行加密(这是通过密钥策略实现的,其中主体是AWS服务),但我认为您已经这样做了,因为您的问题是关于解密的。
https://stackoverflow.com/questions/56951588
复制相似问题