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

时间:2012-07-11 23:00:37

标签: php web-services security authentication hmac

我正在尝试实现一项Web服务,并且需要一些(非常)简单的Authenticate来限制对服务的访问。

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

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

  1. 是否足以使用public_key
  2. 创建:secret_key哈希值
  3. 或者,我是否需要创建整个POST变量/数组的哈希值?
  4. 我认为只发送public_key的哈希就足够了,但只是想确认并问你们。

    我打算这样做:

    1. 创建public_key
    2. 的哈希值
    3. 将哈希值作为参数与public_key(或client_id)以及其他POST / GET变量一起放在隐藏字段或URL中。
    4. 通过使用public_key重新创建secret_key的哈希值,在我的服务器上接收并验证数据库的哈希值。
    5. 如果哈希匹配,我接受POST / GET请求。
    6. 你的想法?

      澄清: public_keyclient unique id类似,我可以用它来确定用于在服务器上生成哈希的secret key

2 个答案:

答案 0 :(得分:6)

pubkey仅用作识别用户的替代方法。它也可能是用户电子邮件,顺便说一句,因为您不希望将用户数据暴露给程序员(或潜在的嗅探器),因此您为每个用户创建了唯一的标识符。这就是它的意思。然后你需要一个私钥来签署你的哈希值。

当然为了让它值得你拥有来签署所有唯一的请求数据,否则有人可能会改变你的请求体,你将无法检测到它(MITM攻击)。

您还应该创建一个必须包含在HMAC中的时间戳,然后将其与请求一起传递。通过这种方式,您可以使签名过期,因此您不会受到重播攻击(有人窃取请求而不修改请求会对服务器进行回复,操作多次相同的操作...如果是请求,请考虑问题是什么?支付你的服务,你的用户会非常生气你。)

如果您正在使用RESTful Web服务,还要记住(没有人)加密HMAC本身内部的Request-URI以及HTTP方法(也就是动词),否则恶意用户将能够将请求发送给其他人URI或(使用RESTful服务)会更改请求的含义,因此有效的GET可能会成为潜在的DELETE。 一个例子可能是:用户希望查看其所有数据,发出GET请求,中间人阅读请求并使用DELETE更改GET。如果您的HMAC中没有可以查看的内容,则您没有机会检测到某些内容已被更改,因此您收到DELETE请求并繁荣!您销毁所有用户数据。

所以请永远记住:您的请求必不可少的一切必不可少 如果您依赖HMAC,那么您必须加密您信任请求所需的一切。

还要记住通过拒绝所有请求来开始设计系统,然后如果您可以验证它们执行请求的操作。通过这种方式,您可以始终依赖拒绝的请求。最好让用户电子邮件告诉您他不能做一些让您的用户数据在网络上传播的内容。

答案 1 :(得分:2)

使用TLS。它解决了这个以及你还没有想到的一系列问题。