php - 我如何为 PHP 改进这个 NONCE 库?

标签 php security

这是我第一次使用随机数,所以我从 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;
}

另外,我有两个关于原始库的问题:

  1. 为什么不使用 NONCE_UNIQUE_KEY?作者只是忘记了吗?
  2. 为什么作者在这里除以二:$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/

相关文章:

c# - 代码访问安全 - 理解为什么 SecurityTransparent 可以调用 SecurityCritical

php - 无法在 json php 中获取大量数据

javascript - HTML 保护密码字段

python - 从头开始了解 CGI 和 SQL 安全性

php - 如何限制用户未登录就进入页面

android - SslErrorHandler proceed() 函数的实现

security - 您何时可以信任自己实现基于密码的解决方案?

php - 查找添加的好友 MySQL(关系型)

javascript - 两个按钮中只有一个需要输入

javascript - 表单不使用 Ajax,直接发布到 PHP