【问题标题】:How to validate a webhook signature using python and openssl如何使用 python 和 openssl 验证 webhook 签名
【发布时间】:2016-05-30 21:49:52
【问题描述】:

我正在尝试验证传入的 webhook,但目前生成的哈希与 api 生成的测试哈希不匹配。

文档列出了以下 Ruby 示例,但我使用的是 Python/Django,因此任何“转换”此函数的帮助将不胜感激!

Ruby 函数

# request_signature - the signature sent in Webhook-Signature
#      request_body - the JSON body of the webhook request
#            secret - the secret for the webhook endpoint

require "openssl"

digest = OpenSSL::Digest.new("sha256")
calculated_signature = OpenSSL::HMAC.hexdigest(digest, secret, request_body)

if calculated_signature == request_signature
  # Signature ok!
else
  # Invalid signature. Ignore the webhook and return 498 Token Invalid
end

到目前为止,这大致是我自己使用https://docs.python.org/3/library/hashlib.html 整理出来的。

Python 尝试

import hashlib

secret = "xxxxxxxxxxxxxxxxxx"
json_data = {json data}

h = hashlib.new('sha256')
h.update(secret)
h.update(str(json_data))
calculated_signature = h.hexdigest()

if calculated_signature == webhook_signature:
    do_something()
else:
    return 498

当我运行上述代码时,由于我的 Python 实现不正确,哈希值明显不匹配。

任何帮助/指针将不胜感激!

【问题讨论】:

    标签: python django openssl webhooks


    【解决方案1】:

    我认为应该是这样的:

    import hmac
    import hashlib
    digester = hmac.new(secret, request_body, hashlib.sha256)
    calculated_signature = digester.hexdigest()
    

    一些注意事项:

    1. 使用实际的请求正文。不要依赖str(json_data) 等于请求正文。这几乎肯定会失败,因为 python 将使用repr 打印出内部字符串,这可能会留下一堆实际上不在响应中的虚假u"..."json.dumps 不一定会做得更好,因为可能存在对 JSON 无关紧要但对 hmac 签名非常重要的空白差异。
    2. hmac 是你的朋友 :-)

    【讨论】:

    • 感谢您的快速回答,我试一试,让您知道我的进展!
    • 嗨,我刚刚开始测试这个,但它不喜欢 json 主体。如果我不将它作为给出不正确哈希的字符串传递,它会给出“TypeError:必须是字符串或缓冲区,而不是 dict”。
    • 当我说请求体时,我指的是实际请求体——不是请求体中解码的json。在典型情况下,您的 Web 框架可能会“隐藏”正文并只为您提供解码的 JSON(它可能实际上并未隐藏,只是不常用......)。我不是 django 用户,所以我不知道如何访问您正在寻找的“原始”数据......您如何从请求中获取请求正文?
    • 这就是问题所在,我传递的是 json 数据,而不是 request.body。现在可以享用了,谢谢!
    • 你是如何获得 request.body 的?我尝试了requests.data,但仍然没有得到正确的 hmac...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2020-06-11
    • 2018-03-09
    • 2020-08-22
    • 2014-05-04
    • 1970-01-01
    • 2017-03-24
    相关资源
    最近更新 更多