当使用HMAC验证API调用时,通常要散列的消息包含许多似乎没有添加任何内容的东西。例如,以下是为API生成签名的步骤:
hmacsha1(HTTP VERB + URI + JSON_REQUEST_CONTENT + DATETIME, "secret")
为什么不这样做:
hmacsha1(JSON_REQUEST_CONTENT, "secret")
这假设JSON_REQUEST_CONTENT是一个包含所有相关请求信息的JSON字符串。
在我看来,添加HTTP VERB和URI(或任何额外的非内容特定信息)只是增加了消息的长度,我不明白这个好处。
谢谢!
答案 0 :(得分:2)
HMAC通常用于防止消息篡改,但它们也用于防止重播消息。
如果HMAC仅包含有效载荷和只能防止篡改的秘密,如果我再次发送相同的消息,它将是有效的。通过使用其他详细信息(日期时间或特殊时间)来处理请求,以防止重放和篡改。
要将日期时间用作散列的salt,通常需要以明文形式发送带有消息的日期时间(尽管可以从接收消息或在外部的请求标头中发送消息的时间大致推断出它。有效载荷)。如果日期时间与服务器认为的时间相差太远,则消息将失败(例如,不在一分钟内)。如果服务器对数据执行相同的散列并且它没有得到相同的结果,那么它也将使消息失败。
要使用随机数,最实用的方法是服务说,下次您发送请求时,请使用此随机数。 nonce不需要以明文形式发送请求。当服务器成功处理消息时,它会说,下次使用此随机数时,前一个消息将变为无效。
Datetime通过确保在特定时间发送消息来阻止重播,nonce通过使用单次使用密码来阻止重播。