You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

计算Content-Digest字段出现差异,请求排查问题原因

计算eBay API的Content-Digest头结果与示例不符的问题

我正在按照eBay开发者文档计算Content-Digest头的值,但计算示例负载的结果和文档里的示例不一致,想确认是我理解错了规范还是文档有问题。

Content-Digest头
注意:当没有HTTP负载时(如GET请求),不需要此头。
当包含HTTP负载时,此头提供该负载的SHA-256摘要。
添加Content-Digest头(遵循draft-ietf-httpbis-digest-headers-10规范)需对UTF-8编码的HTTP负载计算SHA-256摘要。规范允许多个摘要,但此处仅需SHA-256。
示例负载:{"hello": "world"}
对应的Content-Digest头值应为:sha-256=:X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=:

我理解的规范是:头结构为摘要算法(如sha-256)后跟=,值为负载UTF-8编码后的摘要的Base64编码。以下是我的Ruby计算代码:

2.5.3 :022 > s = '{"hello": "world"}'.encode('utf-8')
 => "{\"hello\": \"world\"}"
2.5.3 :023 > s
 => "{\"hello\": \"world\"}"
2.5.3 :024 > puts s
{"hello": "world"}
 => nil
2.5.3 :025 > require 'digest'
 => true
2.5.3 :026 > digest = Digest::SHA2.new(256).hexdigest s
 => "5f8f04f6a3a892aaabbddb6cf273894493773960d4a325b105fee46eef4304f1"
2.5.3 :027 > require 'base64'
 => true
2.5.3 :028 > Base64.strict_encode64 digest
 => "NWY4ZjA0ZjZhM2E4OTJhYWFiYmRkYjZjZjI3Mzg5NDQ5Mzc3Mzk2MGQ0YTMyNWIxMDVmZWU0NmVlZjQzMDRmMQ=="

可以看到,我得到的Base64编码结果和示例完全不同。


问题出在你对摘要处理的步骤上——你先把SHA-256摘要转成了十六进制字符串,再对这个字符串做Base64编码,但规范要求的是直接对SHA-256生成的二进制摘要进行Base64编码,而不是对十六进制字符串编码。

正确的Ruby代码应该是:

s = '{"hello": "world"}'.encode('utf-8')
require 'digest'
require 'base64'

# 生成二进制摘要,再做Base64编码
binary_digest = Digest::SHA256.digest(s)
base64_digest = Base64.strict_encode64(binary_digest)
# 按照规范格式拼接
content_digest = "sha-256=:#{base64_digest}:"

puts content_digest
# 输出结果:sha-256=:X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=:

解释:

  • Digest::SHA256.digest(s) 返回SHA-256计算后的二进制数据,而非十六进制字符串;
  • 对二进制数据做Base64编码,就能得到示例中的X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=;
  • 最后按照draft-ietf-httpbis-digest-headers-10规范的格式,用:包裹Base64值,即可得到正确的Content-Digest头值。

内容的提问来源于stack exchange,提问作者jburns

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 22:15:29