@Richard_Ferlow
Веб-программист

Как на PHP генерировать HMAC с SHA-256 правильно?

Разбираюсь с банком - там процесс следующий - получаем секретный ключ и контрольную строку собираем. далее на основе этих данных генерируем HMAC по алгоритму SHA-256 и тем самым подписываем форму оплаты.

Секретный ключ они выдают в Base64, для генерирования HMAC его нужно перевести в HEX. HMAC должен в base64 отправляться(можно в hex, но base64 предпочтительнее).

В общем на php я написал так

$binary = base64_decode($secret);
$hex = strtoupper(bin2hex($binary));
$hmac =  base64_encode(hash_hmac('sha256', $stroka, $hex, true));


Но сгенерированный таким образом HMAC не подходит. Банк выдает утилиту где можно генерирование с помощью javascript провести и там HMAC генерируется нормальным...ну т.е. принимаемый банком.

Где что может быть не так? В JS не силен настолько чтобы найти отличия

Вот развернул

Вариант на PHP

Код файла следующий

$hmac =  hash_hmac('sha256', '1680024001;80024001;30;5.00', 'AF63D092A79416EC6CA99891EB8CF4E6AFEF5DCE9D6308CBA6A186D03A4B70F3', false);

echo strtoupper($hmac);


А тут вариант от банка(убрал) - в самом низу нажмите HMAC HEX

у меня полученные строки ну никак не совпадают...

техподдержка банка пока ничем помочь не смогла.
  • Вопрос задан
  • 6228 просмотров
Решения вопроса 1
akubintsev
@akubintsev
Опытный backend разработчик
Вы забыли преобразовать в бинарное представление ключ из hex.
echo  hash_hmac('sha256', '1680024001;80024001;30;5.00', hex2bin('AF63D092A79416EC6CA99891EB8CF4E6AFEF5DCE9D6308CBA6A186D03A4B70F3'), false);


PS. Ссылку на страницу тестовых платежей лучше убрать, наверняка у вас NDA какой-нибудь подписан с банком на подобные вещи.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы