在Perl中使用六角形字符串的SHA1 HMAC

Vij*_*ati 2 perl hex hmacsha1

我有两个字符串(键和数据),它们是十六进制字符串格式,我想接受它们的HMAC.字符串是:

$data = "0000000002ccbe80";
$key  = "48656c6c6f21deadbeef";
Run Code Online (Sandbox Code Playgroud)

我想生成相当于javascript jsSHA函数,其中字符串被视为十六进制字符串.此演示http://caligatio.github.io/jsSHA/允许您指定密钥和数据是HEX字符串.

但是,当我hmac_sha1_hex($data, $key)在Perl中使用时,字符串被视为文本.我得到了hmac_sha1_hex的输出:

775083be8f8c94baea8d12a5038d191cab3759ac
Run Code Online (Sandbox Code Playgroud)

如何生成与jsSHA演示相同的输出,其中两个输入都被视为十六进制,输出也是十六进制?我想要这个输出:

f2ea4899a8582c21610085988c54645fd7193393
Run Code Online (Sandbox Code Playgroud)

Bor*_*din 5

我不知道您使用哪个模块提供hmac_sha1_hex,但我推荐使用Digest模块系列.如果Digest::HMAC与之结合使用Digest::SHA1,则可以计算SHA1 HMAC,并且可以使用十六进制字符串到二进制的转换pack.

这段代码将整个事件包含在您的子程序中.

use strict;
use warnings;

use Digest::HMAC;
use Digest::SHA1;

my $data = '0000000002ccbe80';
my $key  = '48656c6c6f21deadbeef';

print hmac_sha1_hex_string($key, $data), "\n";

sub  hmac_sha1_hex_string {
   my ($key, $data) = map pack('H*', $_), @_;
   my $hmac = Digest::HMAC->new($key, 'Digest::SHA1');
   $hmac->add($data);
   $hmac->hexdigest;
}
Run Code Online (Sandbox Code Playgroud)

产量

f2ea4899a8582c21610085988c54645fd7193393
Run Code Online (Sandbox Code Playgroud)

更新

我忽略了还有一个Digest::HMAC_SHA1模块可以为您完成所有这些工作并使代码更简单.

像这样

use strict;
use warnings;

use Digest::HMAC_SHA1 qw/ hmac_sha1_hex /;

my $data = '0000000002ccbe80';
my $key  = '48656c6c6f21deadbeef';

print hmac_sha1_hex_string($key, $data), "\n";

sub  hmac_sha1_hex_string {
   my ($key, $data) = map pack('H*', $_), @_;
   hmac_sha1_hex($data, $key);
}
Run Code Online (Sandbox Code Playgroud)

输出与前一代码的输出相同.


更新

只是为了完成集合,这是如何使用过程接口Digest::HMAC而不是面向对象的样式来完成它.

use strict;
use warnings;

use Digest::HMAC qw/ hmac_hex /;
use Digest::SHA1 qw/ sha1 /;

my $data = '0000000002ccbe80';
my $key  = '48656c6c6f21deadbeef';

print hmac_sha1_hex_string($key, $data), "\n";

sub  hmac_sha1_hex_string {
   my ($key, $data) = map pack('H*', $_), @_;
   hmac_hex($data, $key, \&sha1);
}
Run Code Online (Sandbox Code Playgroud)

更新

我刚读完你的评论答案.我没有意识到有HMAC功能写入Digest::SHA.使用该模块及其hmac_sha1_hex调用,剩下的就是对pack十六进制字符串执行调用.

use strict;
use warnings;

use Digest::SHA qw/ hmac_sha1_hex /;

my $data = '0000000002ccbe80';
my $key  = '48656c6c6f21deadbeef';

print hmac_sha1_hex_string($key, $data), "\n";

sub  hmac_sha1_hex_string {
   my ($key, $data) = map pack('H*', $_), @_;
   hmac_sha1_hex($data, $key);
}
Run Code Online (Sandbox Code Playgroud)