0

当使用 HMAC 对 API 调用进行身份验证时,要散列的消息通常包含很多似乎没有添加任何内容的内容。例如,以下是为 API 生成签名的步骤:

hmacsha1(HTTP VERB + URI + JSON_REQUEST_CONTENT + DATETIME, "secret")

为什么不只是这样:

hmacsha1(JSON_REQUEST_CONTENT, "secret")

这是假设 JSON_REQUEST_CONTENT 是一个包含所有相关请求信息的 JSON 字符串。

在我看来,添加 HTTP VERB 和 URI(或任何额外的非特定于内容的信息)只是增加了消息的长度,我不明白它的好处。

谢谢!

4

1 回答 1

2

HMAC 通常用于防止消息篡改,但它们也用于防止消息重放。

如果 HMAC 只包含有效负载和一个只能防止篡改的秘密,那么如果我再次发送相同的消息,它将是有效的。通过使用其他详细信息(尤其是日期时间或随机数)来装饰请求,以防止重播和篡改。


要将日期时间用作哈希的盐,您通常需要以明文形式发送带有消息的日期时间(尽管可以从负载外部的请求标头中接收或发送消息的时间粗略推断)。如果日期时间与服务器认为的时间相差太远,则消息将失败(例如,不到一分钟)。如果当服务器对数据进行相同的哈希处理并且没有得到相同的结果时,它也会使消息失败。

要使用 nonce,最实用的方法是让服务说,下次你向我发送请求时,使用这个 nonce。nonce 不需要与请求一起以明文形式发送。当服务器成功处理一条消息时,它会说,下次使用这个随机数,之前的随机数无效。

日期时间通过确保在特定时间发送消息来防止重播,随机数通过使用一次性密码来防止重播。

于 2012-08-23T22:06:28.913 回答