2012-08-23 56 views
0

当使用HMAC来验证API调用时,通常要散列的消息包含很多似乎没有添加任何内容的内容。例如,这里有一个API来生成签名的步骤:HMAC消息格式化

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

为什么不干脆像:

hmacsha1(JSON_REQUEST_CONTENT, "secret")

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

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

谢谢!

回答

2

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

如果HMAC只包含有效负载和一个只能防止篡改的秘密,如果我再次发送相同的消息,它将是有效的。通过装饰其他细节(日期时间或特殊情况)的请求来防止重播和篡改。


要使用datetime盐的哈希值,你通常需要与明文消息(虽然它可能从接收或请求发送消息的时间大致推断发送日期时间有效载荷外部的报头)。如果日期时间与服务器认为时间相距太远,则该消息将失败(例如,不在一分钟内)。如果服务器对数据执行相同的散列并且得不到相同的结果,则它也会使该消息失败。

要使用随机数,最实用的方法是服务说,下次您向我发送请求时,请使用此随机数。随机数不需要以明文形式与请求一起发送。当服务器成功处理消息时,它表示,下次使用此随机数时,前一个变为无效。

日期时间通过确保消息在特定时间发送,防止通过使用单个用户密码重播来防止重播。

+0

请问您能解释一下如何比较日期时间或随机数?如果我发送我的日期时间,它可能已经改变了它的服务器。那么你怎么能比较它们呢?谢谢! – tau