perl - 在 Perl 中获取十六进制字符串的 SHA1 HMAC

标签 perl hex hmacsha1

我有两个十六进制字符串格式的字符串( key 和数据),我想获取它们的 HMAC。字符串是:

$data = "0000000002ccbe80";
$key  = "48656c6c6f21deadbeef";

我想生成与 javascript jsSHA 函数等效的函数,其中字符串被视为十六进制字符串。这个演示http://caligatio.github.io/jsSHA/让您指定键和数据是十六进制字符串。

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

775083be8f8c94baea8d12a5038d191cab3759ac

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

f2ea4899a8582c21610085988c54645fd7193393

最佳答案

我不知道您使用哪个模块来提供 hmac_sha1_hex,但我推荐使用 Digest 系列模块。如果您使用Digest::HMACDigest::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;
}

输出

f2ea4899a8582c21610085988c54645fd7193393
<小时/>

更新

我忽略了还有一个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);
}

输出与之前的代码相同。

<小时/>

更新

为了完成设置,这是如何使用 Digest::HMAC 的过程接口(interface)而不是面向对象的风格来完成此操作。

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);
}
<小时/>

更新

我刚刚阅读了您对我的评论的回答。我没有意识到 Digest::SHA 中写入了 HMAC 功能。使用该模块及其 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);
}

关于perl - 在 Perl 中获取十六进制字符串的 SHA1 HMAC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25537804/

相关文章:

multithreading - Perl:让线程进入休眠状态

Ruby 的 String#hex 混淆

python - 在Python中将转义的十六进制字符串转换为十六进制数字

android - 有没有在android中创建Hmac256字符串的函数?

perl - 发送数据前检查socket是否连接

regex - 如何从 CSV 中除一列之外的所有列中删除前导和尾随空格?

C++ OpenSSL HMACSHA1 可以工作,但不是我想要的

c# - 使用 openssl 在 iPhone 上正确获取 HMACSHA1

regex - perl 正则表达式不匹配带有换行符的字符串\n

php - 如何从字符串中删除零宽度非连接器?