NodeJS Amazon S3提供了无效摘要:指定的Content-MD5无效

fafcakar  于 2022-12-03  发布在  Node.js
关注(0)|答案(3)|浏览(278)

这就是解决方案:通过将MD5十六进制转换为base64而不是字符串来修复它。
JS示例(Node.js或类似文件、浏览器等)

new Buffer(md5, 'hex').toString('base64')

我只是花了几分钟想明白这一点,所以我想我可以分享它。:)

ctrmrzij

ctrmrzij1#

Content-MD5始终是base64头。
消息的base64编码的128位MD5摘要(没有标头)。此标头可用作消息完整性检查,以验证数据是否与最初发送的数据相同。尽管它是可选的,但我们建议使用Content-MD5机制作为端到端完整性检查。有关REST请求身份验证的详细信息,转到Amazon简单存储服务开发人员指南中的REST身份验证键入:字符串默认值:无限制:无
REST Put Object

qpgpyjmq

qpgpyjmq2#

我在实现从浏览器上传到AWS S3的blob时偶然发现了这个问题。虽然选择的答案帮助我理解了Content-MD5必须是base64字符串,但我没有意识到我使用的库-md5并没有生成base64格式的MD5。
我挠了挠头,想明白为什么MD5是无效的,因为当我手动上传它时,它与Amazon S3控制台上显示的Etag的值相同,结果发现Etag也不是base64。
然后我尝试了另一个名为js-md5的库,它有一个显式的base64函数来生成base64格式的MD5,它通过了。
因此,如果您在Javascript中执行相同的操作,使用js-md5库将帮助您解决问题。

pokxtpni

pokxtpni3#

对于任何寻找代码示例或替代方案的人,这里有三种使用内置和外部库的不同解决方案。
NodeJS内置:

const crypto = require("crypto");
const hash = crypto.createHash("md5").update(content).digest("base64");

使用md5库:

const md5 = require("md5");
const hash = Buffer.from(md5(content), "hex").toString("base64");

const md5 = require("md5");
const md5Bytes = md5(content, {
  encoding: "binary",
  asBytes: true,
});
const hash = Buffer.from(md5Bytes).toString("base64");

content变量可以是stringtyped array(例如:第一个字符

相关问题