Я готовлю сценарий CGI, который должен подтвердить, что тело сообщения входящего почтового запроса, когда оно преобразуется в хэш HMAC-SHA256, точно такое же содержимое, которое также входит в тег заголовка того же входящего сообщения. .
Я смог подтвердить с помощью Python, что процедура описана выше, но когда я выполняю те же функции на CGI-скрипте, я не могу сопоставить содержимое и, возможно, это потому, что я не использую правильную библиотеку шифрования / хэширования.
Мой провайдер сервера не имеет библиотеки Digest :: SHA, и поэтому я не могу использовать функцию 'hmac_sha256_base64'. Я не могу попросить их установить его, я просто могу использовать то, что уже доступно.
Я проверил доступные библиотеки, и есть библиотека / функция Digest :: HMAC_SHA1 'hmac_sha1'. Поэтому я делаю следующее:
my $q = CGI->new;
my %headers = map { $_ => $q->http($_) } $q->http();
# below is the secret key, is an example but I am using the good one
my $channel_secret="abcdabcdabcdabcdabcdabcdabcdabcd"
# Incoming request body string
my $httpRequestBody = $q->param( 'POSTDATA' );
# now, I want to use Digest::SHA hmac_sha256_base64 but this server
# does not have it so I am using the following one...
# because I thought it was the equivalent new function to do the same
# but probably it is not...
use Digest::HMAC_SHA1 'hmac_sha1';
use MIME::Base64 'encode_base64';
$digest = hmac_sha1($httpRequestBody, $channel_secret);
my $signature = encode_base64($digest);
Так что в основном я ожидаю, что эти две переменные содержат одну и ту же строку:
$headers{'A_EXISTING_TAG_OF_THE_HEADER'}
$signature
Но они совершенно разные. Я подозреваю, что я не использую правильный алгоритм.
Итак, мой вопрос:
Если мой провайдер серверов не включает Digest :: SHA 'hmac_sha256_base64' в доступные библиотеки, то какие еще альтернативы мне нужно сделать, чтобы сделать то же самое? Является ли Digest :: HMAC_SHA1 'hmac_sha1' такой же функциональностью или нет?