Выходные данные HMAC в PHP не совпадают с выходными данными в Java - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь установить соединение API, которое требует HMAC и шифрования.Документация и пример вывода / кода, предоставленные мне, на Java, но мой сайт на PHP.Я нахожусь на PHP 7.

Что я должен сделать, чтобы мой вывод PHP соответствовал выводу примера Java, приведенному в документации API?

Я пытался использовать base64, utf8 и utf16кодирование в моем выводе PHP hmac, но значение не совпадает.

код PHP:

$sb = '4a275929e0eba4445bc7f9a80c6361a2351119a27b51eebb2c259f68f72efd5f';
$keyToEncode = 'c0814229c201ab1022070741d15eda7af2189db64a2c88699c6481dbb83521afd8640d9af6d984602037d2e4f90c4f9a12915899290d944f385192b658829ec1;
$sb3 = hash_hmac('sha256',$sb, $keyToEncode);

код Java :

HMAC_SHA256(sb.toString(), keyToEncode);

Вывод в PHP:

2bea1f99897a8fd2e836e9d8f7820a28c03b76bf37daf04527f6f5d279c97fd7

Ожидаемый вывод в Java:

gWzlCNzu7fNN4z/uwvrgk574dTJqLQ8+25UMXCh+4tU=

1 Ответ

0 голосов
/ 03 февраля 2019

Следующий PHP-код воспроизводит результат из Java-кода:

<?php
$sb = 'c0814229c201ab1022070741d15eda7af2189db64a2c88699c6481dbb83521afd8640d9af6d984602037d2e4f90c4f9a12915899290d944f385192b658829ec1';
$keyToEncode = '4a275929e0eba4445bc7f9a80c6361a2351119a27b51eebb2c259f68f72efd5f';
$sb3 = hash_hmac('sha256',$sb, $keyToEncode); // HMAC-value as lowercase hexadecimal string
$sb4 = hex2bin($sb3);                         // HMAC-value as binary data  
$sb5 = base64_encode($sb4);                   // Base64-encoded HMAC-value 
print "HMAC-value (hexadecimal string): ".$sb3."\n"."HMAC-value (Base64-encoded): ".$sb5; 

со следующим выводом:

HMAC-value (hexadecimal string): 816ce508dceeedf34de33feec2fae0939ef875326a2d0f3edb950c5c287ee2d5
HMAC-value (Base64-encoded): gWzlCNzu7fNN4z/uwvrgk574dTJqLQ8+25UMXCh+4tU=

Здесь $sb5 - это кодировка Base64 HMAC-значение, которое соответствует результату Java-кода.

В вашем коде есть два недостатка:

  1. Значения $sb и $keyToEncode были перепутаны.
  2. PHP-метод hash_mac имеет четвертый параметр $raw_output, который по умолчанию FALSE.При значении FALSE результат возвращается в виде шестнадцатеричной строки в нижнем регистре в противном случае в виде двоичных данных (http://php.net/manual/en/function.hash-hmac.php)., поскольку в вашем PHP-коде используется значение по умолчанию $raw_output(т. е. FALSE), HMAC возвращается в виде шестнадцатеричной строки и должна быть сначала преобразована в двоичные данные, прежде чем она может быть закодирована в Base64. Для преобразования должен использоваться PHP-метод hex2bin.

Кстати, вы также можете использовать вариант $raw_output = TRUE. Тогда преобразование с hex2bin не требуется. Однако, если вы хотите отобразить HMAC в виде шестнадцатеричной строки, PHP-метод bin2hex должен бытьиспользуется:

<?php
$sb = 'c0814229c201ab1022070741d15eda7af2189db64a2c88699c6481dbb83521afd8640d9af6d984602037d2e4f90c4f9a12915899290d944f385192b658829ec1';
$keyToEncode = '4a275929e0eba4445bc7f9a80c6361a2351119a27b51eebb2c259f68f72efd5f';
$sb3 = hash_hmac('sha256',$sb, $keyToEncode, TRUE); // HMAC-value as binary data
$sb4 = base64_encode($sb3);                         // Base64-encoded HMAC-value
print "HMAC-value (hexadecimal string): ".bin2hex($sb3)."\n"."HMAC-value (Base64-encoded): ".$sb4; 

с тем же выводом, что и выше.

Здесь $sb4 - это значение HMAC в кодировке Base64, которое соответствует результату кода Java.

...