PHP中Web服务身份验证的HMAC实现

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中 在我的服务器上接收

我正在尝试实现一个web服务,需要一些(非常)简单的身份验证来限制对该服务的访问

我发现了HMAC,我想我了解如何实现它。但我有几个问题要问

假设我在消费者端有这个HTML表单。向我的服务器发出GET/POST请求时

  • 足够使用
    密钥创建一个哈希:
    公钥
  • 或者,我是否需要创建整个
    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的最好的解释(简洁而简单)!