用excel 宏生成SHA512加密签名

Posted testertry

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用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也好用。这是另一把辛酸泪,在此不提。

技术图片

技术图片

 

 

以上是关于用excel 宏生成SHA512加密签名的主要内容,如果未能解决你的问题,请参考以下文章

openssl dgst(生成和验证数字签名)

Android 签名 SHA1WithRSA SHA256WithRSA MD5WithRSA

AES128_CBC_NoPading加密、sha256withRSA签名

图解HTTPS建立过程

图解HTTPS建立过程

使用SHA-256和RSA 2048进行加密和签名