AmazonS3客户使用PHP SDK提供加密
我正在尝试使用客户提供的加密密钥将对象上载到S3 我的代码如下所示: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
$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字节。