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

ucd*_*eam 2 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:
        ...
Run Code Online (Sandbox Code Playgroud)

ucd*_*eam 5

最后正确的方法是

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

  • 嘿,首先感谢您发布使用的解决方案。我知道这太老了,但是对于将来的那些人,不要使用`==`进行比较,而是使用“ compare_digest”进行比较。我在hmac的文档中看到了类似以下的警告。>警告在验证例程中将hexdigest()的输出与外部提供的摘要进行比较时,建议使用compare_digest()函数而不是==运算符来减少定时攻击的脆弱性。 (2认同)

chm*_*der 5

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=', '')
Run Code Online (Sandbox Code Playgroud)


mha*_*wke 1

为什么要对数据进行 pickle,然后用它计算 HMAC?

取出酸洗步骤并request.DATA按照通知中提供的方式使用,它应该可以工作:

signature = hmac.new(APP_KEY, request.DATA, hashlib.sha1).hexdigest()
Run Code Online (Sandbox Code Playgroud)

(我假设request.DATA包含 HTTP POST 的正文,可能是 JSON)