CryptoJS(HMAC Sha256)输出错误?

时间:2013-07-29 16:21:25

标签: azure-storage hmac cryptojs

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

我正在尝试构建一种为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,2013年7月29日16:04:20 GMT \ n / senchaazurestorage / Tables ”显示为:

  • 6723ace2ec7b0348e1270ccbaab802bfa5c1bbdddd108aece88c739051a8a767 ”via CryptoJS
  • faa89f45ef029c63d04b8522d07c54024ae711924822c402b2d387d05398fc9f ”通过PHP hash_hmac('sha256',...)

更深入地挖掘,我发现大多数HMAC / SHA265算法返回的数据与PHP的输出相匹配...我在CryptoJS中遗漏了什么?或者是否有合理的区别?

1 个答案:

答案 0 :(得分:1)

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

我仍然遇到Azure HTTP“授权”标题的问题,但这是另一个问题。