服务器没有安装 Digest::SHA 'hmac_sha256_base64',我可以使用 Digest::HMAC_SHA1 'hmac_sha1' 代替吗?

Server does not have Digest::SHA 'hmac_sha256_base64' installed, can I use Digest::HMAC_SHA1 'hmac_sha1' instead?

我正在准备一个 CGI 脚本,需要确认传入的 post 请求消息的 body 在转换为 HMAC-SHA256 散列时与也完全相同的内容出现在同一条传入消息的 header 标记中。

我已经能够使用 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

但它们完全不同。我怀疑我没有使用正确的算法。

So my question is:

If my server provider does not include Digest::SHA 'hmac_sha256_base64' in the available libraries, then what other alternatives do I have to make the same? Is Digest::HMAC_SHA1 'hmac_sha1' the same functionality or not?

下载 Digest::SHA::PurePerl 的 tarball(您可以在此页面 https://metacpan.org/pod/Digest::SHA::PurePerl 上找到下载 link)

创建一个库文件夹,像这样

.
|-- library
|   `-- Digest
|       `-- SHA
|           `-- PurePerl.pm
`-- your_script.pl

your_script.pl 看起来像这样,你可以类似地实现:

#!/usr/bin/perl

use lib '.';
use lib '/tmp/iadvd/library/';

use Digest::SHA::PurePerl qw(sha1 sha1_hex);

print sha1_hex('Pradeep'),"\n";