计算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
相关产品推荐
相关产品推荐

