Boto3 AWS KMS加密和解密文件

时间:2019-03-02 01:40:31

标签: python boto3 aws-kms

我有一个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)

1 个答案:

答案 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

[4] https://github.com/aws/aws-encryption-sdk-python/blob/master/examples/src/basic_file_encryption_with_multiple_providers.py#L96-L107