perl - 为什么 Digest::SHA 产生的散列与 RFC 4868 中显示的散列不同?

标签 perl encryption hash digest

我正在尝试编写一些 Perl 以与其他语言(此时为 Java)的哈希函数进行互操作。我们已经找到了大概是正确的来源,RFC 4868其中包括一些测试键和字符串及其散列值。我正在使用以下代码片段,但无法让 Perl 得出相同的结果。我只能假设我使用不当 - 谁能指出正确的方向?

use Digest::SHA qw(hmac_sha512_hex);
my $key = '0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b';
my $value = '4869205468657265';
print hmac_sha512_hex($value, $key);

输出是“4ef7 ... 5d40”,尽管 RFC 4868(和我同胞的 Java 实现)返回“87aa ... 6854”

最佳答案

use Digest::SHA qw(hmac_sha512_hex);
my $key = pack('H*','0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b');
my $value = "Hi There";
print hmac_sha512_hex($value, $key);

给予

87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cdedaa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854

引用 RFC:

Key =          0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b
               0b0b0b0b                          (20 bytes)

Data =         4869205468657265                  ("Hi There")

PRF-HMAC-SHA-512 = 87aa7cdea5ef619d4ff0b4241a1d6cb0
                   2379f4e2ce4ec2787ad0b30545e17cde
                   daa833b7d6b8a702038b274eaea3f4e4
                   be9d914eeb61f1702e696c203a126854

附言将 '0x' 添加到字符串不会使其成为二进制,而是使其以 '0''x' 开头 ;-)

关于perl - 为什么 Digest::SHA 产生的散列与 RFC 4868 中显示的散列不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1467555/

相关文章:

javascript - 在 C# 中重现 JS PBKDF2 哈希

python - 使用不同版本的 sha 散列(hashlib 模块)是否有显着的开销

mysql - 为什么这个 Perl DBI/DBD MySQL (MariaDB) 连接到本地主机无法工作?

iphone - 在 iPhone OS 中加密 SQLite 数据库文件

hash - 是否可以解密 MD5 哈希值?

c - 我的密码给我一个浮点异常,我不知道为什么?

python - 在 Python 中散列(隐藏)字符串

regex - 如何匹配以换行符或逗号开头的字符串?

mysql - Perl 支持 Mac 错误

perl - 将 ArrayRef 解包为 X 个单独的参数