我有一个Web服务,我提供给用户打入我的应用程序的数据库,并得到一些信息。 用户必须API密钥注册,并提供发出请求时。 一切工作正常,但我怎么和检查,如果谁注册了一个关键的用户实际上是发出请求不是别人谁,他有可能给钥匙?
我一直在思考的最后两天拿出一个解决方案,但没有那么远。
我有一个Web服务,我提供给用户打入我的应用程序的数据库,并得到一些信息。 用户必须API密钥注册,并提供发出请求时。 一切工作正常,但我怎么和检查,如果谁注册了一个关键的用户实际上是发出请求不是别人谁,他有可能给钥匙?
我一直在思考的最后两天拿出一个解决方案,但没有那么远。
您需要使用签名的请求。 基本上,它的工作原理类似:
为了避免重放攻击,你还可以添加随机数和时间戳混进去。 随机数仅仅是必须通过对每个请求的客户端被递增一个号码。 当你请求,你检查,如果你之前已经收到这个随机数/时间戳。 如果你做到了,你拒绝请求(因为它是最有可能的重放攻击)。 如果没有,你存储在数据库中的随机数/时间戳,这样你可以看看它以后。
这是或多或少的请求是如何在签署的OAuth 。 看看他们中的链接的例子。
有2个部分验证REST API调用。 当用户与您的服务注册,您通常会指定一个键,以识别用户。 有时,这就够了。 但这个KEY可以共享,或被盗。 在这种情况下,您的服务仍然会考虑的关键是有效的。 现在,为了防止关键劫持等也将分发密钥。 该密钥从不与REST API请求运输。 该密钥被用于执行API请求的单向散列,并创建一个签名(HMAC)。
那么这个签名,加上API请求(URL的形式HTTP请求)发送到API服务器。 该服务器执行URL的哈希值的一种方式,并使用该用户的私钥签名进行比较。 如果它们匹配,这是“假设”请求者访问私钥,因此请求是有效的。
为了避免重放攻击,除了随机数(由以前的海报的建议),也可以使用哈希链。