Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hash HMAC实现失败_Hash_Php_Hmac - Fatal编程技术网

Hash HMAC实现失败

Hash HMAC实现失败,hash,php,hmac,Hash,Php,Hmac,我希望这是一个正确的论坛;我不确定我是否应该在stackoverflow、加密或安全方面问这个问题 所以我的问题是php的hash_hmac函数只在php>=5.1.2时可用。因为有些服务器没有更新到这个版本,所以我基于php的哈希函数编写了自己的HMAC实现。但是代码不会产生与hash_hmac相同的输出 那么我的错误在哪里呢 define("HASH_ALGO", "sha512"); define("HMAC_BLOCKSIZE", 64); function computeHMAC($

我希望这是一个正确的论坛;我不确定我是否应该在stackoverflow、加密或安全方面问这个问题

所以我的问题是php的hash_hmac函数只在php>=5.1.2时可用。因为有些服务器没有更新到这个版本,所以我基于php的哈希函数编写了自己的HMAC实现。但是代码不会产生与hash_hmac相同的输出

那么我的错误在哪里呢

define("HASH_ALGO", "sha512");
define("HMAC_BLOCKSIZE", 64);

function computeHMAC($message, $key) {
    $ikey;
    $okey;
    $zero = hex2bin("00");
    $ipad = hex2bin("36");
    $opad = hex2bin("5C");

    /*
     *  HMAC construction scheme:
     *  $ikey = $key padded with zeroes to blocksize and then each byte xored with 0x36
     *  $okey = $key padded with zeroes to blocksize and then each byte xored with 0x5C
     *  hash($okey . hash($ikey . $message))
     */

    //Hash key if it is larger than HMAC_BLOCKSIZE
    if (strlen($key) > HMAC_BLOCKSIZE) {
        $key = hash(HASH_ALGO, $key, true);
    }
    //Fill ikey with zeroes
    for ($i = 0; $i < HMAC_BLOCKSIZE; $i++) {
        $ikey[$i] = $zero;
    }
    //Fill ikey with the real key
    for ($i = 0; $i < strlen($key); $i++) {
        $ikey[$i] = $key[$i];
    }
    //Until they get xored both keys are equal
    $okey = $ikey;
    //Xor both keys
    for ($i = 0; $i < HMAC_BLOCKSIZE; $i++) {
        $ikey[$i] ^= $ipad;
        $okey[$i] ^= $opad;
   }
   //Build inner hash
   $innerHash = hash(HASH_ALGO, $ikey . $message, true);
   //Build outer hash
   $outerHash = hash(HASH_ALGO, $okey . $innerHash, true);
   return $outerHash;
}

问题是你把摘要大小和块大小弄混了;SHA-512的摘要大小为64,但块大小为128

其次,
$ikey
$okey
都是数组而不是字符串,因此需要首先将它们转换为字符串:

$innerHash = hash(HASH_ALGO, join($ikey) . $message, true);
$outerHash = hash(HASH_ALGO, join($okey) . $innerHash, true);

这就是说,
hash()
hash_hmac()
都是从5.1.2开始提供的,所以我不确定这将实现什么:)

我认为这应该是StackOverflow。它与加密和安全性有关,但您需要的是编程解决方案。我投票赞成移动它,请不要在StackOverflow上发布相同的问题。好的。如果我正确理解迁移系统,我没有足够的声誉来迁移我自己的问题,所以我需要等待管理员为我做这件事?好的,非常感谢:DQuestioner提到了
hash()
,并且
hash\u hmac()
可用于php>=5.1.2。可能,提问者提问的最大原因是,他可能会使用比这更低的php。@KeithPark不是真的,OP只提到“php的hash_hmac函数仅在php>=5.1.2时可用”。。。但他自己的代码中包含了“hash()”的用法,根据文档,该用法也仅在5.1.2之后才可用。噢~对不起,我误解了你的意思。你说得对<如果php版本低于此版本,则无法使用code>hash()本身。我不知道只有php>5.1.2才正式支持hash。我的服务器PHP5.0.2支持“hash”,但不支持hashhmaco.o。可能是修补过的,或者某个模块提供了一个与php自己的hash类似的hash函数……为什么要使用这么旧的php版本?
$innerHash = hash(HASH_ALGO, join($ikey) . $message, true);
$outerHash = hash(HASH_ALGO, join($okey) . $innerHash, true);