Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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 截断密钥散列是否会使其更安全?_Php_Security_Cookies - Fatal编程技术网

Php 截断密钥散列是否会使其更安全?

Php 截断密钥散列是否会使其更安全?,php,security,cookies,Php,Security,Cookies,我想设置一个受信任的浏览器cookie,允许用户通过电子邮件绕过双因素身份验证,前提是他们以前已成功登录到给定的计算机。这样做的目的是为了方便用户登录受信任的机器 我的想法是创建电子邮件地址的密钥散列,如下所示: <?php define('HASH_KEY', '5sqAgsdwqNWEHpEz3pAFVQUb2Mr7acHtuezKSVykX52bCKeSJmo236HtE0U9Noj2); $hash = hash_hmac('sha256', $email, HASH_KEY);

我想设置一个受信任的浏览器cookie,允许用户通过电子邮件绕过双因素身份验证,前提是他们以前已成功登录到给定的计算机。这样做的目的是为了方便用户登录受信任的机器

我的想法是创建电子邮件地址的密钥散列,如下所示:

<?php
define('HASH_KEY', '5sqAgsdwqNWEHpEz3pAFVQUb2Mr7acHtuezKSVykX52bCKeSJmo236HtE0U9Noj2);
$hash = hash_hmac('sha256', $email, HASH_KEY);
// E.g. '9fa0d85b36919dc87ee01171edf6bdc302ffbc78e0c7f1738d295e76e442ccd4'
然后,计划是将截断的哈希存储在cookie中,作为受信任的浏览器令牌。然后,当用户稍后尝试登录时,使用登录期间提供的相同散列密钥和电子邮件地址重新生成完整的散列,然后将新散列的前16位数字与cookie进行比较。如果它们匹配,则绕过2fa,否则我们需要它


所以我的问题是,由于散列不完整,这个截断过程是否会使散列更安全?或者我也可以使用完整的散列,因为没有区别吗?

问题很好,16字节的熵足够安全,如果它只是一个跳过2因子的标志,而你仍然像往常一样进行登录,我会与其他检查争论,比如失败的登录计数,你甚至可以使用4个字符。它不是16个字节的“熵”,因为它们是从一个基于64位编码的字符串(每个字符6位)中提取的。除此之外,使用完整的256位输出更安全。一般来说,最好在晚上问这些问题。4个字符为您提供24位的安全性,这是可笑的低。
$hash = substr($hash, 0, 16);
// E.g. '9fa0d85b36919dc87'
?>