我有一个网络服务,可供用户访问我的应用程序数据库并获取一些信息。用户必须注册 API 密钥并在提出请求时提供该密钥。一切正常,但我如何检查注册密钥的用户是否确实发出请求,而不是他可能已向其提供密钥的其他人?
这两天我一直在思考解决方案,但目前还没有任何结果。
您需要使用签名的请求。基本上它的工作原理是这样的:
- 您为您的用户提供一个 API 密钥and只有您和客户知道的“秘密”(随机字符串)。
- 每当他们发出请求时,他们都会添加一个“签名”参数。该签名基本上是请求参数 + API 密钥 + 其他参数(见下文)+ 秘密的哈希值。
- 由于您也知道这个秘密,因此您可以验证签名是否正确。
为了避免重放攻击,您还可以添加随机数和时间戳。随机数只是一个必须由客户端在每次请求时递增的数字。当您收到请求时,您会检查您之前是否已经收到过此随机数/时间戳。如果这样做,您将拒绝该请求(因为这很可能是重播攻击)。如果没有,您可以将随机数/时间戳存储在数据库中,以便稍后查找。
这或多或少就是请求的登录方式OAuth http://oauth.net/core/1.0/#signing_process。在链接中查看他们的示例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)