【问题标题】:Amazon S3 Customer Provided Encryption with PHP SDKAmazon S3 客户使用 PHP 开发工具包提供加密
【发布时间】: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


【解决方案1】:

REST API documentation 指定客户密钥和客户密钥 MD5 均以 base-64 编码发送...

x-amz-server-side​-encryption​-customer-key

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

x-amz-server-side​-encryption​-customer-key-MD5

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

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

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

当然,您可能希望将 32 字节的密钥字符串放在一个变量中,而不是在代码中复制粘贴相同的文字字符串两次。 md5()specifies 的第二个参数“true”表示将返回二进制 md5 哈希,正如 SDK 所期望的那样,而不是默认返回的十六进制编码变体。

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

【讨论】:

  • 其实如果你不提供,SDK也会为你设置SSECustomerKeyMD5参数。见github.com/aws/aws-sdk-php/blob/master/src/Aws/S3/…
  • 不错。谢谢,@JeremyLindblom。
  • 唯一对我有帮助的帖子......虽然没有关于该主题的其他帖子:)
  • 如何用php创建string_of_exactly_32_bytes?
  • @Richerdfuld 该字符串是您的加密密钥。它必须正好是 32 个字节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 2019-05-15
  • 2017-09-05
  • 2015-06-11
  • 1970-01-01
相关资源
最近更新 更多