这是我第一次使用随机数,所以我从 http://fullthrottledevelopment.com/php-nonce-library 下载了脚本.我不喜欢这段代码,尤其是因为合法请求有可能被视为无效,因为该函数以定义的时间间隔(默认为 300 秒)运行。
例如,当生成 nonce 时,我们可能在 300 秒的 299 秒内,因此 nonce 只能工作 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;
}
另外,我有两个关于原始库的问题:
- 为什么不使用
NONCE_UNIQUE_KEY
?作者只是忘记了吗? - 为什么作者在这里除以二:
$i = ceil( time()/( FT_NONCE_DURATION/2 ) );
,然后只有一半时间有效(我试过了)
最佳答案
这会产生一个随机数,但它不是加密随机数。此库生成的值绝不能用于安全性,因为它在很大程度上依赖于时间的使用。攻击者知道当前时间,并且知道您的服务器时间,因为它在 http 响应 header 中。 md5() 的 prng 输出也不像它应该的那样随机。有许多针对 md5 的已知漏洞,它应该永远用于安全性。 10 字节的 base 16 也非常小,16 字节的 base256 将是理想的。
如果您需要一个相当难以猜测的唯一值,那么这在大多数情况下都有效:
sha1(uniqeid(mt_rand(),true));
然而,这并不理想。输出是 base16,这非常浪费空间。 uniqeid() 仍然使用时间,但是结果值中还有其他熵源。
迄今为止最好的网络应用程序的熵源是/dev/urandom
并使用fopen()
访问它并读取输出 base256 内容的 16 个字节。/dev/urandom 是一个熵存储,它从操作系统、硬件和系统上所有应用程序的行为中收集随机源。
关于php - 我如何为 PHP 改进这个 NONCE 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11726984/