7

这是我第一次使用 nonce,所以我从http://fullthrottledevelopment.com/php-nonce-library下载了脚本。我不喜欢该代码,尤其是因为该函数以定义的时间间隔(默认为 300 秒)工作,因此有可能将合法请求视为无效。

例如,当随机数生成时,我们可以在 299 秒到 300 秒,所以随机数只能工作 1 秒。

我将库修改为以下函数。我所做的是使用 . 检查当前间隔和上一个间隔nonce_create(time()-NONCE_DURATION)==$nonce。有没有办法进一步改进功能?:

define( 'NONCE_UNIQUE_KEY' , '123123' );
define( 'NONCE_DURATION' , 300 );

function nonce_create($time=false){
    if(!$time)
        $time=time();
    $i=ceil($time/(NONCE_DURATION));
    return substr(md5($i.NONCE_UNIQUE_KEY),-12,10);
}

function nonce_is_valid($nonce){
    if (nonce_create()==$nonce || nonce_create(time()-NONCE_DURATION)==$nonce)
        return true;
    return false;
}

另外,我对原始库有两个问题:

  1. 为什么不NONCE_UNIQUE_KEY使用?作者是不是忘记了?
  2. 为什么作者在这里除以二:$i = ceil( time() / ( FT_NONCE_DURATION / 2 ) );,它只工作了一半的时间(我试过了)
4

1 回答 1

1

这会产生一个随机数,但它不是加密随机数。这个库产生的值不能用于安全性,因为它严重依赖于时间的使用。攻击者知道当前时间,并且知道您的服务器时间,因为它在 http 响应标头中。此外,md5() 的 prng 输出并不像应有的那样随机。有许多针对 md5 的已知漏洞,绝对不应其用于安全性。base 16 的 10 个字节也非常小,base256 的 16 个字节将是理想的。

如果您需要一个相当难以猜测的唯一值,那么这在大多数情况下都有效:

sha1(uniqeid(mt_rand(),true));

然而,这并不理想。输出是base16,非常浪费空间。uniqeid() 仍然使用时间,但是结果值中还有其他熵源。

到目前为止, Web 应用程序的最佳熵源是用于/dev/urandom访问fopen()它并读取 16 个字节的 base256 内容。/dev/urandom 是一个熵存储,它从操作系统、其硬件以及系统上所有应用程序的行为中收集随机源。

于 2012-07-30T21:54:51.493 回答