如何防止再次使用已签名的请求?

问题描述:

假设Bob发送该HTTP请求的API来更新他的电子邮件:如何防止再次使用已签名的请求?

/user/[email protected]&userid=1234&sig=x1zz645

现在,一个名为Zerocool嗅探器记录以备后用此请求。

几天后,鲍勃再次将他的电子邮件更新为[email protected]

几个小时后Zerocool现在决定用什么,他闻了闻,前几天和运行要求:

/user/[email protected]&userid=1234&sig=x1zz645

服务器接受它,而Bob是现在困惑,为什么是旧的电子邮件回来。

如何在不使用SSL的情况下防止这种情况发生?

保留最近请求的日志。在此类请求中嵌入时间戳,并拒绝日志中或日志以前的任何内容。为了更好的衡量,请使用私人md5校验和签名时间戳,以免造成错误。

+0

服务器应该允许一些时间差,除非服务器和客户端完全同步。检查日志也可能很复杂。最好每个请求都生成一个随机数(唯一字符串),并检查随机数是否有重复。 – 2013-04-04 12:25:12

+0

EJP的答案是正确的,你应该使用SSL。这个答案是不安全的。有了这个尝试的解决方案,在中间人攻击可以很容易地截取邮件,并将其重播到服务器,同时防止请求到达服务器。签署时间戳没有任何措施来防止这个漏洞。 – user1678406 2014-05-21 20:30:14

按照您的标签中所述使用SSL。它对嗅探和重放攻击都是免疫的。它存在。使用它是免费的。有用。完成。

如果您不能使用SSL,请将其从您的代码中移除。

您可以使用Hash based message authentication code (HMAC)来确保API 的安全,以避免类似于您所提及的重播攻击。 服务器和客户端都有一个共享的秘密API密钥。

Amazon S3 Rest API使用相同的过程来验证和验证请求。请参阅文档here.

更新:由于布鲁诺指出HMAC本身无法防止重放攻击。您必须在消息中包含一些使用密钥签名的唯一标识符,并在服务器上对其进行验证。

+2

如果再次播放相同的消息和HMAC,则HMAC不会阻止*重放*攻击。 – Bruno 2012-08-13 09:47:18

+0

@布鲁诺谢谢你指出。我不知道我在想什么。我想包括[加密随机](http://en.wikipedia.org/wiki/Cryptographic_nonce)可以解决问题。 – Obaid 2012-08-13 09:57:43