使用PHP进行签名或API密钥验证

时间:2012-03-13 07:20:53

标签: php api signature

我想为我的一个php应用程序提供API。如何防止未经授权的API访问? 试图为每个注册的客户提供API密钥,但我认为在使用不同的域时可能会失败。 签名验证或API密钥验证背后的想法是什么。请给我一些建议

提前致谢

1 个答案:

答案 0 :(得分:7)

API密钥可用于控制查询率(如果它们可见)。这意味着每个ip每个密钥或类似的东西每分钟不允许超过N个请求。它们不是真正的安全手段,而是身份的手段。

现在,您如何确保该密钥实际上由其所属的用户使用?

这样做的一种方式是请求签名。当您使用一堆参数(a = x& b = y ...)传递请求时,只创建一个签名,客户端和服务器可以创建或验证。这是通过获取参数和值,并创建它们的MD5或SHA1之和,向字符串添加秘密变量或salt来完成的。此变量永远不会在线路上发送,并且仅由https管理控制台对用户可见。但是,请确保在散列之前按字母顺序对参数进行排序!

所以,如果我的参数是:foo=bar&bar=baz,我会对参数字典进行排序,添加秘密$SECRET='asd32efe32ef2df23'并创建:$sig = md5('bar=baz&foo=bar'.$SECRET);然后只需添加&sig={$sig}即可请求。另一方将对参数(不包括sig)执行相同的操作并验证它。

一个好主意是每个会话或每隔一段时间更改一次秘密。这可以使用密码或SSL证书通过HTTPS完成。

编辑:您通常添加的一件事是为了使其更安全,它是一个递增的请求ID,也是通过线路未加密发送的,并用于散列过程。这可以防止两个相同的请求具有相同的签名,并防止重放攻击(攻击者重新发送命令)。当你这样做时,你需要在服务器中允许一些无序请求(即客户端通过命令发送它们,但由于网络速度,你可以在服务器上看到它们为100,102,101)。 / p>