【发布时间】:2020-03-31 23:36:31
【问题描述】:
我正在尝试使用客户提供的加密密钥将对象上传到 S3。 http://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html
我的代码如下:
$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 错误消息:计算的密钥 MD5 哈希与提供的哈希不匹配
我做错了什么?我的密钥48wk86271sDb23pY23zT5rZJ7q55R7eE 是 256 位。我也尝试过使用 base64_encode(md5(key, true))。
【问题讨论】:
-
您说您也尝试过 md5(key,true) 但您是否尝试过 base64_encode(md5(key,true)) ...?
-
@Michael-sqlbot 是的先生
-
我认为我的问题是我的密钥实际上不是 256 位。我将尝试使用 openssl_random_pseudo_byte 生成 256 位,我怀疑它会输出 64 十六进制字符串
-
实际上,我怀疑您的密钥是 256 位,直到您对其进行 base_64 编码,此时它会更多。我已经针对 REST API 进行了广泛的编码,但通常不熟悉 PHP SDK ...现在重新考虑,我怀疑您的错误是 base_64 编码这些值中的任何一个。 SDK 可能会为您处理, 在这种情况下,您是双重编码。试试
SSECustomerKey => 'raw key string with 32 chars', SSECustomerKeyMD5 => md5(key,true)。据我了解,“true”返回二进制 md5,而不是十六进制,这可能是您在这里需要的,因为文档提到 md5 有 128 位。
标签: php amazon-web-services amazon-s3