3

首先让我说我不是密码算法方面的专家......

我正在尝试构建一种为 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 中遗漏了什么吗?还是有合法的区别?

4

1 回答 1

1

正如我在第一条评论中提到的,换行符 ("\n") 引起了问题。转义(“\ \n”,中间没有空格)似乎已经修复了 HMAC/SHA256 输出中的不一致问题。

Azure HTTP“授权”标头仍然存在问题,但这是另一个问题。

于 2013-07-29T19:53:39.587 回答