Github推送事件签名don't match

Github push event signature don't match

本文关键字:match don 事件 Github      更新时间:2023-09-26

我正在为GitHub编写Webhook,并在KOA.js中实现安全验证:

function sign(tok, blob) {
  var hmac;
  hmac = crypto
    .createHmac('sha1', tok)
    .update(blob)
    .digest('hex');
  return 'sha1=' + hmac;
}
...
key = this.request.headers['x-hub-signature'];
blob = JSON.stringify(this.request.body);
if (!key || !blob) {
  this.status = 400;
  this.body = 'Bad Request';
}
lock = sign(settings.api_secret, blob);
if (lock !== key) {
  console.log(symbols.warning, 'Unauthorized');
  this.status = 403;
  this.body = 'Unauthorized';
  return;
}
...

对于pull_requests和create事件,这个工作正常,甚至push新的分支工作,但是对于push提交事件,x-hub-signature和从负载计算的哈希不匹配,所以它总是得到403 unauthorized。

我注意到对于这种推送有效负载,提交和head_commit被添加到有效负载中。我试过从主体中删除提交和head_commit,但它不起作用。

有关更多信息,请查看这些示例有效负载。我还包含了测试repo的url和令牌信息:https://gist.github.com/marcoslhc/ec581f1a5ccdd80f8b33

Crypto hash.update()的默认编码是二进制的,详见Node JS Crypto的答案,不能在带有重音的字符上创建hmac。这导致您的推事件有效载荷的问题,其中包含字符U+00E1 拉丁小写字母a与急性Hernández四次,GitHub服务是哈希有效载荷作为utf-8编码。请注意,您的Gist在ISO-8859-1中显示了这些错误编码,因此还要确保您正在正确处理传入请求的字符编码(但这应该在默认情况下发生)。

要解决这个问题,您需要使用Buffer:

hmac = crypto.createHmac('sha1', tok).update(new Buffer(blob, 'utf-8')).digest('hex');

…或者直接将编码传递给update:

hmac = crypto.createHmac('sha1', tok).update(blob, 'utf-8').digest('hex');

计算7f9e6014b7bddf5533494eff6a2c71c4ec7c042d的正确哈希值