【问题标题】:How to prevent a signed request from being used again?如何防止再次使用已签名的请求?
【发布时间】:2012-08-12 18:05:51
【问题描述】:

假设 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 的情况下防止这种情况发生?

【问题讨论】:

    标签: api http rest ssl sniffing


    【解决方案1】:

    记录最近的请求。在此类请求中嵌入时间戳,并拒绝日志中存在或比日志更早的任何请求。为了更好地衡量,请使用私有 md5 校验和对时间戳进行签名,以免它们被伪造。

    【讨论】:

    • 服务器应该允许一些时间差,除非服务器和客户端完全同步。检查日志也可能很复杂。最好为每个请求生成一个随机数(唯一字符串)并检查随机数是否有重复。
    • EJP 的回答是正确的,你应该使用 SSL。这个答案并不安全。通过这种尝试的解决方案,中间人攻击可以轻松拦截消息并将其重播到服务器,同时阻止请求到达服务器。签署时间戳并不能防止这个漏洞。
    【解决方案2】:

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

    如果您不能使用 SSL,请将其从您的标签中删除。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • HMAC 不会阻止 replay 攻击,如果再次播放相同的消息和 HMAC。
      • @Bruno 感谢您指出这一点。我不知道我在想什么。我想包括Cryptographic nonce 可以解决问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多