gpt4 book ai didi

hash - HMAC 执行失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:44:26 28 4
gpt4 key购买 nike

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

所以我的问题是 php 的 hash_hmac 函数只适用于 php >=5.1.2。因为一些服务器没有更新到这个版本我写了我自己的 HMAC-implementaion 基于 php 的散列函数。但是代码不会产生与 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;
}

该功能已通过以下代码进行测试:

echo hexDump(computeHMAC("Testolope", "Testkeyolope"));
echo hexDump(hash_hmac(HASH_ALGO, "Testolope", "Testkeyolope", true));

The output is the following:
HexDump (64 Bytes):
65 a8 81 af 49 f2 49 c5 64 7a 7a b7 a6 ac a0 4e 9e 9b 1a 3c 76 fc 48 19 13 33 e0 f8 82 be 48 52 1a 50 49 09 1e fe bf 94 63 5f 9d 36 82 3f 2f a1 43 b4 60 9f 9f e5 d1 64 c6 5b 32 22 45 07 c9 cb

HexDump (64 Bytes):
d2 e9 52 d2 ab f0 db a7 60 e0 52 b0 5c 23 5a 73 d9 8c 78 8e 9e fb 26 82 54 7e f9 c8 f1 65 df 7f 97 44 fe 2b 1e 2b 6d d5 cb a4 ba c6 73 35 06 9c 0f c8 2d 36 8c b3 9b c4 48 01 5c c2 9f ce b4 08

最佳答案

问题是您混淆了摘要大小和 block 大小; SHA-512 的摘要大小为 64,但 block 大小为 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 开始可用,所以我不确定这会实现什么:)

关于hash - HMAC 执行失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26331463/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com