这就是解决方案:通过将MD5十六进制转换为base64而不是字符串来修复它。JS示例(Node.js或类似文件、浏览器等)
new Buffer(md5, 'hex').toString('base64')
我只是花了几分钟想明白这一点,所以我想我可以分享它。:)
ctrmrzij1#
Content-MD5始终是base64头。消息的base64编码的128位MD5摘要(没有标头)。此标头可用作消息完整性检查,以验证数据是否与最初发送的数据相同。尽管它是可选的,但我们建议使用Content-MD5机制作为端到端完整性检查。有关REST请求身份验证的详细信息,转到Amazon简单存储服务开发人员指南中的REST身份验证键入:字符串默认值:无限制:无REST Put Object
Content-MD5
qpgpyjmq2#
我在实现从浏览器上传到AWS S3的blob时偶然发现了这个问题。虽然选择的答案帮助我理解了Content-MD5必须是base64字符串,但我没有意识到我使用的库-md5并没有生成base64格式的MD5。我挠了挠头,想明白为什么MD5是无效的,因为当我手动上传它时,它与Amazon S3控制台上显示的Etag的值相同,结果发现Etag也不是base64。然后我尝试了另一个名为js-md5的库,它有一个显式的base64函数来生成base64格式的MD5,它通过了。因此,如果您在Javascript中执行相同的操作,使用js-md5库将帮助您解决问题。
md5
js-md5
base64
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变量可以是string或typed array(例如:第一个字符
content
string
typed array
3条答案
按热度按时间ctrmrzij1#
Content-MD5
始终是base64头。消息的base64编码的128位MD5摘要(没有标头)。此标头可用作消息完整性检查,以验证数据是否与最初发送的数据相同。尽管它是可选的,但我们建议使用Content-MD5机制作为端到端完整性检查。有关REST请求身份验证的详细信息,转到Amazon简单存储服务开发人员指南中的REST身份验证键入:字符串默认值:无限制:无
REST Put Object
qpgpyjmq2#
我在实现从浏览器上传到AWS S3的blob时偶然发现了这个问题。虽然选择的答案帮助我理解了
Content-MD5
必须是base64字符串,但我没有意识到我使用的库-md5
并没有生成base64格式的MD5。我挠了挠头,想明白为什么MD5是无效的,因为当我手动上传它时,它与Amazon S3控制台上显示的Etag的值相同,结果发现Etag也不是base64。
然后我尝试了另一个名为
js-md5
的库,它有一个显式的base64
函数来生成base64格式的MD5,它通过了。因此,如果您在Javascript中执行相同的操作,使用
js-md5
库将帮助您解决问题。pokxtpni3#
对于任何寻找代码示例或替代方案的人,这里有三种使用内置和外部库的不同解决方案。
NodeJS内置:
使用md5库:
或
content
变量可以是string
或typed array
(例如:第一个字符