HMAC SHA512输出在Perl中有所不同

时间:2013-03-27 17:18:53

标签: perl hmac sha512

我观察到,每次执行脚本时,给定数据和密钥的HMAC SHA512输出都会有所不同。

首先,我举一个输出不变的脚本示例:

#! /usr/bin/perl

use Digest::SHA qw(hmac_sha512_hex);
use warnings;

$data="test";
$key="20202020";

print hmac_sha512_hex($data,$key),"\n";

我运行此脚本两次并获得相同的输出:

perl test.pl
457a1ff378f11880defaa91675de4633d1f1e69712b5dccd2f86612224b825b4461a9215a37cce53
8e7f5de43a6900867667b9361af38df32fc58e54d7ce9a02

perl test.pl
457a1ff378f11880defaa91675de4633d1f1e69712b5dccd2f86612224b825b4461a9215a37cce53
8e7f5de43a6900867667b9361af38df32fc58e54d7ce9a02

现在我按如下方式修改脚本中的数据变量:

#! /usr/bin/perl

use Digest::SHA qw(hmac_sha512_hex);
use warnings;

$data={'method' => 'test', 'value' => 21};
$key="20202020";

print hmac_sha512_hex($data,$key),"\n";

现在每次运行脚本时输出都不同:

perl test.pl
cb1a40ba7a7f52da39dc0a3f130399dfbecb5249946057fd19887b72a58701f28452f6e663153bb6
85a4b86f9d427de4af5904801e11cb6fcbc272344605c2a9

perl test.pl
73dd1678a4e7f29f8032a65cbe979248b3e41cd6ed7aa81e5b214b8b6232af1e7a6683412b8532b7
187313d2c2a96c7e5009a9362690f355028b56ca319825e4

我该如何纠正?

2 个答案:

答案 0 :(得分:3)

您传递到hmac_sha512_hex的数据被解释为字符串。您将它作为哈希的引用传递。您可以在将$data传递给函数之前打印hmac_sha512_hex的值来验证这一点。

您的引用只是哈希的唯一标识符。 Perl不保证您在程序的不同运行中获得相同数据的相同哈希引用。因此,您将不同的值传递给$Data::Dumper::Sortkeys,这显然会给您不同的输出。

如果您希望输出相同,那么您需要找到一种方法,每次都将相同的字符串传递给函数。一种简单的方法可能是使用从Data::Dumper的Dumper函数返回的字符串。

更新:如果您使用Data :: Dumper,则需要将{{1}}设置为真值。

答案 1 :(得分:1)

当您将$ data传递给hmac_sha512_hex函数时,您传递的变量地址将在每次运行程序时更改。您将不得不考虑以一致的方式将哈希序列化为字符串。