调用PutObject操作时发生错误(InvalidArgument):计算的密钥MD5哈希与提供的哈希不匹配



如何在python-flask中为文件对象创建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_filobj((函数中使用SSE-C加密,因此也在ExtraArgs中传递SSECustomerAlgorithm、SSECustomerKey和SSECustomerKeyMD5。

这里,SSECustomerKeyMD5高于base64_encoded_md5_string值。

在我获取MD5散列的实现中有什么错误吗?

amazon是如何为同一个文件对象创建MD5哈希的?

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


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

许多天来,我一直在为这个问题绞尽脑汁。请帮忙。


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

简而言之,

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

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

您可以在Boto3文档中找到此解释,但它不在upload_fileobj部分。

SSECustomerKeyMD5(字符串(--指定根据RFC 1321的加密密钥。

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

最新更新