Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.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
什么';我在PHP中实现HMAC有什么问题?_Php_Cryptography - Fatal编程技术网

什么';我在PHP中实现HMAC有什么问题?

什么';我在PHP中实现HMAC有什么问题?,php,cryptography,Php,Cryptography,我试图在PHP中实现一个通用的HMAC函数。我正在跟踪和,但我无法使我的函数与示例输出相匹配。我做错了什么 函数myHmac(字符串$data,字符串$key,可调用$algoFn,int$algoBlockSizeInBytes):字符串 { 如果(strlen($key)>algoBlockSizeInBytes) { $key=$algoFn($key);//比blocksize长的键会被缩短 } if(strlen($key)'54'->'545454…5454'('54'重复64次)的

我试图在PHP中实现一个通用的HMAC函数。我正在跟踪和,但我无法使我的函数与示例输出相匹配。我做错了什么

函数myHmac(字符串$data,字符串$key,可调用$algoFn,int$algoBlockSizeInBytes):字符串
{
如果(strlen($key)>algoBlockSizeInBytes)
{
$key=$algoFn($key);//比blocksize长的键会被缩短
}
if(strlen($key)<$algoBlockSizeInBytes)
{
$key=$key.str_repeat(0x00,$algoBlockSizeInBytes-strlen($key));//小于blocksize的键是零填充的
}
$outerKeyPad=str_repeat(0x5c,$algoBlockSizeInBytes)^$key;
$innerKeyPad=str_repeat(0x36,$algoBlockSizeInBytes)^$key;
返回bin2hex($algoFn($outerKeyPad.$algoFn($innerKeyPad.$data));
}
$md5Fn=函数($str){返回md5($str,true);};
回显“我的输出:”。myHmac(“,”,$md5Fn,64)。“\n”;
回显“正确输出:”。hash_hmac('md5',“”,“”)。“\n”;

使用整数而不是要重复的字符串调用
string\u repeat()
。因此,整数到字符串的转换适用。这意味着当前您将获得类似于
0x36
->
'54'
->
'545454…5454'
'54'
重复64次)的内容,等等。使用
chr(0x36)
获取实际字节。

使用整数而不是要重复的字符串调用
string\u repeat()
。因此,整数到字符串的转换适用。这意味着当前您将获得类似于
0x36
->
'54'
->
'545454…5454'
'54'
重复64次)的内容,等等。使用
chr(0x36)
获取实际字节。

尝试为OneHanks实现您自己的HMAC,这非常有用。我知道我不应该使用自己的密码。我在努力学习。另外,php不支持HMAC for SHA3,我需要它。php支持某些算法依赖于系统的任何内容,而其他算法则由php本机支持。sha384通常应该在那里。FWIW,XOR运算符
^
是按位的。您正在对字符串执行逐位运算,这将操作数转换为整数。假设结果是字符串。这可能是你在这里犯错误的主要原因。请再调试一下您的代码。@Sherif::
如果&、|和^运算符的两个操作数都是字符串,则该操作将对组成字符串的字符的ASCII值执行,结果将是字符串。
听起来正是我想要的,对吗?尝试为Onehanks实现您自己的HMAC,这很有帮助。我知道我不应该使用自己的密码。我在努力学习。另外,php不支持HMAC for SHA3,我需要它。php支持某些算法依赖于系统的任何内容,而其他算法则由php本机支持。sha384通常应该在那里。FWIW,XOR运算符
^
是按位的。您正在对字符串执行逐位运算,这将操作数转换为整数。假设结果是字符串。这可能是你在这里犯错误的主要原因。请再调试一下您的代码。@Sherif::
如果&、|和^运算符的两个操作数都是字符串,那么该操作将对组成字符串的字符的ASCII值执行,结果将是一个字符串。
听起来正是我想要的,对吗?是的,就是这样。谢谢。是的,就是这样。谢谢