讓我開始說我不是密碼算法的專家...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的東西?還是有合法的區別?
在更多的調試中......似乎在我的消息中使用了「\ n」(換行符)就是CryptoJS的殺手。有任何想法嗎?我認爲Azure要求。 – arthurakay