我正在编写一个将使用HMAC进行身份验证的Web服务。快速浏览:HMAC是一个消息摘要,使用消息正文和密钥计算。发送方计算HMAC并将其附加到请求中,然后接收方使用它存档的密钥计算接收时的消息摘要。如果摘要相同,则接收者可以确定该消息是由他们自称的人发送的。在计算HMAC时,如何确定HTTP请求参数顺序?
我的问题是关于参数顺序。假设Web服务请求有三个参数,foo,bar和baz。在HTTP POST的身体看起来像:
foo=1&bar=2&baz=3&hmac=de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9
(该HMAC在这种情况下是假的例子)
通常HTTP参数顺序并不显著,但是当涉及到计算散列, 它是。如果服务器接收原始传入请求,请删除“hmac”参数,该参数当然不是散列计算的一部分,并对其进行散列?还是应该有一个必须遵循的参数顺序,才能正确计算哈希值?
前一种方法给服务器端的实现者带来了更多的负担,但它更加健壮。我真正要问的是开发人员在客户端构建事物的期望。他们是否期望不管参数的顺序如何,事情都能正常工作?
这是我采取的方法,唯一的缺点是,与Java您只能获得在原始的请求进行一次拍摄,因此,如果您使用完整的请求体来计算你必须自己提取所有参数的HMAC。 – Rafe