我不知道你正在使用提供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