首先让我说我不是加密算法方面的专家......
我正在尝试构建一种为Windows Azure格式化HTTP标头的方法 - 此标头要求其部分消息通过HMAC使用SHA256加密(然后也是base64编码)。
我选择使用CryptoJS,因为它有一个活跃的用户社区。 p>
首先,我的代码:
_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没有返回相同的值(带有SHA256的HMAC)作为替代实现。例如,字符串“ Mon,2013年7月29日16:04:20 GMT \ n / senchaazurestorage / Tables ”显示为:
更深入地挖掘,我发现大多数HMAC / SHA265算法返回的数据与PHP的输出相匹配...我在CryptoJS中遗漏了什么?或者是否有合理的区别?
答案 0 :(得分:1)
正如我在第一篇评论中所提到的,换行符(“\ n”)引起了问题。转义(“\ \ n”,中间没有空格)似乎修复了HMAC / SHA256输出中的不一致。
我仍然遇到Azure HTTP“授权”标题的问题,但这是另一个问题。