Boto3 AWS KMS 加密解密文件

Posted

技术标签:

【中文标题】Boto3 AWS KMS 加密解密文件【英文标题】:Boto3 AWS KMS encrypt and decrypt file 【发布时间】:2019-07-24 01:35:39 【问题描述】:

我有一个 python 脚本尝试使用 boto3 使用 AWS KMS 加密文件。我可以将文件加密并写入文件。但是当我尝试使用第二部分代码解密文件时,它引发了如下错误,有人可以帮助解决这个问题还是有更好的解决方案?非常感谢。

Traceback(最近一次调用最后一次): _api_call 中的文件“runtime/lib/python3.4/site-packages/botocore/client.py”,第 357 行 return self._make_api_call(operation_name, kwargs) _make_api_call 中的文件“runtime/lib/python3.4/site-packages/botocore/client.py”,第 661 行 raise error_class(parsed_response, operation_name) botocore.errorfactory.InvalidCiphertextException:调用解密操作时发生错误(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)

【问题讨论】:

可能相关? aws kms decrypt InvalidCiphertextException error · Issue #1043 · aws/aws-cli 【参考方案1】:

您收到该错误的原因是您从 KMS 返回的密文与您加密的明文长度不同。此外,KMS 不保证密文的大小或格式保持不变。您应该将 KMS 密文视为黑匣子。

此外,KMS 不建议您将明文直接发送到 KMS。相反,他们建议您改用信封加密:使用 KMS 加密数据密钥,并使用这些数据密钥加密您的数据。在像您这样的情况下,这不仅会减少对 KMS 的调用,而且还会造成资源分离:KMS 绝不会同时拥有您的加密数据和解密数据所需的密钥。

对于您的使用案例,您是否考虑过使用 AWS 加密 SDK[1][2]?它提供了一个易于使用的信封加密实现,并使得使用 KMS 保护您的数据变得简单。您可以在此处[3] 找到配置它以使用 KMS 的示例,并在此处[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

【讨论】:

以上是关于Boto3 AWS KMS 加密解密文件的主要内容,如果未能解决你的问题,请参考以下文章

管理员无法在 AWS KMS 中加密/解密

AWS KMS 加密 - 数据大小限制

使用AWS KMS加密本地数据

使用默认 aws/S3 KMS 密钥对解密对象进行跨账户访问

使用 KMS 进行 AWS RDS 加密会影响性能吗?

解密aws kms密钥时出现Nodejs异步问题