我有两个字符串(键和数据),它们是十六进制字符串格式,我想要使用它们的HMAC。字符串是:
$data = "0000000002ccbe80";
$key = "48656c6c6f21deadbeef";
我想生成javascript jsSHA函数的等价物,其中字符串被视为十六进制字符串。此演示http://caligatio.github.io/jsSHA/允许您指定键和数据是HEX字符串。
但是,当我在Perl中使用hmac_sha1_hex($data, $key)
时,字符串被视为文本。我得到了hmac_sha1_hex的输出:
775083be8f8c94baea8d12a5038d191cab3759ac
如何生成与jsSHA演示相同的输出,其中两个输入都被视为十六进制,输出也是十六进制?我想要这个输出:
f2ea4899a8582c21610085988c54645fd7193393
答案 0 :(得分: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;
}
<强>输出强>
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
的过程接口而不是面向对象的样式来完成它。
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);
}