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


Signature or API Key validation using PHP

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

提前感谢

neneneba 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)进行同样的操作并对其进行验证

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

编辑:您通常会添加一个使其更安全的东西,即递增的请求id,该请求id也通过网络未加密发送,并在哈希过程中使用。这可以防止两个相同的请求具有相同的签名,并防止重放攻击(攻击者重新发送命令)。当您这样做时,您需要在服务器中为无序请求留出一些宽限期(即客户端按顺序发送请求,但由于网络速度的原因,您可以在服务器上看到它们为100、102、101)。