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

时间:2012-08-12 18:05:52

标签: api http rest ssl sniffing

假设Bob将此HTTP请求发送到API以更新其电子邮件:

/user/update?email=bob@example.com&userid=1234&sig=x1zz645

现在,名为Zerocool的嗅探器记录了此请求以供日后使用。

几天后,Bob再次将他的电子邮件更新为email=newbob@example.com

几个小时后,Zerocool现在决定使用他几天前嗅到的东西并运行请求:

/user/update?email=bob@example.com&userid=1234&sig=x1zz645

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

如果不使用SSL,我们如何防止这种情况发生?

3 个答案:

答案 0 :(得分:2)

记录最近的请求。在这些请求中嵌入时间戳,并拒绝日志中存在的任何日志或旧日志。为了更好地衡量,请使用私有md5校验和对时间戳进行签名,这样它们就无法制作。

答案 1 :(得分:0)

使用标签中所述的SSL。它已经不受嗅探和重放攻击的影响。它存在。使用它是免费的。有用。已经完成了。

如果您无法使用SSL,请将其从您的代码中删除。

答案 2 :(得分:0)

您可以使用Hash based message authentication code (HMAC)来保护API ,以便可以避免像您提到的那样的重放攻击。服务器和客户端都将拥有共享密钥API密钥。

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

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