-->

使用microtime中()来生成密码重置令牌坏习惯(Is using microtime() to

2019-07-22 03:52发布

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

  $token = md5(microtime());

这是一个安全问题? 如果攻击者能够与服务器的时钟同步到精确度,他们可以蛮力令牌。 1秒同步仅需要百万的尝试,这是不是太疯狂了一个问题。

怎么可能是这种攻击成功? 应一个来生成具有的/ dev / urandom的或openssl_pseudo_bytes()代替令牌? 是microtime中()不好的做法?

Answer 1:

是的,它是一个安全问题! 随着时间的推移生成的令牌是一个非常不好的做法。 打嗝套房使得平凡的攻击者基于时间蛮力令牌是可以预见的,并且令牌是很容易预测。 打嗝让别人轻松收集令牌并对其进行统计分析,以确定熵。 使用这个信息,你可以很容易地预测未来的令牌。

记住,攻击者只需要得到它的权利一次。 得到它错了数百万次的没有什么区别。

这是一个有益的(最近)的StackOverflow发布有关令牌生成,可能会对你有所帮助: REST Web服务的身份验证令牌实现



Answer 2:

令牌应该总是随意,不microtime中创建。 现在给一些额外的securty(因为,让我们再一次面对的是:计算机不能做任何事情,但计算的东西),你会希望看到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; } 



Answer 3:

是的,这是(我认为)。
黑客可能能够在1〜2小时猜测密码。 (如果服务器使用限制太多重置如何可以采取黑客可以通过使用避免它的僵尸网络或与具有大量的时间和大量的试验。

如果我是你,我会添加静态盐。 所述盐应当从一个配置(或者其他安全的地方)被加载。 盐不应由服务器自身或任何人进行设置。 它应该由真正的随机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”)“源代码”,他应该能够看到数据库的configs了。 而这将是一个更大的问题。



文章来源: Is using microtime() to generate password-reset tokens bad practice