Следующий 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-кода.
В вашем коде есть два недостатка:
- Значения
$sb
и $keyToEncode
были перепутаны. - 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.