python - 调用 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 中发出实际请求。
简而言之,
- 从 ExtraArgs 中删除了 SSECustomerKeyMD5
- 修改 CustomerKey/EncryptionKey 生成算法以生成 32 位字符串。
遵循 shimo 的回答以及在 python 中为 boto3 文件加密创建 SSECustomerKey 的正确方法是什么?这个答案。
解决方案
你可以在Boto3 doc中找到这个解释,以为它不在 upload_fileobj 部分。
SSECustomerKeyMD5 (string) -- 根据 RFC 1321 指定加密密钥的 128 位 MD5 摘要。
您的代码似乎在计算文件的 MD5,而不是加密密钥。
推荐阅读
- javascript - 即使使用 .on 使用的数据表,动态按钮也不会在其他元素上触发事件
- postgresql - NOT IN 确实适用于字符串数组
- android - 在使用位图类型转换器类时从 ROOM 数据库中多次查询行会使应用程序崩溃
- sqlite - 在 mysqlite 中计算中位数
- git - 如何授予语义释放权限以将代码推送到 master
- javascript - 将 Hooks 转换为类组件
- kubernetes - 如何使用 Terraform 通过 YAML 部署 Kubernetes 服务?
- postgresql - 如何删除 PostgreSQL sql 查询的特殊字符
- sql - 我如何知道 MERGE 语句 (ORACLE) 执行了什么操作?
- c# - wpf mvvm - 绑定到 IsSelected 的 TextBox/TextBlock/CheckBox - 我需要“抓取”那里的输入以创建一个新对象