为什么node.js SHA1主体不同crom GitHub webhook SHA1值?

时间:2015-10-17 09:48:28

标签: node.js github sha1

我多次尝试使用node.js crypto包来计算req.body SHA1值。但总有不同。

我使用以下代码:

var body = req.body;
var sig = 'sha1=' + crypto.createHmac('sha1', secret).update(JSON.stringify(body)).digest('hex');
console.log(sig === req.headers['x-hub-signature']) // not equal :(

var body = req.body;
var sig = 'sha1=' + crypto.createHmac('sha1', secret).update(new Buffer(JSON.stringify(body))).digest('hex');  
console.log(sig === req.headers['x-hub-signature']) //not equal :(

我很感激你能给我的任何帮助!

谢谢:)

1 个答案:

答案 0 :(得分:0)

最后,我知道导致这个问题的原因。 因为,Github将一个字符串发布到我的服务器上,Github将这个字符串的SHA1值设置为。但是使用我的nodejs代码,我使用body-parser包作为中间件,所以我得到了

{  
  payload: {...}  
}  

和SHA1,因此,永远不会相等。

现在,我们知道原因,我们可以解决这个问题。刚

  var bufferArr = [];
  var bufferLen = 0;
  req.on('data', function(chunk) {
    bufferArr.push(chunk);
    bufferLen += chunk.length;
  });
  req.on('end', function() {
    var data = Buffer.concat(bufferArr, bufferLen).toString();
    var sig = 'sha1=' + crypto.createHmac('sha1', secret)
        .update(data).digest('hex');
    console.log(sig === req.headers['x-hub-signature']) // true
  }

我希望我的经验可以帮助别人