【问题标题】:How to generate a signature by hashing the webhook request body?如何通过散列 webhook 请求正文生成签名?
【发布时间】:2023-03-27 23:49:01
【问题描述】:

我已经配置了一个 webhook,当应用程序中发生事件时,会调用 url,但我没有在调用中获取任何数据。

根据其文档

为了增加安全性,发送到 OAuth 授权的应用程序的 webhook 都经过签名,因此可以验证它们来自 Vend 并且在传输过程中未更改。基于散列的消息验证码用于签名。如果 webhook 请求包含如下标头,则应用程序可以验证请求。

X-Signature: signature=897hRT893qkA783M093ha903f,algorithm=HMAC-SHA256

为此,请通过散列 webhook 请求正文生成签名,并将其与标头中的签名进行比较以获得完全匹配。使用标头中指定的算法和应用程序的 client_secret 作为哈希键。

参考 - https://docs.vendhq.com/tutorials/guides/webhooks/introduction

我有密钥,但我不确定如何通过散列 webhook 请求正文来生成签名?

有什么想法吗?

谢谢

【问题讨论】:

  • 我不确定文档的含义以及获取数据需要做什么。
  • 我检查了文档,我的结论是其中缺少数据。至少,必须告诉您如何生成哈希(他们使用的是哪个库)。也许是github.com/entronad/crypto-es#HMAC,但不确定。另一方面,如果他们无法确保他们将发送 WebHook,我将不会使用它。

标签: php webhooks


【解决方案1】:

查看示例 X-Signature 标头,它提供了算法:

X-签名:signature=897hRT893qkA783M093ha903f,algorithm=HMAC-SHA256

来自PHP: How can I generate a HmacSHA256 signature of a string

使用hash_hmac:

$sig = hash_hmac('sha256', $string, $secret)

$secret 是您的密钥。

$string 将是 webhook 主体。

【讨论】:

    【解决方案2】:

    Ok 联系了 Vend 并解决了这个问题:

    首先,这仅在您通过 Oauth 授权应用创建 webhook 时有效。并使用您自己的 client_secret 通过 curl 的 webhook 创建请求将 X-Signature 发送到 Vend,如下所示:

    $token = 'Authorization: Bearer ' . get_option('vend_token');
    $client_secret = get_option("client_secret"); 
    
    curl_setopt($curl, CURLOPT_HTTPHEADER, array(
            'X-Signature: signature='.$client_secret.',algorithm=HMAC-SHA256',
            'Content-Type: application/x-www-form-urlencoded', $token ));
    
    

    那么,在回调函数中:

        function receive_webhook_callback( $request_data){
        $data = $request_data->get_body();
    
        $client_secret = get_option("client_secret");
    
        $signaturehash = hash_hmac('sha256', $data, $client_secret, false);
    
        $signature = "signature=".$signaturehash.", algorithm=HMAC-SHA256";
    
        error_log('signature:');
        error_log($signature); 
        
        $sig_header = $_SERVER['HTTP_X_SIGNATURE'];
        
        error_log('header-signature:');
        error_log($sig_header);
        
        if($signature === $sig_header) {
        
        error_log("signatures match!!");
    
        }
        }   
    

    【讨论】:

      猜你喜欢
      • 2018-04-10
      • 2020-01-17
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      • 2020-04-20
      相关资源
      最近更新 更多