2011-12-01 71 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