当前位置: 首页 > 知识库问答 >
问题:

验证经典ASP中的条纹WebHook签名

满和安
2023-03-14

Stripe建议使用他们的库来验证签名,但因为他们没有一个可以与Classic一起使用的库,所以我不得不手动进行验证,我真的很难做到这一点。

(https://stripe.com/docs/webhooks/signatures#verify-(手动)

步骤1:从标头中提取时间戳和签名拆分标头,使用,字符作为分隔符,以获得元素列表。然后使用=字符作为分隔符拆分每个元素,以获得前缀和值对。前缀t的值对应于时间戳,v1对应于签名。您可以放弃所有其他元素。

步骤2:准备有符号的_有效负载字符串—通过将时间戳(作为字符串)与字符连接起来来实现这一点。实际的JSON负载(即请求的主体)

步骤3:确定预期的签名使用SHA256哈希函数计算HMAC。使用终结点的签名秘密作为密钥,并使用signed_payload字符串作为消息。

步骤4:比较签名将标头中的签名与预期的签名进行比较。如果签名匹配,计算当前时间戳和接收到的时间戳之间的差异,然后确定差异是否在您的容差范围内。为了防止定时攻击,使用常量时间字符串比较将预期签名与每个接收到的签名进行比较。

我认为我的代码是正确的:

'Keys     
If strStripeMode = "live" Then 
    strSigningSecret = ""
Else
    strSigningSecret = "whsec_CIXV2............................UR8Ta0" 
End if

'1. Payload
    lngBytesCount = Request.TotalBytes
    strPayload = BytesToStr(Request.BinaryRead(lngBytesCount))

'2. Stripe-Signature 
    strStripeSignature = Request.ServerVariables("HTTP_STRIPE_SIGNATURE")
    arrStripeSignature = Split(strStripeSignature,",")
    intTimeStamp = REPLACE(arrStripeSignature(0),"t=","")
    strV1Signature = REPLACE(arrStripeSignature(1),"v1=","")
    strSignedPayload = intTimeStamp & "." & strV1Signature & strPayload

'3. Hash using 'signing secret' as the key. 
    set crypt = Server.CreateObject("Chilkat_9_5_0.Crypt2")
    crypt.HashAlgorithm = "sha256"
    crypt.EncodingMode = "hex"
    crypt.SetHmacKeyEncoded strSigningSecret,"ascii"
    strHashedSignature = crypt.HmacStringENC(strSignedPayload)
    set crypt = nothing


'4. Compare the values
    If strHashedSignature = strV1Signature Then 
        'Valid
        Response.Status = "200"
        Response.Write(Response.Status)
        '------------ DO SOMETHING------------
        Response.End
    Else
        'Invalid
        Response.Status = "300" 
        Response.Write(Response.Status)
        '------------ DO SOMETHING------------
        Response.End                                    
    End if




' Bytes to String Function
Function BytesToStr(bytes)
    Dim Stream
    Set Stream = Server.CreateObject("Adodb.Stream")
        Stream.Type = 1 'adTypeBinary
        Stream.Open
        Stream.Write bytes
        Stream.Position = 0
        Stream.Type = 2 'adTypeText
        Stream.Charset = "iso-8859-1"
        BytesToStr = Stream.ReadText
        Stream.Close
    Set Stream = Nothing
End Function

我遇到的第一个问题是,我不确定在步骤2中是否正确生成了有符号的#u有效负载字符串。第二个问题是,步骤#3中的strHashedSignature显示为空白,可能是因为没有正确生成已签名的#有效负载字符串(strSignedPayload)。

共有1个答案

南门意蕴
2023-03-14

我想我应该更新这个,以防将来有人遇到问题。解决方案是双重的。

首先,我在签名的_有效负载字符串上完全隔开,包括出于某种原因的v1Signature(我的借口是这是星期五的一天结束:)

strSignedPayload = intTimeStamp & "." & strV1Signature & strPayload

它只应该是:

strSignedPayload = intTimeStamp & "." & strPayload

第二个是@karllekko所说的,编码需要是UTF-8

 类似资料:
  • 我正在从woocommerce网站接收webhooks,并将其转换为nodejs/express应用程序。我试图验证webhook的签名以证明其真实性,但我计算的哈希值从未与woocommerce报告的钩子签名头中的签名对应。 这是我用来验证真实性的代码: 正在使用以下参数调用此函数: webhook的签名头将签名报告为beyov/zzmbmujkhauwaqxjx8yr6jrktpzqn9j26

  • 我正在尝试为我们网站上运行在单独服务器上的经典asp部分实现单点登录。我已经使用simpleSAMLphp在另一台服务器上实现了php SSO。我正在尝试使用shibboleth来实现asp/IIS的经典功能。我已经到达了我们身份提供者的登录页面,但一旦我进行身份验证,我就会卡在/SAML2/POST上,并且有一个网页说找不到我服务器的ip地址。我曾尝试实施在论坛中找到的修复,但仍然没有取得任何进

  • 我想在银行项目中通过android平板电脑记录客户数据,包括指纹。当客户存款或取款时,会通过指纹数据核实哪个客户。Android设备记录指纹数据并与Web服务器(asp.net)同步。那么,开发指纹验证的最佳方法是什么?如果指纹设备与Android平板电脑连接更容易,请建议我。

  • 我使用GitHub webhook将事件传递到我的一个应用程序(GitHub的Hubot的一个实例),它由sha1机密保护。 我正在使用以下代码来验证传入webhooks上的哈希值 在网络钩子中传递的X-Hub-Signature标头如下所示 X-Hub-签名:sha1=1cffc5d4c77a3f696ecd9c19dbc2575d22ffebd4 我按照GitHub的文档准确地传递了密钥和数据

  • 我正在尝试为Authy OneTouch推送身份验证设置webhooks。我设法成功注册到事件,从订阅调用中保存网络钩子签名密钥,但我仍然无法验证请求:任何攻击者都可以伪造虚假请求并轻松绕过2FA检查。 API文档让我很困惑,因为回调请求与所提到的格式不匹配(尤其是它们没有X-Authy-Signature头),并且只有以下头: 我还尝试验证JWT令牌的签名,但仍然无效(传入的请求:):我总是得到

  • 我有一个PVK和SPC文件,想用它们来签署Netbeans IDE 7.3中的jar文件。我的应用程序将从JavaWebStart开始部署。 我使用keytool将它们组合成一个PFX文件。 “C:\Program Files\Microsoft SDK\Windows\v7.1\Bin\pvk2pfx.exe”-pvk joy。pvk-spc欢乐。spc-pi快乐-pfx快乐。pfx 我找到了化