2015-04-12 5 views
1

Я пытаюсь загрузить объект на S3 с помощью предоставленного клиентом ключа шифрования. http://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.htmlAmazon S3 Клиент предоставил шифрование с помощью PHP SDK

Мой код выглядит следующим образом:

$this->s3->putObject(array(
    'Bucket' => $this->bucket, 
    'Key' => "$filename", 
    'Body' => $resource, 
    'ACL' => 'private', 
    'SSECustomerAlgorithm' => 'AES256', 
    'SSECustomerKey' => base64_encode('48wk86271sDb23pY23zT5rZJ7q55R7eE'), 
    'SSECustomerKeyMD5'=> base64_encode(md5('48wk86271sDb23pY23zT5rZJ7q55R7eE')) 
)); 

Ошибка я получаю говорит AWS Error Message: The calculated MD5 hash of the key did not match the hash that was provided

Что я делаю неправильно? Мой ключ 48wk86271sDb23pY23zT5rZJ7q55R7eE имеет 256 бит. Я также пробовал использовать base64_encode (md5 (key, true)).

Заранее спасибо

+0

Вы говорите, что вы также попробовали md5 (key, true), но вы попробовали base64_encode (md5 (key, true)) ...? –

+0

@ Michael-sqlbot Да, сэр –

+0

Я думаю, что моя проблема в том, что мой ключ на самом деле не 256 бит. Я попытаюсь использовать openssl_random_pseudo_byte для генерации 256 бит, и я подозреваю, что он выведет шестнадцатеричную строку. –

ответ

2

REST API documentation указывает, что оба ключа клиента и ключа MD5 клиент будет отправлен базовый 64 закодирован ...

х-АМЗ-серверной стороне -encryption -customer-key

Используйте этот заголовок, чтобы предоставить 256-битный ключ с кодировкой base64 для Amazon S3, который будет использоваться для шифрования или расшифровки ваших данных.

х-AMZ-серверный -encryption -Клиент-ключ-MD5

Используйте этот заголовок, чтобы обеспечить в кодировке base64 128-битный MD5 дайджеста ключа шифрования в соответствии с RFC 1321. Amazon S3 использует этот заголовок для проверки целостности сообщения, чтобы гарантировать, что ключ шифрования был передан без ошибок.

... однако PHP SDK обрабатывает оба шага кодирования для вас, поэтому аргументы должны передаваться без какой-либо кодировки.

'SSECustomerAlgorithm' => 'AES256', 
'SSECustomerKey'  => 'key_=_string_of_exactly_32_bytes', 
'SSECustomerKeyMD5' => md5('key_=_string_of_exactly_32_bytes',true), 

Конечно, вы, вероятно, хотите, что 32 байт ключ строки в переменной, а не copypasting ту же буквенную строку в коде дважды. Второй аргумент «true» для md5()specifies должен возвращать двоичный mh5-хэш, как ожидается SDK, вместо варианта с шестнадцатеричным кодированием, который будет возвращен по умолчанию.

Помните, что при использовании ключей шифрования, предоставленных клиентом, если вы потеряете ключ, вы потеряете данные. S3 не сохраняет ключ, и без ключа выборка сохраненного объекта невозможна.

+2

На самом деле, SDK также установит для вас параметр 'SSECustomerKeyMD5', если вы его не предоставите. См. Https://github.com/aws/aws-sdk-php/blob/master/src/Aws/S3/SseCpkListener.php –

+0

Ницца. Спасибо, @JeremyLindblom. –

+0

единственный пост, который помог мне ... хотя нет другого сообщения относительно этой темы :) –

Смежные вопросы