【发布时间】:2010-10-10 15:31:40
【问题描述】:
当管理员发送带有令牌的链接时(就像我们经常看到的帐户激活或密码更新),我需要向未注册的访问者授予对网站特定页面的访问权限。
显然,令牌需要是唯一的,因为令牌本身将决定访问者可见的内容(令牌将存储在 MySQL 数据库中,并提供访问权限、状态、到期等...)
这是我所拥有的,来自多个来源:
$key = '#}~*$/"$?&*(."*/[!%]/${"/}';
$unique = uniqid();
$token = $unique.substr(hash('sha512',$unique.$key.microtime()), 0, 19);
它产生一个 32 个字符的字符串,前 13 个可以反转以获得创建的时间,最后 19 个用于添加唯一性。
这足够独特/安全吗?
对于 URL 令牌来说,32 是否足够长?
【问题讨论】:
-
您将无法反转您的 sha512 哈希来获取创建的时间。 sha512 是一种单向哈希。您可以尝试对自己进行字典攻击以创建时间,但这太荒谬了。
-
不,我还有 $unique 不变,然后是 sha512 哈希的 substr...
-
那又怎样?
microtime()仍然被不可逆地散列,因此永远丢失。 -
所以我不需要 microtime()。!它只是在那里添加一些要散列的东西。 uniqid() 可以反转为时间戳,如果我需要得到它就足够了。无论哪种方式,可逆性都不是这个目标......