是使用microtime()生成密码重置令牌的不良做法

时间:2013-03-20 15:23:48

标签: php security web token microtime

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

  $token = md5(microtime());

这是安全问题吗?如果攻击者能够将时钟与服务器同步到一定程度的准确度,他们就可以强制使用令牌。 1秒同步只需要1,000,000次尝试,这对于一个问题来说并不是太疯狂。

这次攻击有多大可能成功?是否应该使用/ dev / urandom或openssl_pseudo_bytes()生成令牌? microtime()是不好的做法吗?

3 个答案:

答案 0 :(得分:4)

是的,这是一个安全问题!随着时间生成令牌是一种非常糟糕的做法。 Burp Suite使得攻击者可以使用可预测的暴力令牌变得微不足道,而基于时间的令牌是非常可预测的。 Burp允许某人轻松收集令牌并对其进行统计分析以确定熵。使用此信息,您可以轻松预测未来的令牌。

请记住,攻击者只需要纠正一次。错误数百万次没有任何区别。

以下是有关令牌生成的有用(且最近)StackOverflow帖子,可能对您有所帮助:REST Web Service authentication token implementation

答案 1 :(得分:0)

标记应始终随机创建,而不是微缩时。现在给出一些额外的安全性(因为,让我们再次面对它:计算机除了计算东西之外什么也做不了),你会想看到php的例子:http://php.net/manual/de/function.srand.php 另请参阅http://php.net/manual/de/function.chr.php以轻松创建“完全”随机字符串。我是这样做的

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;
    }

答案 2 :(得分:0)

是的,这是(我认为) 黑客可能会在1到2小时内猜出密码。 (如果服务器使用限制可以采取多少重置,黑客可以通过使用Botnet或使用大量时间和大量试验来避免它。

如果我是你,我会添加静态盐。应该从配置(或其他安全位置)加载盐。盐不应由服务器自己或任何人设置。它应该由一个真正的随机API生成(谷歌应该帮助你,但我想random.org提供一个) 如果你不能使用那个API,那么伪盐也应该有帮助,只要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);

//可能包含错误。未经测试。这只是一个例子,不应该通过复制和粘贴来实现。

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