2014-08-27 51 views
2

我有两个字符串(键和数据),它们是十六进制字符串格式,我想采用它们的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 
+0

你从哪里得到'hmac_sha1_hex'? – Borodin 2014-08-27 22:37:22

+0

抱歉Borodin,我不太清楚我的理解你的问题:我使用Digest :: SHA qw(hmac_sha1_hex)来计算密钥和数据的hmac。但它似乎将输入视为文本,我希望它们被视为十六进制,如果这是有道理的。 – 2014-08-27 22:50:07

+1

我没有意识到有写入'Digest :: SHA'的HMAC功能。我已经添加了另一个解决方案来展示它是如何工作的。但问题的关键是使用'pack'将十六进制字符串转换为二进制。 – Borodin 2014-08-27 23:12:34

回答

5

我不知道你正在使用提供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,而不是面向对象式的程序界面做到这一点。

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); 
} 
+0

在我看来,OP出错的部分是_hex指*输出*,而不是*输入* – ysth 2014-08-27 22:54:46

+0

我确实意识到输出的_hex,我只是混淆了如何能够将输入视为十六进制。 – 2014-08-27 22:56:45

+0

@VijayBoyapati:我用更好的方式更新了我的答案。 – Borodin 2014-08-27 22:58:10

相关问题