为了保护 RESTful API,我为每个调用考虑了以下身份验证过程:
- 所有数据均经过 SSL 加密
- 客户端发出的每个 HTTP 请求都会有一个签名,例如
sha512(keysort(POSTDATA.push({"secret": API_SECRET, "timestamp": utc_time()}))
- 服务器也知道客户端 API_SECRET 并检查签名是否与客户端发送的签名匹配。如果是这种情况,则请求是合法的并将被处理。
我在这里面临的问题如下 - 由于 API 将由 iPhone 应用程序以及 WebApp 调用,我想不出一种不传输 API_SECRET 一次的方法。因此,假设用户登录,发送 username=john&password=doe(SSL 加密)并从服务器接收到 API_SECRET 作为响应。然后,此 API_SECRET 将由客户端存储并用于签署所有进一步的 API 调用。
我正在使用签名来降低 MITM 攻击的风险,但是如果我在似乎有问题时转移密钥,但我想不出解决这个问题的方法。
谢谢你的帮助!