我不知道你正在使用提供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);
}
你从哪里得到'hmac_sha1_hex'? – Borodin 2014-08-27 22:37:22
抱歉Borodin,我不太清楚我的理解你的问题:我使用Digest :: SHA qw(hmac_sha1_hex)来计算密钥和数据的hmac。但它似乎将输入视为文本,我希望它们被视为十六进制,如果这是有道理的。 – 2014-08-27 22:50:07
我没有意识到有写入'Digest :: SHA'的HMAC功能。我已经添加了另一个解决方案来展示它是如何工作的。但问题的关键是使用'pack'将十六进制字符串转换为二进制。 – Borodin 2014-08-27 23:12:34