Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.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()PHP函数的数据字符串的一部分是否安全?_Php_Security_Hash_Hmac - Fatal编程技术网

将密钥作为hash_hmac()PHP函数的数据字符串的一部分是否安全?

将密钥作为hash_hmac()PHP函数的数据字符串的一部分是否安全?,php,security,hash,hmac,Php,Security,Hash,Hmac,我需要生成一个身份验证令牌,将其包含在HTTP GET请求中,以远程主机为目标,在身份验证方面,我只有非常有限的选项 我需要用户登录到自动验证的页面。他/她必须执行非常具体的操作,而不是使用整个站点 我的想法是以以下方式使用PHP的hash\u hmac()函数: hash_hmac("sha512", $email . $glue . $secret_token . $glue . $_REQUEST["mt"], $secret_token); 因为我的系统与远程主机共享的字段很少:它们是

我需要生成一个身份验证令牌,将其包含在HTTP GET请求中,以远程主机为目标,在身份验证方面,我只有非常有限的选项

我需要用户登录到自动验证的页面。他/她必须执行非常具体的操作,而不是使用整个站点

我的想法是以以下方式使用PHP的
hash\u hmac()
函数:

hash_hmac("sha512", $email . $glue . $secret_token . $glue . $_REQUEST["mt"], $secret_token);
因为我的系统与远程主机共享的字段很少:它们是$email和$secret_令牌


将$secret_令牌放入数据字符串中是否会产生反作用或危险?

因此,HMAC处理一些信息。在您的示例中,我假定您有一个共享的秘密
$secret\u token
,它必须保持秘密,并且消息负载是公开的。消息中通常包含一个时间戳,并附加到用于过期目的的哈希中。例如:
$epoch\u time。"." . hash_hmac(“sha512”,$epoch_time.$message,$secret_令牌)其思想是,可以基于Unix时间戳检查消息,以查看消息是否超出传递窗口

将$secret_令牌放入数据字符串中是否会产生反效果或危险

简言之,是的。这并没有明显的危险性,但是在消息中添加一堆用户提供的(或秘密的)熵是没有意义的,因为hmac是为保持消息的公共性而设计的。hmac背后的想法是验证消息是否正确;也就是说,经过授权,未被篡改,并且可以选择特定年龄

系统之间的身份验证示例:

POST /api/1.0/resource/action HTTP/1.1
HOST: api.local
Content-Type: application/json
Authorization: hmac 1574268077.b8e7ae12510bdfb1812e463a7f086122cf37e4f7

{
  "some": "payload"
}
在接收服务器上,您将检查授权标头。第一部分(1574268077)以秒为单位告诉您消息的时间。第二部分(b8e7ae12510bdfb1812e463a7f086122cf37e4f7)是有效负载和时间戳的散列。在这种情况下,您可以使用
$epoch\u time的
$message
值来验证请求。
“{”some:“有效负载”}”
。检查时间很简单,
如果(time()-$epoch\u time>5*60){抛出新异常(“消息过期”)}
。我们检查时间戳的原因是为了避免潜在攻击者重播消息。窗口越小,越难滥用。我个人会在某个地方保留一个已使用但尚未过期的代币的运行列表,直到它们过期,以确保它们不能被使用两次。Redis或Memcached都是存储这样一个列表的好选择,因为缓存可以为您处理过期问题。关于GET/HEAD和其他不接受请求正文的端点的简要说明。这些请求的消息可能是包含查询参数的相对uri。

以什么方式。。。?如果你问的是散列值的话,没有人能够通过单独查看散列值来推断秘密是什么。。。为了验证HMAC,您需要原始消息。该消息将包括$secret_令牌。。。。