Как конвертировать .net HMACMD5 хэширование в php эквивалент? - PullRequest
0 голосов
/ 24 апреля 2018

.NET-код, который я пытаюсь преобразовать в PHP:

Dim hmac As New HMACMD5(secretPassword)
Dim computedHash As Byte() = hmac.ComputeHash(stringToHash)

В настоящее время в php я использую:

$computedHash = hash_hmac('md5', $stringToHash, $secretPassword);

Из того, что я понимаю, функция php hash_hmac() является правильной функцией для использования, так как именно она указывает, как использовать md5, однако при тестировании оба случая дают разные результаты хеширования.Я понимаю, что .net-код возвращает массив, однако значения массива полностью отличаются от результатов php.

В .net-коде есть кодировка ascii для параметров, но я уже убедился, что мой php-код производитодни и те же результаты кодирования, только хеширование дает разные результаты.Я также проверил результаты кодирования относительно начальных нулей в двухзначных числах ("021" против "21"), да, они производят разные кодировки, но это не решило проблему хеширования, когда я попробовал оба.

Пример vb.значения переменных net:

.NET ascii encoded secretPassword "pass123" = [112, 97, 115, 115, 49, 50, 51]
.NET ascii encoded stringToHash "hashstring" = [104, 97, 115, 104, 115, 116, 114, 105, 110, 103] 
.NET hash results = [43, 65, 108, 137, 120, 163, 203, 231, 219, 197, 238, 187, 209, 216, 213, 225]

Результаты хэширования Php (я уже подтвердил, что моя кодировка в php выдает то же самое, что и .net):

a2c9f74f2597038a39b28538d7f1d73a

1 Ответ

0 голосов
/ 25 апреля 2018

Я понял, на случай, если кто-нибудь сталкивался с этим:

Если вам приведен пример кода VB .NET, касающегося аутентификации API, и вы видите код, который включает в себя кодировку ASCII ваших данных и паролей в байтовые массивы, вам не нужно делать этот шаг, если вы пытаетесь повторить код в PHP.

PHP уже по своей природе хранит строки в виде байтовых массивов, и они уже должны быть в допустимом формате UTF-8. Поэтому, в основном, пропустите любой шаг кодирования, просто вставьте свои параметры и переходите (параметры являются строками):

$computedHash       = hash_hmac('md5', $strToHash, self::$password, true);
$computedHashString = base64_encode($computedHash);

Возможно, вам придется изменить последний параметр на false в зависимости от API, но из того, что мне сказали, true является наиболее распространенным сценарием, поскольку API обычно ожидает, что хэш будет в двоичном, а затем в кодированном формате Base 64. Надеюсь, это помогло кому-то ~

...