hmacsha1 encrpyt в vba не равно значению php hmac_sha1 с помощью метода pack

Это мой код 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=

Пожалуйста, помогите в решении уравнения.
И есть еще одна проблема: если мы зашифруем данные без использования метода pack, оба результата будут одинаковыми, но если мы сделаем с pack, то получим разные результаты.

0

Решение

Ваш VB6 Pack функция:

  • преобразование двух шестнадцатеричных цифр за раз в байты, затем
  • преобразование этих значений в символы с переводом ANSI в Unicode.

Тогда ваш Encryp_HMACSHA1:

  • принимает такие строковые значения и преобразует их в байтовые массивы, используя преобразование в UTF-8, и
  • кормит это в crypto.Key жевать.

Такая быстрая и свободная игра с использованием Strings повредила значение вашего ключа.

Меня попросили воспроизвести неверный результат подписи, взяв известный рабочий код VB6 и изменив его для выполнения того же искажения.

Я не уверен, почему вы используете этот большой и тяжелый подход .Net inter-clop для выполнения части работы, а затем делаете еще один очень тяжелый прогон через MSXML DOM только для кодирования Base64. Вау, у тебя достаточно оперативной памяти, чтобы это даже запустилось?

Я использовал HS1.cls из вложения (HS1 Demo 1-1.zip) в:

[VB6] HMAC-SHA-256, HMAC-SHA-1 с использованием 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

Где Data — это текст VB6 / Windows «Unicode» (UCS-2 / UTF-16LE), а «Key» — это строка «Unicode» шестнадцатеричного текста. Например.:

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

Конечно же, он производит:

4QXpNBD/cv0sLIfFIsFGe5D57gI=

Это также намного легче, чем использование (а) библиотек .Net CLR и Framework, а также «взаимодействия» и (б) MSXML в качестве супер-толстых оболочек для простых вызовов API.

Но вы можете сохранить все эти накладные расходы, если действительно хотите, до тех пор, пока вы исправите свою логику синтаксического разбора «Строка шестнадцатеричных цифр в ключ».

0

Другие решения

Если "1989151498577ad12a9f8adf157f5abf" Предполагается, что это ключ в шестнадцатеричном коде PHP правильно.

Проверьте, если Encryp_HMACSHA1 ожидает, что ключом будут данные или шестнадцатеричная строка.
Проверьте, совпадают ли ключи после преобразования в данные, отображая их в шестнадцатеричном виде.

0

По вопросам рекламы [email protected]