编程语言
首页 > 编程语言> > 如何使用python和openssl验证Webhook签名

如何使用python和openssl验证Webhook签名

作者:互联网

我正在尝试验证传入的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实现,哈希值显然不匹配.

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

解决方法:

我相信应该是这样的:

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

一些注意事项:

>使用实际的请求正文.不要依赖于str(json_data)等于请求主体.这几乎肯定会失败,因为python将使用repr打印出内部字符串,这很可能会留下一堆虚假的u“ …”,它们实际上不在响应中. json.dumps不一定会做得更好,因为可能存在空白差异,这些差异对于JSON而言并不重要,但对hmac签名却非常重要.
> hmac是你的朋友:-)

标签:openssl,webhooks,python,django
来源: https://codeday.me/bug/20191119/2032876.html