Я могу добавить зашифрованный файл на стороне клиента с помощью 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, который его абстрагирует, я не знаю, как должен выглядеть этот блоб.
Ссылки по теме
- stackoverflow: расшифровка на стороне клиента в ruby; не использует KMS
- boto3 проблемы с github: начало расшифровки kms в boto3 для s3; не работает, возможно, потому что это ключ "v2"?