PHP中Web服务身份验证的HMAC实现
我正在尝试实现一个web服务,需要一些(非常)简单的身份验证来限制对该服务的访问 我发现了HMAC,我想我了解如何实现它。但我有几个问题要问 假设我在消费者端有这个HTML表单。向我的服务器发出GET/POST请求时PHP中Web服务身份验证的HMAC实现,php,web-services,security,authentication,hmac,Php,Web Services,Security,Authentication,Hmac,我正在尝试实现一个web服务,需要一些(非常)简单的身份验证来限制对该服务的访问 我发现了HMAC,我想我了解如何实现它。但我有几个问题要问 假设我在消费者端有这个HTML表单。向我的服务器发出GET/POST请求时 足够使用密钥创建一个哈希:公钥 或者,我是否需要创建整个POST变量/数组的散列 我想只发送公钥的散列就足够了,但我只是想确定一下,然后问你们 我正计划这样做: 创建公钥的散列 将哈希作为参数与公钥(或客户机id)和其他POST/GET变量放在隐藏字段或URL中 在我的服务器上接收
密钥创建一个哈希:公钥
POST
变量/数组的散列公钥的散列就足够了,但我只是想确定一下,然后问你们
我正计划这样做:
创建公钥的散列
将哈希作为参数与公钥(或客户机id)和其他POST/GET变量放在隐藏字段或URL中
在我的服务器上接收,并通过使用密钥
重新创建公钥
的哈希值,根据数据库验证哈希值
如果哈希匹配,我接受POST/GET请求
你的想法
澄清:public\u key
类似于客户端唯一id
,我可以用它来识别用于在服务器上生成哈希的密钥。使用TLS。它解决了这一问题和许多你还没有想到的问题。公钥只是作为识别用户的一种替代方法。顺便说一句,它也可能是用户的电子邮件,因为您可能不想向他们的程序员(或潜在的嗅探器)公开您的用户数据,所以您为每个用户创建一个唯一的标识符。这就是它的全部意思。然后你需要一个私钥来签署你的散列
当然,为了使其值得,您必须签署所有唯一的请求数据,否则有人可能会更改您的请求正文,而您将无法检测到它(MITM攻击)
您还应该注意创建一个必须包含在HMAC本身中的时间戳,然后将其与请求一起传递。通过这种方式,您可以使签名过期,这样您就不会受到重播攻击(有人窃取请求,而不修改请求,对服务器进行答复,多次执行相同的操作……想想看,如果请求为您的服务付费,您的用户会对您非常生气)
还请记住(没有人这样做),如果您使用的是RESTful Web服务,请同时加密HMAC本身内部的请求URI和HTTP方法(也称为动词),否则恶意用户将能够将请求发送到其他URI或(使用RESTful服务)更改您请求的含义,因此有效的GET可能成为潜在的删除。
一个例子可以是:用户希望看到所有的数据,发出一个GET请求,中间的一个人读取请求,并用Delphi进行更改。如果某个内容不在您的HMAC中,您没有机会检测到它已被更改,因此您会收到一个删除请求并发出提示!销毁所有用户数据
因此,请始终记住:对您的请求至关重要的一切都必须是有效的
如果您依赖HMAC,则必须加密信任请求所需的所有内容
另外,请始终记住,在设计系统时,首先要拒绝所有请求,然后如果可以验证它们,请执行请求的操作。这样,您总是依赖于被拒绝的请求。最好有一封用户电子邮件告诉你,他不能做让你的用户数据在网上传播的事情。HMAC只使用一个共享秘密。它不使用“公钥”。你能澄清一下你在说什么吗?另外,你是否需要防止“中间人”在请求通过网络时修改请求?是的,更改POST变量将是一种活跃的中间人攻击。使用TLS。它修复了这一问题以及许多您甚至还没有想到的问题。在您考虑使用自己的hmac功能之前,请先看看我们是否仅使用hmac来确定请求未被MITM攻击修改。现在如何防止MITM读取我们发送的数据?这是我今天在互联网上读到的关于HMAC的最好的解释(简洁而简单)!