• 用excel 宏生成SHA512加密签名


    先简单聊一下什么是接口签名:在与第三方系统做对接的时候,要考虑请求方身份验证问题,这就用到了接口签名方案。

    签名规则一般是这样的:

    1. 我方系统和第三方系统线下确认互相的连络“暗号”。我方系统作为接口的提供方,保存着一个appSecret 和对方的appID。如果有多个第三方系统,那将会有多个appID。

    2. 签名的时候,要带上一个时间戳timestamp。这样就方便为签名制定有效时间,比如10分钟。

    3. 加入一个随机字符串nonce,每次都重新生成,防止被坏人拦截后重复使用。

    4. 以上四样东西,经过算法和加密之后生成了一个字符串,就是signature。

    5. 在第三方系统向我方系统发送请求的时候,要求将这四样东西加入请求的参数中:appID,timestamp,nonce,signature。

    6. 我方接到请求,利用发过来的appID,timestamp,nonce 和本地所存的appSecret生成signature2,同传过来的signature相比,如果相同,身份验证成功!如果不同,就“此人身份有诈”了。

    注意,appSecret只线下确认,不参与传输,双方系统暗搓搓的知道就行。如果这个泄露或者被人拦截,加密就毫无意义了。

    我在这里用VBA 实现了一个即时生成signature的小工具,此工具的诞生是为了帮助测试同事在进行手动调试的时候生成签名。也帮助大家从代码层面了解上述signature生成的过程。

    准备工作:

    1. 要有Excel,并且打开Excel的宏。可以参考百度经验:https://jingyan.baidu.com/article/642c9d343858e4644b46f770.html

      并且将宏功能放置在工具栏中,方便使用:

     第二步:在excel 中设置appSecret,appID,nonce的值。timestamp将由代码即时生成,签名的有效期只有10分钟,就是说timestamp之后的10分钟之外向系统发送请求,签名将过期无用。我用了B1~B3,等下脚本中会写到。

    第三步:选两个格子,一个用作返回signature,一个用作返回timestamp。我用了B7和B8。等下脚本中会写到。

    第四步:插入一个小方格(原谅它的丑),右键为这个小方格创建一个宏,参考下图:

     

     

     第五步:输入脚本

    Sub 生成密钥()
    Dim appId As String
    Dim appSecret As String
    Dim nonce As String
    Dim timestamp As String
    Dim MergeString As String
    
    appId = Range("B1").Value
    appSecret = Range("B2").Value
    nonce = Range("B3").Value
    timestamp = GetUnixTime_ms()
    MergeString = Replace("appId=" + appId + "&appSecret=" + appSecret + "&nonce=" + nonce + "&timestamp=" + timestamp, " ", "")
    Range("B7") = timestamp
    Range("B8") = SHA512(MergeString, False)
    'MsgBox MergeString
    'MsgBox SHA512(MergeString, False)
    
    End Sub
    Public Function GetUnixTime_ms() As String
        GetUnixTime_ms = DateDiff("s", "1970-1-1 0:0:0", DateAdd("h", -8, Now)) & Right(timeGetTime, 3)
    End Function
    Public Function SHA512(sIn As String, Optional bB64 As Boolean = 0) As String
        
        Dim oT As Object, oSHA512 As Object
        Dim TextToHash() As Byte, bytes() As Byte
        
        Set oT = CreateObject("System.Text.UTF8Encoding")
        Set oSHA512 = CreateObject("System.Security.Cryptography.SHA512Managed")
        
        TextToHash = oT.GetBytes_4(sIn)
        bytes = oSHA512.ComputeHash_2((TextToHash))
        
        If bB64 = True Then
           SHA512 = ConvToBase64String(bytes)
        Else
           SHA512 = ConvToHexString(bytes)
        End If
        
        Set oT = Nothing
        Set oSHA512 = Nothing
        
    End Function
    Private Function ConvToBase64String(vIn As Variant) As Variant
    
        Dim oD As Object
          
        Set oD = CreateObject("MSXML2.DOMDocument")
          With oD
            .LoadXML "<root />"
            .DocumentElement.DataType = "bin.base64"
            .DocumentElement.nodeTypedValue = vIn
          End With
        ConvToBase64String = Replace(oD.DocumentElement.Text, vbLf, "")
        
        Set oD = Nothing
    
    End Function
    Private Function ConvToHexString(vIn As Variant) As Variant
    
        Dim oD As Object
          
        Set oD = CreateObject("MSXML2.DOMDocument")
          
          With oD
            .LoadXML "<root />"
            .DocumentElement.DataType = "bin.Hex"
            .DocumentElement.nodeTypedValue = vIn
          End With
        ConvToHexString = Replace(oD.DocumentElement.Text, vbLf, "")
        
        Set oD = Nothing
    
    End Function
            
    

      

    第六步:检查脚本的正确性:

    点击黄色的按钮,看到每次点击,都有 signature 和 timestamp 在生成。

     

    第七步:发送请求。注意签名是有时间限制的哦,如果超时,就重新生成一遍,将timestampsignature替换掉。

    注意:

    如果在运行脚本的时候发生了这个error,去控制面板,windows功能确认下,自己电脑上用的.NET Framework版本。我将自己的4.7版本直接降低到了3.5,才修复此报错。不过可能4.5也好用。这是另一把辛酸泪,在此不提。

  • 相关阅读:
    结对 总结
    ”耐撕“团队 2016.3.29 站立会议
    词频统计 List Array
    基本数据结构简述
    深入理解HashMap
    常用排序算法Java实现
    Spring核心组件知识梳理
    HashMap中使用自定义类作为Key时,为何要重写HashCode和Equals方法
    Nginx是什么东东?
    Java中常用的四种线程池
  • 原文地址:https://www.cnblogs.com/testertry/p/11941655.html
Copyright © 2020-2023  润新知