Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.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 使用microtime()生成密码重置令牌的做法是否错误_Php_Security_Web_Token_Microtime - Fatal编程技术网

Php 使用microtime()生成密码重置令牌的做法是否错误

Php 使用microtime()生成密码重置令牌的做法是否错误,php,security,web,token,microtime,Php,Security,Web,Token,Microtime,在PHP中,我注意到一些框架使用microtime()函数生成密码重置令牌,如下所示: $token = md5(microtime()); 这是安全问题吗?如果攻击者能够将时钟与服务器同步到一定的精度,他们可能会强行使用令牌。1秒同步只需要1000000次尝试,这不是一个太疯狂的问题 这次攻击成功的可能性有多大?应该使用/dev/uradom或openssl\u pseudo\u bytes()生成令牌吗?microtime()是错误的做法吗?令牌应该总是随机创建的,而不是microti

在PHP中,我注意到一些框架使用microtime()函数生成密码重置令牌,如下所示:

  $token = md5(microtime());
这是安全问题吗?如果攻击者能够将时钟与服务器同步到一定的精度,他们可能会强行使用令牌。1秒同步只需要1000000次尝试,这不是一个太疯狂的问题


这次攻击成功的可能性有多大?应该使用/dev/uradom或openssl\u pseudo\u bytes()生成令牌吗?microtime()是错误的做法吗?

令牌应该总是随机创建的,而不是microtime。现在,为了给大家提供一些额外的安全性(因为,让我们再一次面对它:计算机除了计算之外什么都做不了),您需要看看php的示例: 另请参见轻松创建“完全”随机字符串。下面是我如何做的
mt_srand((双)微时间()*1000000);
mt_srand((double) microtime() * 1000000);
    function random_string ($length = 16)
    {
        $string = "";
        for ($n = 0; $n < count($length); $n++) $string .= chr(rand(32, 126));
        return $string;
    }
函数随机字符串($length=16)
{
$string=“”;
对于($n=0;$n

是的,是(我想)。
黑客可以在1到2小时内猜出密码。(如果服务器使用了可以重置的限制,黑客可以通过使用或使用大量时间和大量试验来避免

如果我是你,我会添加一个静态salt。salt应该从配置(或其他安全位置)加载。salt不应该由服务器自己或任何人设置。它应该由真正的随机API生成(谷歌应该帮助你,但我想random.org提供了一个)。
如果您不能使用该API,那么伪salt应该也会有帮助,只要hecker不知道服务器是何时设置的(或者服务器管理员有时可能会删除它,但不是自动删除!)

例如:

$salt = null;
include('protectedDir/salt.php'); // Here should stand "$salt = ''"
if ($salt == null){
// Using real random api
file_put_contents('protectedDir/salt.php', '<?php \$salt = \'$salt\'; ?>)";
}

$resetKey = sha1(microtime() . $salt);
$salt=null;
include('protectedDir/salt.php');//这里应该有“$salt=”
如果($salt==null){
//使用真实随机api
文件内容('protectedDir/salt.php',');
}
$resetKey=sha1(microtime().$salt);
//可能包含bug。未测试。这只是一个示例,不应通过复制和粘贴来实现


如果黑客能够访问php文件('protectedDir/salt.php')”源代码"他也应该能够看到数据库配置。这将是一个更大的问题。

是的,这是一个安全问题!随着时间生成令牌是一个非常糟糕的做法。这使得攻击者可以轻易地强制使用可预测的令牌,而基于时间的令牌是非常可预测的。Burp允许某人轻松地收集令牌并对其进行验证对它们进行统计分析以确定熵。使用这些信息,您可以轻松预测未来的代币

记住,攻击者只需要纠正一次就可以了。数百万次的错误都没有关系


这里有一篇关于令牌生成的有用(也是最近的)StackOverflow帖子,可能对您有所帮助:

为什么不
md5(microtime().mt_rand());
?“令牌应该总是随机创建的,而不是microtime。”——顺便说一句,您可以使用
microtime
”为mt播种种子:好的想法,虽然我不确定静态salt在这种情况下是否有用,因为熵非常低(而且它是100%可预测的)。为了有效,salt需要是动态的并且非常随机的。在我看来,最好是将整个令牌完全随机。