使用microtime()生成密码重置令牌是不良实践吗?

6

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

  $token = md5(microtime());

这是一个安全问题吗?如果攻击者能够将时钟与服务器同步到一定的精度,他们可以通过暴力破解令牌。1秒的同步只需要尝试100万次,这并不是一个过于疯狂的问题。

这种攻击成功的可能性有多大?应该使用/dev/urandom或openssl_pseudo_bytes()生成令牌吗?microtime()是不好的实践吗?


为什么不使用 md5(microtime().mt_rand()); - Green Black
3个回答

4
是的,这是一个安全问题!使用时间生成令牌是一种非常糟糕的做法。 Burp Suite 让攻击者轻而易举地暴力破解可预测的令牌,而基于时间的令牌非常容易预测。Burp允许某人轻松收集令牌并对其进行统计分析以确定熵。使用此信息,您可以轻松预测未来的令牌。
请记住,攻击者只需要做一次正确的尝试。错误尝试数百万次没有任何区别。
以下是一个有用(且最近的)关于令牌生成的 StackOverflow 帖子,可能对您有帮助:REST Web Service authentication token implementation

0

Tokens should always be created at random, not microtime. Now to give some extra securty (because, let's face it once again: computers cannot do anything but calculate stuff), you'll want to see php's example: http://php.net/manual/de/function.srand.php Also see http://php.net/manual/de/function.chr.php to easily create a "completely" random string. Here's how I do it

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


6
令牌应始终随机生成,不使用微秒。- 你用“microtime”作为种子去种植MT?顺便说一下:“[注意:从PHP 4.2.0开始,无需使用'srand()'或'mt_srand()'来初始化随机数生成器,因为现在已自动完成此操作。](http://www.php.net/manual/en/function.mt-srand.php)” - Gumbo

0

是的,我认为是这样的。
黑客可能会在1到2小时内猜出密码。 (如果服务器使用限制重置次数的方法,黑客可以通过使用 Botnet或拥有很多时间和尝试次数来避免它。

如果我是你,我会添加一个固定的盐值。盐应该从配置文件(或其他安全位置)加载。盐不应由服务器自己或任何人设置。它应该由真正随机的API生成(谷歌应该能帮助您,但我想random.org提供了一个)。
如果您无法使用该API,伪盐也应该有所帮助,只要黑客不知道服务器何时设置(或服务器管理员有时会将其删除,但不是自动删除!)

例如:

$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')的“源代码”,他也应该能够看到数据库配置信息。这将是一个更大的问题。


好的想法,虽然我不确定在这种情况下静态盐是否有帮助,因为熵非常低(并且它是100%可预测的)。为了有效,盐需要是动态和非常随机的。在我看来,最好使整个令牌完全随机。 - Freedom_Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接