在经典ASP中验证条纹Webhook签名

时间:2018-08-16 19:22:15

标签: encryption asp-classic stripe-payments chilkat

Stripe建议使用其库来验证签名,但是由于它们没有可与Classic一起使用的库,因此我必须手动执行它,而且我真的很努力。

https://stripe.com/docs/webhooks/signatures#verify-manually

  

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

     

第2步:准备signed_pa​​yload字符串,您可以通过以下方法实现   串联:时间戳记(作为字符串)字符。实际上   JSON有效负载(即请求的正文)

     

第3步:确定期望的签名用   SHA256哈希函数。使用端点的签名秘密作为密钥,   并使用signed_pa​​yload字符串作为消息。

     

第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

我遇到的第一个问题是不确定第二步是否正确生成了signed_pa​​yload字符串。第二个问题是步骤3中的strHashedSignature变成空白,可能是由于未正确生成signed_pa​​yload字符串(strSignedPayload)。

1 个答案:

答案 0 :(得分:0)

我认为我应该对此进行更新,以防将来有人遇到问题。解决方案有两个方面。

首先,由于某种原因,我完全隔开了signed_pa​​yload字符串,包括v1Signature(我借口说这是星期五结束的一天:)

strSignedPayload = intTimeStamp & "." & strV1Signature & strPayload

它应该是:

strSignedPayload = intTimeStamp & "." & strPayload

第二个是@karllekko所说的,编码必须为UTF-8