2013-07-29 128 views
2

讓我開始說我不是密碼算法的專家...CryptoJS(HMAC Sha256)給出錯誤的輸出?

我想建立一個格式爲Windows Azure HTTP頭的方法 - 這個頭需要部分消息通過加密通過HMAC與SHA256(然後還base64編碼)。

我選擇使用CryptoJS,因爲它有一個活躍的用戶社區。

首先,我的代碼:

_encodeAuthHeader : function (url, params, date) { 
    //http://msdn.microsoft.com/en-us/library/windowsazure/dd179428 
    var canonicalizedResource = '/' + this.getAccountName() + url; 

    /* 
    StringToSign = Date + "\n" + CanonicalizedResource 
    */ 
    var stringToSign = date + '\n' + canonicalizedResource; 
    console.log('stringToSign >> ' + stringToSign) 

    var encodedBits = CryptoJS.HmacSHA256(stringToSign, this.getAccessKey()); 
    console.log('encodedBits >> ' + encodedBits); 

    var base64Bits = CryptoJS.enc.Base64.stringify(encodedBits); 
    console.log('base64Bits >> ' + base64Bits); 

    var signature = 'SharedKeyLite ' + this.getAccountName() + ':' + base64Bits; 
    console.log('signature >> ' + signature); 

    return signature; 
}, 

的方法成功地返回一個「簽名」與加密的適當片/編碼。但是,Azure抱怨格式不正確。

一些示例輸出:

stringToSign >> Mon, 29 Jul 2013 16:04:20 GMT\n/senchaazurestorage/Tables 

encodedBits >> 6723ace2ec7b0348e1270ccbaab802bfa5c1bbdddd108aece88c739051a8a767 

base64Bits >> ZyOs4ux7A0jhJwzLqrgCv6XBu93dEIrs6IxzkFGop2c= 

signature >> SharedKeyLite senchaazurestorage:ZyOs4ux7A0jhJwzLqrgCv6XBu93dEIrs6IxzkFGop2c= 

做一些調試,我注意到,CryptoJS沒有返回相同的值(HMAC SHA256帶)作爲替代實施方式。例如,字符串 「星期一,2013年7月29日16時04分20秒GMT \ N/senchaazurestorage /桌子」 顯示爲:

  • 6723ace2ec7b0348e1270ccbaab802bfa5c1bbdddd108aece88c739051a8a767」 經由CryptoJS
  • faa89f45ef029c63d04b8522d07c54024ae711924822c402b2d387d05398fc9f」通過PHP hash_hmac('sha256',...)

挖掘更深入,我看到大多數HMAC/SHA265算法返回的數據匹配從PHP輸出...我錯過了CryptoJS的東西?還是有合法的區別?

+0

在更多的調試中......似乎在我的消息中使用了「\ n」(換行符)就是CryptoJS的殺手。有任何想法嗎?我認爲Azure要求。 – arthurakay

回答

0

正如我在第一條評論中提到的,換行符(「\ n」)導致了問題。轉義(「\ n」,沒有空格)似乎已經解決了HMAC/SHA256輸出中的不一致問題。

我仍然遇到Azure HTTP「授權」標題問題,但這是另一個問題。