MD5 хеширование между VB.net и PHP - PullRequest
1 голос
/ 15 декабря 2011

Ответ с помощью @ JonSkeet

Учитывая этот код:

    Dim data1ToHash As Byte() = (New UnicodeEncoding).GetBytes(input)
    ' 2. Hash the byte array
    Dim hashvalue1 As Byte() = CType(CryptoConfig.CreateFromName("MD5"), HashAlgorithm).ComputeHash(data1ToHash)

Разве этот PHP не должен создавать правильный хеш?

$md5 = (md5(utf8_encode($signature), true));

Я пытался, но md5sums не совпадают. Я предположил, что это кодирование, но, возможно, это связано с байтовым массивом, кто-нибудь может пролить свет на это? К вашему сведению, я не могу сменить VB

Для сравнения результатов:

в .Net

For Each b As Byte In hashvalue1
  tb.Text = tb.Text & b.ToString() & ","
Next
tb.Text = tb.Text.Trim(",")

в PHP

print_r(unpack('C*', pack('H*', md5($signature))))

по другому вопросу

Ответы [ 2 ]

4 голосов
/ 15 декабря 2011

Непонятно, как вы сравниваете результаты, но кодировка * определенно является проблемой - вы используете UTF-16 в коде VB и UTF-8 в PHP. Вы можете изменить код VB следующим образом:

Dim data1ToHash As Byte() = Encoding.UTF8.GetBytes(input)

Часть MD5 также может быть упрощена, что дает следующий результат:

Dim unhashed As Byte() = Encoding.UTF8.GetBytes(input)
Dim hashed As Byte() = MD5.Create().ComputeHash(unhashed)

РЕДАКТИРОВАТЬ: Если вы не можете изменить VB, вам нужно изменить PHP для использования UTF-16, возможно, с mbstring , как предлагается в комментариях. Вам, конечно, нужно знать, что такое существующая кодировка ...

0 голосов
/ 16 декабря 2011

Решение было связано с порядком байтов: .NET в UTF-16 был Little Endian, тогда как кодировка UTF-16 в PHP по умолчанию - Big Endian. Итак, ответ:

mb_internal_encoding('UTF-8');
$string = mb_convert_encoding($signature, 'UTF-16LE', 'UTF-8');
$encoded_signature = base64_encode(md5($string, true));

Для проверки я сравнил байты в кодировке UTF-16 в PHP и .NET:

print_r(unpack('C*', $string));

Просто так просто. Спасибо всем, кто помог, особенно @ JonSkeet.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...