如何防止再次使用已签名的请求?
问题描述:
假设Bob发送该HTTP请求的API来更新他的电子邮件:如何防止再次使用已签名的请求?
/user/[email protected]&userid=1234&sig=x1zz645
现在,一个名为Zerocool嗅探器记录以备后用此请求。
几天后,鲍勃再次将他的电子邮件更新为[email protected]
。
几个小时后Zerocool现在决定用什么,他闻了闻,前几天和运行要求:
/user/[email protected]&userid=1234&sig=x1zz645
服务器接受它,而Bob是现在困惑,为什么是旧的电子邮件回来。
如何在不使用SSL的情况下防止这种情况发生?
答
保留最近请求的日志。在此类请求中嵌入时间戳,并拒绝日志中或日志以前的任何内容。为了更好的衡量,请使用私人md5校验和签名时间戳,以免造成错误。
答
按照您的标签中所述使用SSL。它对嗅探和重放攻击都是免疫的。它存在。使用它是免费的。有用。完成。
如果您不能使用SSL,请将其从您的代码中移除。
答
您可以使用Hash based message authentication code (HMAC)来确保API
的安全,以避免类似于您所提及的重播攻击。
服务器和客户端都有一个共享的秘密API密钥。
Amazon S3 Rest API使用相同的过程来验证和验证请求。请参阅文档here.
更新:由于布鲁诺指出HMAC本身无法防止重放攻击。您必须在消息中包含一些使用密钥签名的唯一标识符,并在服务器上对其进行验证。
服务器应该允许一些时间差,除非服务器和客户端完全同步。检查日志也可能很复杂。最好每个请求都生成一个随机数(唯一字符串),并检查随机数是否有重复。 – 2013-04-04 12:25:12
EJP的答案是正确的,你应该使用SSL。这个答案是不安全的。有了这个尝试的解决方案,在中间人攻击可以很容易地截取邮件,并将其重播到服务器,同时防止请求到达服务器。签署时间戳没有任何措施来防止这个漏洞。 – user1678406 2014-05-21 20:30:14