无法在我的应用程序中验证GitHub X-Hub-Signature

时间:2015-01-30 02:42:46

标签: python git github

我使用GitHub作为我的代码存储库。我为一个存储库创建了一个webhook,因此当任何代码更改被推送到此存储库时,GitHub会通知我的应用程序编译代码。在我的应用程序中编译代码之前,我需要在GitHub请求中验证X-Hub-Signature,这是我在python中所做的。我发现我使用密钥计算的签名和有效负载总是与GitHub提供的签名不匹配。对此有何想法?谢谢!

import hmac
import hashlib
import pickle

def compile_code(request):
    payload = pickle.dumps(request.DATA)
    signature = hmac.new(APP_KEY, payload, hashlib.sha1).hexdigest()
    if signature == request.META.get('X-Hub-Signature'):
        do_compile_code()
    else:
        ...

3 个答案:

答案 0 :(得分:5)

最后正确的方法是

signature = 'sha1=' + hmac.new(APP_KEY, request.body, hashlib.sha1).hexdigest()
if signature == request.META.get('HTTP_X_HUB_SIGNATURE'):
    do_something()

答案 1 :(得分:1)

为什么要腌制数据然后用它来计算HMAC?

取出酸洗步骤并使用通知中提供的request.DATA,它应该有效:

signature = hmac.new(APP_KEY, request.DATA, hashlib.sha1).hexdigest()

(我假设request.DATA包含HTTP POST的主体,可能是它的JSON)

答案 2 :(得分:1)

hmac.compare_digest示例:

def is_valid_signature(self):
    x_hub_sig = hmac.new(
        self.github_hook_secret,
        self.request.body,
        hashlib.sha1
    ).hexdigest()

    return hmac.compare_digest(
        x_hub_sig,
        self.x_hub_signature
    )

def dispatch(self):
    self.github_hook_secret = 'some-secret'
    self.x_hub_signature = self.request.headers.get('X-Hub-Signature').replace('sha1=', '')