HMACSHA1 encrpyt不等于PHP和包装方法HMAC_SHA1价值

问题描述:

这是我的VB6代码HMACSHA1 encrpyt不等于PHP和包装方法HMAC_SHA1价值

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=

请帮助解决设备通货膨胀。 另外还有一个问题,如果我们在不使用包方法的情况下加密数据,两个输出都是相同的,但是如果我们使用pack,它会显示不同的结果。

+0

散列不是加密。 – Bob77

你的VB6 Pack功能是:

  • 以一次字节转换两个十六进制数字,然后
  • 转换那些值转换为ANSI到Unicode转换的字符。

那么您Encryp_HMACSHA1

  • 采取这样字符串值并将其转换成使用转换为UTF-8字节阵列,并
  • 供稿成crypto.Key蒙克上。

以这种方式使用字符串播放快速和松散已损坏您的关键值。

我是适用于重现通过利用已知的工作VB6代码,并改变它来执行相同的失真不正确的签名结果。

我不知道为什么你正在使用这个伟大的大重型.Net的马蹄声间办法做的工作的一部分,然后以另一种非常沉重运行通过MSXML DOM只为Base64编码。哇,你有足够的RAM甚至可以运行吗?

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

[VB6] HMAC-SHA-256, HMAC-SHA-1 Using Crypto API #35

然后所有需要的是:

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的 “统一” 的文字( UCS-2/UTF-16LE)和密钥是一个“Unicode”字符串的十六进制文本。例如。:

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

果然,它产生:

4QXpNBD/cv0sLIfFIsFGe5D57gI= 

这也是远重量更轻比使用(a。)中的.NET CLR和Framework库加 “互操作” 和MSXML(B)。作为围绕简单API调用的超胖包装。

但是,如果您确实想要只要您将“十六进制数字的字符串”更正为“解析逻辑”,就可以保留所有这些开销。

+0

谢谢你的回答,你的回答是完美的,你创造了我的一天。我有责任 – Malik

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

验证是否Encryp_HMACSHA1预计该密钥数据或十六进制字符串。
验证如果键转换后的数据是相同的由十六进制显示它们

+0

如果我们使用pack方法加密数据,两个输出都是相同的,但是如果我们使用pack方法,它会显示不同的结果。请提出一些解决方案 – Malik

+0

正如答案中所述,PHP代码会生成正确的散列值。您需要确定VB6实现中需要更改的内容,仔细查看预期输入格式的文档可能会有所帮助。 – zaph