hash_hmac如何处理十六进制输入?

时间:2013-01-02 03:58:06

标签: php hmacsha1

我正在尝试在php中执行一些十六进制字节的hmac哈希。不确定我是否正确理解哈希或十六进制表示,因为2个哈希值不匹配,例如

<?php
echo bin2hex("\x32\x45\xff\xca".pack("N",1))."\n";
echo hash_hmac('sha1', '\x32\x45\xff\xca\x00\x00\x00\x01', 'secret')."\n";
echo hash_hmac('sha1', '\x32\x45\xff\xca'.pack("N",1), 'secret')."\n";

给出

3245ffca00000001
3710e984df2fe4c53e0a9760cf0480357c6e431c
6308db257308f3466430807eb622489c7fff84df

这些字节对我来说似乎是相同的,但它们给出了不同的哈希...

2 个答案:

答案 0 :(得分:1)

猜猜看,我需要的是使用双引号而不是单引号,'\x32\x45\xff\xca\x00\x00\x00\x01'的两个哈希值都不正确。

所以

echo hash_hmac('sha1', "\x32\x45\xff\xca\x00\x00\x00\x01", 'secret')."\n";
echo hash_hmac('sha1', "\x32\x45\xff\xca".pack("N",1), 'secret')."\n";

给出正确的东西

cde1e3710b6265b77fd4ac84293e20d981e92a6a
cde1e3710b6265b77fd4ac84293e20d981e92a6a

微妙但真实,测试出here

答案 1 :(得分:0)

这是因为在你的输入中:

      echo hash_hmac('sha1', '\x32\x45\xff\xca\x00\x00\x00\x01', 'secret')."\n";
      echo hash_hmac('sha1', '\x32\x45\xff\xca'.pack("N",1), 'secret')."\n";

hash_hmac d的字符串不同,

     echo '\x32\x45\xff\xca\x00\x00\x00\x01'; // output : \x32\x45\xff\xca\x00\x00\x00\x01
     echo '\x32\x45\xff\xca'.pack("N",1);     // output : \x32\x45\xff\xca

这就是为什么你的答案会有所不同。