【问题标题】:Why is node.js SHA1 body different crom GitHub webhook SHA1 value?为什么 node.js SHA1 body 与 crom GitHub webhook SHA1 值不同?
【发布时间】:2015-10-17 09:48:27
【问题描述】:

我已经尝试过多次使用 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 :(

如果您能给我任何帮助,我将不胜感激!

谢谢:)

【问题讨论】:

    标签: node.js github sha1


    【解决方案1】:

    最后,我知道导致此问题的原因。 因为,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
      }
    

    希望我的经验可以帮助到其他人

    【讨论】:

      猜你喜欢
      • 2016-09-05
      • 2013-06-25
      • 1970-01-01
      • 2011-10-26
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 2017-08-16
      相关资源
      最近更新 更多