我有一个 Web 服务,我提供给用户使用我的应用程序数据库并获取一些信息。用户必须注册 API key 并在提出请求时提供该 key 。一切正常,但我如何检查注册 key 的用户是否真正提出请求,而不是他可能已将 key 提供给的其他人?

过去两天我一直在考虑想出一个解决方案,但到目前为止还没有。

最佳答案

您需要使用签名的请求。基本上它是这样工作的:

  • 你给你的用户一个 API key 和一个只有你和客户知道的“ secret ”(一个随机字符串)。
  • 每当他们提出请求时,他们都会为其添加一个“签名”参数。这个签名基本上是请求参数+API key +其他参数(见下文)+ secret 的散列。
  • 因为你也知道这个 secret ,所以你可以验证签名是否正确。

  • 为避免重放攻击,您还可以在混合中添加随机数和时间戳。 nonce 只是一个数字,必须由客户端在每次请求时递增。当您收到请求时,您会检查您之前是否已经收到过此随机数/时间戳。如果您这样做了,您将拒绝该请求(因为这很可能是重放攻击)。如果没有,您将随机数/时间戳存储在您的数据库中,以便您以后可以查找它。

    这或多或少是在 OAuth 中签署请求的方式。在链接中查看他们的示例。

    10-07 19:28
    查看更多