sus*_*shi 10 php security random passwords entropy
使用srand(time())生成的密码重置(或一个CSRF令牌)的令牌是不好的,因为令牌可以预见的.
我看了这些:
但我不明白令牌是如何可预测的.我明白,如果在一秒钟内我多次重置密码,我会得到相同的标记.我有以下代码:
<?php
srand(time());
$reset_password_token = rand(444444444444,999999999999);
?>
如果我在一秒钟内多次重置密码,我知道我得到相同的令牌,但攻击者如何利用它?
Alf*_*ssi 14
它限制了他们的暴力范围.例如,如果他们知道有人在最后一分钟内完成了重置,他们只需要尝试60个密码.
但它比这更糟糕.攻击者可以通过为该帐户启动密码重置来进入他们想要的任何帐户.在此之后,它们通过重复调用带有unix时间戳的srand来生成一些令牌,用于复位周围的一些小窗口,每次递增.除非您的时钟已关闭,否则其中一个令牌必须匹配.
Sco*_*ski 14
这假定需要256位随机数.
random_bytes(32) (PHP 7.0.0+)openssl_random_pseudo_bytes(32)mcrypt_create_iv(32, MCRYPT_DEV_URANDOM)/dev/urandom#4的代码片段:
<?php
function getRandom($bytes)
{
    // Read only, binary safe mode:
    $fp = fopen('/dev/urandom', 'rb');
    // If we cannot open a handle, we should abort the script
    if ($fp === false) {
        die("File descriptor exhaustion!");
    }
    // Do not buffer (and waste entropy)
    stream_set_read_buffer($fp, 0);
    $entropy = fread($fp, $bytes);
    fclose($fp);
    return $entropy;
}
mt_rand()rand()uniqid()microtime(true)lcg_Value()一个好的解决方案应该利用加密安全的伪随机数生成器(CSPRNG).在基于Unix的操作系统上,这可以通过直接读取来实现/dev/urandom.
但我不明白令牌是如何可预测的.
之前已经深入介绍了这个主题.
我有以下代码:
Run Code Online (Sandbox Code Playgroud)<?php srand(time()); $reset_password_token = rand(444444444444,999999999999); ?>
从理论上讲,这可能只有555555555555个值.不幸的是,实际数字要低得多.
rand()使用称为线性全等生成器的算法,由于它在PHP 5中的实现方式,它只适用于无符号32位整数.您提供的两个数字都大于2**32.我不确定它是否会溢出.在这种情况下,源代码不是很有启发性.
但是,因为你正在播种你的随机数time(),你将遇到麻烦.快速运行此代码:
<?php
srand(1431223543);
echo rand()."\n";
您应该1083759687在控制台中看到.通常,互联网上的计算机之间的时差非常小.您可能只考虑每个时区中最多2秒的可能抖动,并且只需要120次猜测(最差情况)即可开始预测随机数输出.永远.
对于与您的应用程序的安全性相关的任何事情,请使用CSPRNG.
攻击者可以知道/猜测系统的时间.当然,黑客无法知道确切的第二,因为对于大多数服务器而言可能有所不同.
但比如说当地时间是:
> echo time();
1431212010
然后你可以做出一个"很好的猜测",即种子将位于1431212005和之间1431212015.
因此,如果您可以进行10次猜测,那么密码很可能是正确的.
当然,黑客仍然需要知道"生成"密码的算法.但是对于大多数系统来说,这是相当简单的,而且总是在安全性方面,最好不要对系统知之甚少.毕竟,大多数黑客都可以创建自己的帐户并"检查"密码的生成方式并首先查找模式.
一个非常方便的破解密码的方法是在大约同一时间发布两个密码重置请求:假设您有一个帐户X并且您想要破解帐户Y.在一毫秒内,您可以提交两个请求,一个用于您自己和一个为受害者.接下来,您将收到密码,您可以将其用于这两个帐户.正如@AlfredRossi所说,你可以进一步列举网站的所有账户,从而破解大多数账户.
大多数系统提供了一种生成"真实随机"的方法(当然,无论我们是否谈论真正的随机性,这都是有争议的).例如,通过捕获音频通道处的噪声或听取其他"噪声".这些值不太可预测,因为很难猜出音频通道的测量强度是距离他/她的位置几千英里.