2014-08-27 52 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

相關問題