我有一个Web服务,我正在向用户提供进入我的应用程序数据库并获取一些信息。用户必须注册API密钥并在提出请求时提供。一切正常,但我如何检查注册密钥的用户是否实际提出请求而不是其他人可能已经提供密钥?
在过去的两天里,我一直在考虑提出一个解决方案,但到目前为止还没有。
答案 0 :(得分:12)
您需要使用已签名的请求。基本上它的工作原理如下:
为了避免重放攻击,您还可以在混合中添加随机数和时间戳。 nonce只是一个必须在每个请求上由客户端递增的数字。当您收到请求时,检查您之前是否已收到此nonce / timestamp。如果您这样做,则拒绝该请求(因为它很可能是重播攻击)。如果没有,则将nonce / timestamp存储在数据库中,以便以后查找。
这或多或少是OAuth中请求的签名方式。看一下他们在链接中的例子。
答案 1 :(得分:2)
验证REST API调用有两个部分。当用户注册您的服务时,您通常会分配一个标识该用户的KEY。有时,这就足够了。但是这个KEY可以共享或被盗。在这种情况下,您的服务仍将认为KEY有效。现在,为了防止关键劫持等,您还将分发一个密钥。永远不会使用REST API请求传输此密钥。此密钥用于执行API请求的单向散列,并创建签名(HMAC)。
然后将此签名以及API请求(URL形式的HTTP请求)发送到API服务器。服务器执行URL的单向散列,并使用此用户的私钥与签名进行比较。如果它们匹配,则“假定”请求者可以访问私钥,因此请求有效。
为了避免重放攻击,除了nonce(如前一张海报所示),您还可以使用哈希链接。