服务器未安装Digest :: SHA'hmac_sha256_base64',我可以改用Digest :: HMAC_SHA1'hmac_sha1'吗?

时间:2019-05-21 06:42:37

标签: perl cgi

我正在准备一个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'是否具有相同的功能?

1 个答案:

答案 0 :(得分:2)

下载Digest :: SHA :: PurePerl的压缩包(您可以在此页面https://metacpan.org/pod/Digest::SHA::PurePerl上找到下载链接)

创建一个库文件夹,类似这样

.
|-- 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";