繁体   English   中英

HMAC在PHP中进行Web服务认证的实现

[英]HMAC Implementation for Web Service Authentication in PHP

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

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

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

  1. 是足以创造的哈希: public_key使用secret_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

pubkey仅用作识别用户的替代方法。 顺便说一句,它也可能是用户电子邮件,因为您不希望将用户数据公开给他们的程序员(或潜在的嗅探者),所以您要为每个用户创建一个唯一的标识符。 这就是全部。 然后,您需要一个私钥来对您的哈希签名。

当然,要使其物有所值,您必须对所有唯一的请求数据进行签名,否则有人可以更改您的请求正文,而您将无法检测到它(MITM攻击)。

您还应该注意创建必须包含在HMAC本身中的时间戳,然后将其与请求一起传递。 这样,您就可以使签名失效,这样您就不会受到重放攻击(有人窃取了该请求,并且未经修改就对服务器进行了回复,多次执行相同的操作……如果这是对服务器的请求,请考虑有什么问题)为您的服务付费,您的用户会对您非常生气)。

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

因此请始终记住: 对您的请求至关重要的所有内容都必须是有效的,并且如果您依赖HMAC,则必须对信任请求所需要的所有内容进行加密。

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

使用TLS。 它可以解决此问题以及您甚至尚未想到的许多问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM