我正在使用 Zend Framework 制作一个分类广告网站(出于投资组合的目的,是的,我知道世界没有空间容纳“又一个 Craigslist 克隆”)。我正在尝试实现无需帐户即可发布/编辑/删除的功能。
为此,我觉得我需要在提交后生成一个 Nonce 并将其存储在数据库中。然后通过电子邮件将链接发送给发出 GET 删除请求的用户,如下所示:
http://www.somesite.com/post/delete/?id=123&nonce=2JDXS93JFKS8204HJTHSLDH230945HSLDF
只有用户拥有这个唯一的密钥或随机数,提交后我检查帖子 ID 下的数据库,并确保在删除之前随机数匹配。
我的问题是随机数实际上有多安全。如果我使用 Zend Framework 的Zend_Form_Element_Hash
,它会像这样创建散列:
protected function _generateHash()
{
$this->_hash = md5(
mt_rand(1,1000000)
. $this->getSalt()
. $this->getName()
. mt_rand(1,1000000)
);
$this->setValue($this->_hash);
}
在阅读 mt_rand() 时,一位评论者说“这个函数的熵是有限的。所以,如果你想创建随机字符串,无论字符串的长度如何,它只会产生大约 20 亿个不同的字符串。这可能是严重的安全性如果您将此类字符串用于会话标识符、密码等,则会出现问题。 "
由于应用程序中的随机数/令牌的生命周期,可能是用户选择删除帖子之前的几天或几周,我认为有足够的时间来进行潜在的黑客攻击。
我意识到mt_rand()
这是一个巨大的升级,从左侧和右侧的视觉映射像素rand()
中可以看出。但够了吗?是什么让“ 20 亿个不同的字符串”成为安全问题?rand
mt_rand
最终,我怎样才能增加 nonce/token/hash 的熵?