我试图在eBay的docs https://developer.ebay.com/develop/guides/digital-signatures-for-apis#sigin上计算内容摘要头的值。
当我试图根据我对规范的理解来计算示例有效载荷摘要头时,我得到了一个不同的值。我是否理解了规范的错误,还是文档中有错误?
内容摘要标题 注意:如果不包含HTTP有效负载(例如,对于GET调用),则不需要此报头。 当包含HTTP有效负载时,此报头在HTTP有效负载上提供一个SHA-256摘要。 若要添加内容摘要标题(如草案-ietf-httpbis-摘要-头-10中所指定的),请在HTTP有效负载上计算SHA-256摘要(以UTF-8字符编码)。虽然规范允许添加多个摘要(例如,SHA-256和SHA-512),但在本例中只需要SHA-256。 考虑以下有效载荷:
{"hello": "world"}在这种情况下,头的值为: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=="如您所见,基64编码摘要与示例完全不同。
发布于 2022-11-28 16:57:23
因此,我解决了我的问题,并将在这里张贴的解决方案,为其他人。Content头(至少对于eBays SCA需求)是一个sha-256哈希utf-8编码字节数组,然后被转换为base64编码字符串。
2.5.3 :001 > require 'base64'
=> true
2.5.3 :002 > require 'digest'
=> true
2.5.3 :003 > s = '{"hello": "world"}'.encode('utf-8')
=> "{\"hello\": \"world\"}"
2.5.3 :005 > Digest::SHA256.base64digest s
=> "X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE="
2.5.3 :006 >我在c#中需要这样的实现,所以我的实现如下所示
private void _addDigestHeader(HttpWebRequest request, string requestBody)
{
byte[] hashBytes;
using (var sha256Hash = SHA256.Create())
{
hashBytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(xml.InnerXml));
}
var hashResult = Convert.ToBase64String(hashBytes);
request.Headers.Add("content-digest", hashResult);
}https://stackoverflow.com/questions/74365335
复制相似问题