首先让我说我不是密码算法方面的专家......
我正在尝试构建一种为 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 没有返回相同的值(带有 SHA256 的 HMAC)作为替代实现。例如,字符串“ Mon, 29 Jul 2013 16:04:20 GMT\n/senchaazurestorage/Tables ”显示为:
- “ 6723ace2ec7b0348e1270ccbaab802bfa5c1bbdddd108aece88c739051a8a767 ” 通过 CryptoJS
- “ faa89f45ef029c63d04b8522d07c54024ae711924822c402b2d387d05398fc9f ” 通过 PHP hash_hmac('sha256', ... )
更深入地挖掘,我看到大多数 HMAC/SHA265 算法返回的数据与 PHP 的输出相匹配……我在 CryptoJS 中遗漏了什么吗?还是有合法的区别?