Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php CSRF令牌和nonce中的熵_Php_Security_Zend Framework_Hash_Nonce - Fatal编程技术网

Php CSRF令牌和nonce中的熵

Php CSRF令牌和nonce中的熵,php,security,zend-framework,hash,nonce,Php,Security,Zend Framework,Hash,Nonce,我正在用Zend Framework制作一个分类广告网站(就投资组合而言,是的,我知道世界上没有“另一个Craigslist克隆版”的空间)。我正在尝试实现无需帐户即可发布/编辑/删除的功能 为此,我觉得我需要在提交后生成一个Nonce并存储在数据库中。然后通过电子邮件向用户发送一个链接,该链接发出删除GET请求,如下所示: protected function _generateHash() { $this->_hash = md5( mt_rand(1,1000

我正在用Zend Framework制作一个分类广告网站(就投资组合而言,是的,我知道世界上没有“另一个Craigslist克隆版”的空间)。我正在尝试实现无需帐户即可发布/编辑/删除的功能

为此,我觉得我需要在提交后生成一个Nonce并存储在数据库中。然后通过电子邮件向用户发送一个链接,该链接发出删除GET请求,如下所示:

protected function _generateHash()
{
    $this->_hash = md5(
        mt_rand(1,1000000) 
        .  $this->getSalt() 
        .  $this->getName() 
        .  mt_rand(1,1000000)
    );
    $this->setValue($this->_hash);
}

只有用户有这个唯一的密钥或nonce,在提交时,我检查post的ID下的数据库,并确保在删除之前nonce匹配

我的问题是现在的情况到底有多安全。如果我使用Zend Framework的
Zend\u Form\u Element\u散列
,它会创建如下散列:

protected function _generateHash()
{
    $this->_hash = md5(
        mt_rand(1,1000000) 
        .  $this->getSalt() 
        .  $this->getName() 
        .  mt_rand(1,1000000)
    );
    $this->setValue($this->_hash);
}
在阅读有关mt_rand()的文章时,“此函数的entrophy有限。因此,如果您想创建随机字符串,则无论字符串的长度如何,它只会生成大约20亿个不同的字符串。如果您将此类字符串用于会话标识符、密码等,这可能是严重的安全问题。”

由于应用程序中的nonce/token的生命周期,可能是用户选择删除帖子之前的几天或几周,我认为对于潜在的黑客来说,将有足够的时间

我意识到,
mt_rand()
是从
rand()
的巨大升级,如图中所示,左侧是
rand
,右侧是
mt_rand
。但这足够了吗?是什么让“20亿个不同的字符串”成为一个安全问题


最终,如何增加nonce/token/hash的熵?

对于这样的安全性,重要的不仅仅是输出的长度。它计算你用来创建它的随机性

对于
mt_rand()
随机性的来源是其种子和状态(自种子设定以来您使用它的次数)。更多的
mt_rand()
调用只会让您对相同的随机性源进行更多的重新调整(没有新的熵)

mt_rand()

具有32位熵的密钥的强度为40亿除以(大致)将生成的密钥数(例如,在100K使用后,将有约1:43000的机会猜测任何有效密钥,这接近实际的暴力强制)

你在这上面加了盐,这使得它更加强大,因为除了猜测种子攻击者还必须知道盐,所以如果盐很长,那么尽管“低”熵,但总的来说密钥可能相当强大

要增加熵,您需要添加更多来自不同来源的随机内容(即使稍微随机也可以,只需提供较少的位),而不是mt_rand:
microtime()
、使用的内存量、进程ID。。。或者只需使用
/dev/random
,它可以收集所能获得的所有熵


(编辑:uniqid()的熵很弱,因此在这里没有帮助)

上面的Zend hash生成代码为md5()哈希函数输入了1000000 X 1000000种不同的可能性。无论输入是什么,md5()都有32^16(1208925819614629174706176)个可能的结果。平均而言,黑客需要向您的服务器发送500000000000个请求才能猜出正确的时间


以每分钟100个请求的速度,大约需要3472222天进行黑客攻击。

只要确保在提交内容上添加验证码,否则您的帖子将充斥着垃圾邮件。@dqhendricks是的,这是我将要实现的,但应该相对容易。太糟糕了,我不能接受多个答案:(根据他在上面使用的算法,它比猜测mt_rand()的结果要复杂得多。uniqid()简单地生成十六进制形式的当前时间戳,如果为true,它将使用十六进制形式的当前时间戳+微秒。我想这将更容易猜测,特别是如果文章附加了时间。@dqhendricks它确实将时间附加到文章上。有没有方法将/dev/random与这些函数一起使用s?@cillosis正如我在回答中所解释的,Zend哈希生成的可能结果远远高于mt_rand()。你把这件事复杂化了。@dqhendricks:谢谢你提供有关uniqid的信息。在我的回答中,我注意到尽管有32位熵,但salt使它变得强大(虽然如果salt本身是短期的,那么这可能仍然是可以强制执行的)。这听起来确实足够了。实际上,我们谈论的是一个用于出售人们的垃圾的应用程序……而不是高安全性的银行业务。我只是试图提高实践和投资组合方面的安全性。@porenel自rt_rand()以来结果是散列的,没有办法做到你所说的。@此外,我知道md5的可能结果的数量是不相关的,因此我的计算中没有使用它们。但是,如果可能结果的数量小于1000000 X 1000000,那么它们就会变得相关,这就是为什么它们被包括在我的答案。@dqhendricks:mt_rand调用不是独立的,所以这里的乘法是不正确的。如果攻击者能够猜出mt_rand的种子,他就可以计算两个调用的结果。md5()组合的数量在这里是一个危险的问题,因为它不会增加任何熵(它最多可以有和它得到的唯一输入一样多的输出)@dqhendricks这些mt_rand调用永远不会给你10^12个唯一的组合。种子是32位的,所以你只能得到与种子一样多的组合(我假设每个请求计算一次,每个请求都重新播种)-知道算法的攻击者只需要测试从2^32个种子派生的密钥。