我有一个python脚本试图使用boto3使用AWS KMS加密文件。我可以将文件加密并写入文件。但是,当我尝试使用第二部分代码解密文件时,它引发了如下错误,有人可以对此提供帮助吗,还是有更好的解决方案?非常感谢。
回溯(最近通话最近): _api_call中的文件“运行时/lib/python3.4/site-packages/botocore/client.py”,第357行 返回self._make_api_call(operation_name,kwargs) _make_api_call中的文件“运行时/lib/python3.4/site-packages/botocore/client.py”,行661 引发error_class(parsed_response,operation_name) botocore.errorfactory.InvalidCiphertextException:调用Decrypt操作时发生错误(InvalidCiphertextException):
client = boto3.client(
'kms',
region_name='us-east-1',
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key
)
with open(src_file, 'rb') as infile :
with open(ret_file, 'wb') as outfile :
while True:
chunk = infile.read(chunk_size)
if not chunk :
break
resp = client.encrypt(KeyId=kms_id, Plaintext=chunk)['CiphertextBlob']
outfile.write(resp)
client = boto3.client(
'kms',
region_name='us-east-1',
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key
)
with open(src_file, 'rb') as infile :
with open(ret_file, 'wb') as outfile :
while True:
chunk = infile.read(chunk_size)
if not chunk :
break
resp = client.decrypt(CiphertextBlob=chunk)['Plaintext']
outfile.write(resp)
答案 0 :(得分:0)
出现此错误的原因是,从KMS返回的密文长度与加密的明文长度不同。此外,KMS不保证该密文的大小或格式保持不变。您应该将KMS密文当作黑匣子。
此外,KMS不建议您将纯文本直接发送到KMS。相反,他们建议您改用信封加密:使用KMS加密数据密钥,然后使用这些数据密钥加密数据。在像您这样的情况下,这不仅会减少对KMS的呼叫,而且还会造成资源分离:KMS绝不会同时拥有加密的数据和解密所需的密钥。
对于您的用例,您是否考虑过使用AWS Encryption SDK [1] [2]?它提供了易于使用的信封加密实现,并使得使用KMS保护数据变得简单。您可以在此处找到配置它以使用KMS的示例[3],并在此处找到加密和解密文件的示例[4]。
[1] https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/introduction.html
[2] https://aws-encryption-sdk-python.readthedocs.io/en/stable/
[3] https://github.com/aws/aws-encryption-sdk-python/blob/master/examples/src/basic_encryption.py#L29