InvalidCiphertextException при вызове kms.decrypt с метаданными S3

Я могу добавить зашифрованный файл на стороне клиента с помощью 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:

# 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 в виде большого двоичного объекта.

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

Итак, я думаю, мой вопрос в том, что такое правильный CiphertextBlob из метаданных S3? Поскольку я помещаю его в пакет Java SDK EncryptedPutObjectRequest и AmazonS3EncryptionClient, который его абстрагирует, я не знаю, как должен выглядеть этот блоб.

Ссылки по теме


person tedder42    schedule 22.01.2016    source источник


Ответы (2)


Из ваших комментариев я почти уверен, что вы зашифровали файл, используя шифрование конверта, а не главный ключ клиента (# metadata is a dict with lots of x-amz-key, x-amz-iv, etc). Другая проблема заключается в том, что вы передаете контекст шифрования, но всегда делаете его целым словарем. Это ваше намерение?

Итак, мои предложения:

  1. Убедитесь, что вы вызываете kms.decrypt на своем ключе конверта, а затем фактически расшифровываете данные с помощью расшифрованного ключа (при условии, что мой комментарий выше верен).
  2. Дважды проверьте, что вы передаете то, что хотите, в своем контексте шифрования.
person Viccari    schedule 01.05.2017

Если вы хотите использовать параметр EncryptionContext, сначала добавьте параметр Encryption Context при шифровании.

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

person Jesse Lee    schedule 29.07.2020