Hash HMAC实现失败
我希望这是一个正确的论坛;我不确定我是否应该在stackoverflow、加密或安全方面问这个问题 所以我的问题是php的hash_hmac函数只在php>=5.1.2时可用。因为有些服务器没有更新到这个版本,所以我基于php的哈希函数编写了自己的HMAC实现。但是代码不会产生与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($
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);