VBA中的HMACSHA1 ENCRPYT用包装方法不等于PHP HMAC_SHA1值



这是我的VB6代码

Private Function Encryp_HMACSHA1(pData As String, pSecretKey As String) As String
Dim encoder  As Object
Dim crypto As Object
Dim i As Integer
Dim bSecretKey() As Byte
Dim bData() As Byte
Dim bEncrypted() As Byte
Set encoder = CreateObject("System.Text.UTF8Encoding")
Set crypto = CreateObject("System.Security.Cryptography.HMACSHA1")
bData = encoder.Getbytes_4(pData)
bSecretKey = encoder.Getbytes_4(pSecretKey)
crypto.Key = bSecretKey
bEncrypted = crypto.ComputeHash_2(bData)

Set encoder = Nothing
Set crypto = Nothing
Dim objXML As MSXML2.DOMDocument
Dim objNode As MSXML2.IXMLDOMElement
Set objXML = New MSXML2.DOMDocument
Set objNode = objXML.createElement("b64")
objNode.dataType = "bin.base64"
objNode.nodeTypedValue = bEncrypted
EncodeBase64 = objNode.Text
Encryp_HMACSHA1 = EncodeBase64
Set objNode = Nothing
Set objXML = Nothing
End Function
Public Function Pack(strlength As String) As String
Dim Temp As String
Dim MyString As String
Dim i As Integer
MyString = ""
For i = 1 To Len(strlength) Step 2
    Temp = Mid(strlength, i, 2)
    MyString = MyString & Chr(CLng("&H" & Temp))
Next
Pack = MyString
End Function
Private Sub Command1_Click()
Dim pKey As String
   pKey = Pack("1989151498577ad12a9f8adf157f5abf")
   Text1.Text = Encryp_HMACSHA1("test", pKey)
End Sub

VB的结果为:03AM+k4B3mPEZlkCatDvdiHOuuc=

这是我的php代码

$key = "1989151498577ad12a9f8adf157f5abf";
$decodeKey = pack("H*",$key);
$data = "test";
$hash = hash_hmac("SHA1", $data, $decodeKey, TRUE);
$signature = base64_encode($hash);

echo $signature;

PHP的结果为:4QXpNBD/cv0sLIfFIsFGe5D57gI=

请帮助解决方程式。还有另一个问题,如果我们没有包装方法的数据加密两个是输出相同的,但是如果我们使用包装,则会显示出不同的结果。

您的VB6 Pack功能是:

  • 一次将两个十六进制数字转换为字节,然后
  • 用ANSI到Unicode翻译将这些值转换为字符。

然后您的Encryp_HMACSHA1

  • 使用此类字符串值,并使用转换为UTF-8和
  • 将它们转换为字节数组
  • 将其喂入crypto.Key中以munch。

以这种方式使用字符串快速而放松,已破坏了您的关键值。

i通过服用已知工作VB6代码并将其更改以执行相同的失真来重现错误的签名结果。

我不确定为什么您使用这种大型重型.NET挡板界面方法来完成工作的一部分,然后再通过MSXML DOM进行另一个非常重的运行,仅用于Base64编码。哇,您有足够的RAM甚至可以运行吗?

我使用了附件(HS1 Demo 1-1.zip)的HS1.cls

[VB6] HMAC-SHA-256,使用加密API#35

HMAC-SHA-1

那么所需的一切是:

Private Function HMACSHA1(ByVal Data As String, ByVal Key As String) As String
    With New HS1
        .InitHmac .Decode(Key, edfHexRaw)
        HMACSHA1 = .Encode(.HMACSHA1(.ToUTF8(Data)), edfBase64, efNoFolding)
    End With
End Function

数据是vb6/windows" unicode"文本(UCS-2/UTF-16LE),而键是十六进制文本的" Unicode"字符串。例如:

txtSignature.Text = HMACSHA1("test", "1989151498577ad12a9f8adf157f5abf")

果然,它产生:

4QXpNBD/cv0sLIfFIsFGe5D57gI=

这也比使用(a。).NET CLR和框架库加上" Interop"和(b。)MSXML作为Super-Fat围绕简单API调用。

的重量也要轻得多。

但是,只要您真的想纠正"十六进制数字的字符串到键"解析逻辑,就可以将所有这些开销。

如果 "1989151498577ad12a9f8adf157f5abf"应该是十六进制的关键,则PHP代码是正确的。

验证Encryp_HMACSHA1是否期望密钥是数据或十六进制字符串。
通过在十六进制

中显示转换为数据后的键是否相同

最新更新