【发布时间】:2013-07-29 13:00:54
【问题描述】:
首先让我说我不是密码算法方面的专家...
我正在尝试构建一种方法来格式化 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, 29 Jul 2013 16:04:20 GMT\n/senchaazurestorage/Tables”显示为:
- “6723ace2ec7b0348e1270ccbaab802bfa5c1bbdddd108aece88c739051a8a767”通过 CryptoJS
- “faa89f45ef029c63d04b8522d07c54024ae711924822c402b2d387d05398fc9f”通过 PHP hash_hmac('sha256', ... )
更深入地挖掘,我看到大多数 HMAC/SHA265 算法返回的数据与 PHP 的输出相匹配……我在 CryptoJS 中遗漏了什么吗?还是有合理的区别?
【问题讨论】:
-
在更多的调试中......似乎在我的消息中包含“\n”(换行符)是杀死 CryptoJS 的原因。有任何想法吗?我认为 Azure 需要。
标签: azure-storage hmac cryptojs