首页 > 解决方案 > 调用 PutObject 操作时发生错误(InvalidArgument):计算的键的 MD5 哈希与提供的哈希不匹配

问题描述

如何在 python 烧瓶中为文件对象创建 md5 哈希?我尝试使用以下代码创建:

md5_hash = hashlib.md5()
md5_hash.update(file)
digest = md5_hash.hexdigest()
base64_encoded_md5 = base64.b64encode(digest.encode("utf-8"))
base64_encoded_md5_string = str(base64_encoded_md5.decode("utf-8"))

我在 boto3 s3_client.upload_fileobj() 函数中使用 SSE-C 加密,因此也在 ExtraArgs 中传递 SSECustomerAlgorithm、SSECustomerKey 和 SSECustomerKeyMD5。

在这里,SSECustomerKeyMD5 高于 base64_encoded_md5_string 值。

在我的实现中获取 MD5 哈希有什么问题吗?

亚马逊如何为同一个文件对象创建 MD5 哈希?

boto3 依赖项中是否有任何内置函数可以用来获取 MD5 哈希值?


我调试了整个问题,boto3.s3.inject 包含upload_fileobj() 函数。它正在上传文件并作为响应,在图像中返回以下响应。 boto3.s3.inject 响应

很多天以来,我一直在努力解决这个问题。请帮忙。


[已解决]:修改了我的加密密钥生成算法以生成 32 位字符串。早些时候是16位导致了这个问题。还从 upload_fileobj() 中的 ExtraArgs 中删除了 SSECustomerKeyMD5,因为 boto3 在内部计算加密密钥本身的 MD5 哈希,并将其添加到请求标头中,然后在 botocore.client._make_api_call 中发出实际请求。

简而言之,

  1. 从 ExtraArgs 中删除了 SSECustomerKeyMD5
  2. 修改 CustomerKey/EncryptionKey 生成算法以生成 32 位字符串。

遵循 shimo 的回答以及在 python 中为 boto3 文件加密创建 SSECustomerKey 的正确方法是什么?这个答案。

标签: pythonamazon-web-servicesamazon-s3boto3md5

解决方案


你可以在Boto3 doc中找到这个解释,以为它不在 upload_fileobj 部分。

SSECustomerKeyMD5 (string) -- 根据 RFC 1321 指定加密密钥的 128 位 MD5 摘要。

您的代码似乎在计算文件的 MD5,而不是加密密钥。


推荐阅读