Boto3 AWS KMS шифрует и дешифрует файл - PullRequest
0 голосов
/ 02 марта 2019

У меня есть скрипт на python, пытающийся зашифровать файл с помощью AWS KMS с помощью boto3.Я могу получить файл в зашифрованном виде и записать в файл.Но когда я попытался расшифровать файл с помощью кода второй части, возникла ошибка, как показано ниже, может кто-нибудь помочь с этим или есть какие-то более эффективные решения?Большое спасибо.

Traceback (последний вызов был последним): файл "runtime / lib / python3.4 / site-packages / botocore / client.py", строка 357, в _api_call возвращает self._make_api_call (имя_операции,kwargs) Файл "runtime / lib / python3.4 / site-packages / botocore / client.py", строка 661, в _make_api_call поднять error_class (parsed_response, имя_операции) 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)

1 Ответ

0 голосов
/ 04 марта 2019

Причина, по которой вы получаете эту ошибку, заключается в том, что зашифрованный текст, который вы получаете от 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

...