在Perl中使用十六进制字符串的SHA1 HMAC
问题描述:
我有两个字符串(键和数据),它们是十六进制字符串格式,我想采用它们的HMAC。字符串是:在Perl中使用十六进制字符串的SHA1 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::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