在经典ASP中验证Stripe Webhook签名

问题描述 投票:0回答:1

Stripe建议使用他们的库来验证签名,但由于他们没有可以使用Classic的签名,我必须手动完成,我真的很挣扎。

(Qazxswpoi)

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

步骤2:准备signed_pa​​yload字符串您可以通过连接来实现:时间戳(作为字符串)字符。实际的JSON有效负载(即请求的主体)

步骤3:确定预期签名使用SHA256散列函数计算HMAC。使用端点的签名密钥作为密钥,并使用signed_pa​​yload字符串作为消息。

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

我认为我在正确的轨道上使用以下代码:

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

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

encryption asp-classic stripe-payments chilkat
1个回答
0
投票

我想我应该更新这个以防万一其他人在将来遇到问题。解决方案是双重的。

首先是我在signed_pa​​yload字符串上完全间隔,包括v1Signature由于某种原因(我的借口是它是星期五结束的那天:)

'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

它唯一应该是:

strSignedPayload = intTimeStamp & "." & strV1Signature & strPayload

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

© www.soinside.com 2019 - 2024. All rights reserved.