使用S3元数据调用kms.decrypt时出现InvalidCiphertextException

时间:2016-01-22 23:30:06

标签: python amazon-web-services amazon-s3 boto3 aws-kms

我可以通过Java SDK添加客户端加密文件,我也可以获取文件。我现在正试图用boto3访问它。 (我知道boto3并不支持这个,但s3-wrapper确实如此。但这涉及到boto3。)

我获取s3元数据,然后像这样调用kms.decrypt:

object_info = s3.head_object(Bucket=bucket_name, Key=key_name)
metadata = object_info['Metadata'] # metadata is a dict with lots of x-amz-key, x-amz-iv, etc
ekey = kms.decrypt(CiphertextBlob=metadata,EncryptionContext=metadata)

# fails with:
# ParamValidationError:
# Parameter validation failed: Invalid type for parameter CiphertextBlob, value: .. type: <class 'dict'>, valid types: <class 'bytes'>, <class 'bytearray'>, file-like object`

那么,如果我应该传递密钥作为CiphertextBlob怎么办?

# this key looks like 'CiAlgoyM4k...
ekey = kms.decrypt(CiphertextBlob=metadata['x-amz-key-v2'],EncryptionContext=metadata)

# fails with:
# botocore.exceptions.ClientError: An error occurred (InvalidCiphertextException) when calling the Decrypt operation: None

然后我尝试传入base64&#d; d键:

# this key looks like b'\n %\x82\x8c\x8c\xe2ML...
cblob = base64.b64decode(metadata['x-amz-key-v2'])
ekey = kms.decrypt(CiphertextBlob=cblob,EncryptionContext=metadata)

# (still) fails with:
# botocore.exceptions.ClientError: An error occurred (InvalidCiphertextException) when calling the Decrypt operation: None

然后我尝试将s3内容作为blob传递。

full_object = s3.get_object(Bucket=bucket_name, Key=key_name)
ekey = kms.decrypt(CiphertextBlob=full_object['Body'].read(),EncryptionContext=metadata)

# Still fails with:
# botocore.exceptions.ClientError: An error occurred (InvalidCiphertextException) when calling the Decrypt operation: None

所以,我想我的问题是,S3元数据中的CiphertextBlob是什么?由于我将它放在Java SDK的EncryptedPutObjectRequestAmazonS3EncryptionClient中,它将其抽象出来,我不知道该blob应该是什么样的。

相关链接

2 个答案:

答案 0 :(得分:1)

根据您的评论,我几乎可以肯定您使用信封加密加密了文件,而不是客户主密钥(# metadata is a dict with lots of x-amz-key, x-amz-iv, etc)。另一个问题是您正在传递加密上下文,但始终将其作为整个字典。这是你的意图吗?

所以,我的建议是:

  1. 确保在信封密钥上调用kms.decrypt,然后使用解密密钥对数据进行实际解密(假设上面的评论正确无误)。
  2. 仔细检查您是否在加密环境中传递了所需内容。

答案 1 :(得分:0)

如果要使用 EncryptionContext 选项,请在加密时首先添加“ Encryption Context”选项。

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/kms.html#KMS.Client.encrypt