【问题标题】:HMAC Implementation for Web Service Authentication in PHPPHP中Web服务认证的HMAC实现
【发布时间】:2012-07-11 23:00:37
【问题描述】:

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

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

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

  1. 是否足以使用secret_key 创建public_key 的哈希?
  2. 或者,我是否需要创建整个 POST 变量/数组的哈希?

我认为仅发送 public_key 的哈希就足够了,但只是想确认一下并询问你们。

我打算这样做:

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

你的想法?

澄清:public_key 类似于client unique id,我可以使用它来识别secret key 用于在服务器上生成哈希。

【问题讨论】:

  • HMAC 只使用一个共享密钥。它不使用“公共”密钥。你能澄清一下你在说什么吗?
  • 另外,您是否需要防止“中间人”在请求通过网络时对其进行修改?
  • 是的,更改 POST 变量将是一种主动的中间人攻击。
  • 使用 TLS。它解决了这个问题以及许多您甚至还没有想到的问题。
  • 在您考虑推出自己的 hmac 功能之前,请先查看PHP's buildin hash_hmac()

标签: php web-services security authentication hmac


【解决方案1】:

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

当然值得您必须签署所有独特的请求数据,否则有人可能会更改您的请求正文,而您将无法检测到它(MITM 攻击)。 p>

您还应该注意创建一个必须包含在 HMAC 本身中的时间戳,然后将其与请求一起传递。通过这种方式,您可以使签名过期,因此您不会受到重放攻击(有人窃取了请求并且不修改它就将其回复到服务器,多次执行相同的操作......如果它是一个请求为您的服务付费,您的用户会非常生您的气)。

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

因此请始终牢记:对您的请求至关重要的一切都必须是有效的 如果您依赖 HMAC,那么您必须加密信任请求所需的所有内容。

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

【讨论】:

  • 如果我们只使用 hmac 来识别请求未被 MITM 攻击修改。现在如何防止 MITM 读取我们发送的数据?
  • 我今天在网上看到的关于 HMAC 的最佳解释(简洁明了)!
【解决方案2】:

使用 TLS。它解决了这个问题以及许多您甚至还没有想到的问题。

【讨论】:

    猜你喜欢
    • 2012-11-24
    • 2014-04-13
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    相关资源
    最近更新 更多