用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 + "×tamp=" + 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 在生成。
第七步:发送请求。注意签名是有时间限制的哦,如果超时,就重新生成一遍,将timestamp和signature替换掉。
注意:
如果在运行脚本的时候发生了这个error,去控制面板,windows功能确认下,自己电脑上用的.NET Framework版本。我将自己的4.7版本直接降低到了3.5,才修复此报错。不过可能4.5也好用。这是另一把辛酸泪,在此不提。
以上是关于用excel 宏生成SHA512加密签名的主要内容,如果未能解决你的问题,请参考以下文章
Android 签名 SHA1WithRSA SHA256WithRSA MD5WithRSA