Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AmazonS3客户使用PHP SDK提供加密_Php_Amazon Web Services_Amazon S3 - Fatal编程技术网

AmazonS3客户使用PHP SDK提供加密

AmazonS3客户使用PHP SDK提供加密,php,amazon-web-services,amazon-s3,Php,Amazon Web Services,Amazon S3,我正在尝试使用客户提供的加密密钥将对象上载到S3 我的代码如下所示: $this->s3->putObject(array( 'Bucket' => $this->bucket, 'Key' => "$filename", 'Body' => $resource, 'ACL' => 'private', 'SSECustomerAlgorithm' => 'AES256', 'SSECustomerKey' => ba

我正在尝试使用客户提供的加密密钥将对象上载到S3

我的代码如下所示:

$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都要发送base-64编码

x-amz-服务器端​-加密​-客户密钥

使用此标头为Amazon S3提供256位base64编码的加密密钥,用于加密或解密数据

x-amz-服务器端​-加密​-customer-key-MD5

根据RFC 1321,使用此标头提供加密密钥的base64编码128位MD5摘要。AmazonS3使用此报头进行消息完整性检查,以确保加密密钥传输无误

…但是,PHP SDK会为您处理这两个编码步骤,因此应在不进行任何编码的情况下传递参数

'SSECustomerAlgorithm' => 'AES256',
'SSECustomerKey'       => 'key_=_string_of_exactly_32_bytes',
'SSECustomerKeyMD5'    => md5('key_=_string_of_exactly_32_bytes',true),
当然,您可能希望在变量中包含32字节的键字符串,而不是在代码中复制粘贴相同的文本字符串两次。对于
md5()
,第二个参数“true”表示将返回二进制md5哈希,这是SDK所期望的,而不是默认情况下返回的十六进制编码变量


请记住,在使用客户提供的加密密钥时,如果您丢失了密钥,则会丢失数据。S3不存储密钥,如果没有密钥,则无法获取存储的对象。

您说您也尝试了md5(key,true),但是否尝试了base64_encode(md5(key,true))…?@Michael sqlbot Yes sirI我想我的问题是,我的密钥实际上不是256位的。我将尝试使用openssl_random_pseudo_byte来生成256位,我怀疑它将输出64个十六进制字符串实际上,我怀疑您的密钥是256位的,直到您对其进行based_64编码,在这一点上它会更大。我已经针对RESTAPI编写了大量代码,但通常不熟悉PHPSDK。。。现在重新思考一下,我怀疑您的错误是base_64编码了这些值中的任何一个。SDK可能会为您处理这些,在这种情况下,您是双重编码。请尝试使用带有32个字符的原始密钥字符串,SSECustomerKeyMD5=>md5(key,true)。据我所知,“true”返回的是二进制md5,而不是十六进制,这可能是您在这里需要的,因为文档中提到了md5的128位。实际上,如果您不提供,SDK也会为您设置
SSECustomerKeyMD5
参数。再见。谢谢,@JeremyLindblom。唯一帮助我的帖子。。。尽管没有关于这个主题的其他帖子:)如何用php创建32字节的字符串?@Richerdfuld该字符串是您的加密密钥。它必须正好是32字节。