【问题标题】:Failed to verify GitHub X-Hub-Signature in my application无法在我的应用程序中验证 GitHub X-Hub-Signature
【发布时间】:2015-01-30 02:42:45
【问题描述】:

我使用 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:
        ...

【问题讨论】:

    标签: python git github


    【解决方案1】:

    终于正确的方法是

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

    【讨论】:

    • 嘿,首先感谢您发布您使用的解决方案。我知道这是非常古老的,但对于未来的人来说,不要使用== 而是使用compare_digest 进行比较。我在hmac 的文档中看到了类似以下的警告。 > 警告在验证例程期间将 hexdigest() 的输出与外部提供的摘要进行比较时,建议使用 compare_digest() 函数而不是 == 运算符,以减少对定时攻击的脆弱性。
    • 谁能告诉我如何在springboot应用中获取request.body。
    【解决方案2】:

    以 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=', '')
    

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • 我试过你的方法,但得到一个错误“TypeError: must be string or buffer, not dict”
      • 您提供了一个 dict 对象作为 APP_KEYrequest.DATA(很可能是后者)。使用json 库将dict 转换为str 对象。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 2013-06-17
      • 1970-01-01
      • 2020-11-25
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      相关资源
      最近更新 更多