2011-12-01 35 views
3

我正在编写一个将使用HMAC进行身份验证的Web服务。快速浏览:HMAC是一个消息摘要,使用消息正文和密钥计算。发送方计算HMAC并将其附加到请求中,然后接收方使用它存档的密钥计算接收时的消息摘要。如果摘要相同,则接收者可以确定该消息是由他们自称的人发送的。在计算HMAC时,如何确定HTTP请求参数顺序?

我的问题是关于参数顺序。假设Web服务请求有三个参数,foo,bar和baz。在HTTP POST的身体看起来像:

foo=1&bar=2&baz=3&hmac=de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9 

(该HMAC在这种情况下是假的例子)

通常HTTP参数顺序并不显著,但是当涉及到计算散列, 它是。如果服务器接收原始传入请求,请删除“hmac”参数,该参数当然不是散列计算的一部分,并对其进行散列?还是应该有一个必须遵循的参数顺序,才能正确计算哈希值?

前一种方法给服务器端的实现者带来了更多的负担,但它更加健壮。我真正要问的是开发人员在客户端构建事物的期望。他们是否期望不管参数的顺序如何,事情都能正常工作?

回答

0

我要说的是,后操纵请求的身体,你已经计算出基于该机构,这是该请求是否被接受显著的哈希,通常是不好的做法(对于这一点,我觉得原因,是明显)。该HMAC不应附加到请求正文,而是设置GET参数,cookie或自定义标题。

这也为您的第一个建议减少了burden on the implementor on the server side,这是我建议的路径。

但是,这是我,其他人可能会对这一切不同意见......

+0

这是我采取的方法,唯一的缺点是,与Java您只能获得在原始的请求进行一次拍摄,因此,如果您使用完整的请求体来计算你必须自己提取所有参数的HMAC。 – Rafe