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

Aad*_*adi 0 php api signature

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

提前致谢

Not*_*fer 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).