是否有可能我的SHA1'd字符串是非唯一的


Is there any chance of my SHA1'd string being non-unique?

我有以下代码片段,其中我构造了一个字符串,作为电子邮件确认码发送给用户:

$confirmation_code = $user_id . time() . date('d-m-Y',time());
$confirmation_code = sha1($confirmation_code);

$confirmation_code是否有可能在任何步骤被复制?

注意:请记住$user_id对于每个用户都是唯一的

考虑到$user_id对每个用户都是唯一的,这应该(理论上)意味着您的确认码不应该冲突("非唯一")

然而,在现实中,SHA1哈希可以冲突(请参阅MSDN博客文章了解更多信息)。

因此,如果您问这个问题的原因是为了决定是否在数据库中创建UNIQUE列,请不要。

是的,代码应该是唯一的,除非您每秒钟为每个用户生成多个代码。它也是非常可预测的。如果攻击者知道用户的id和生成代码的大致时间,那么猜测代码就很简单了。如果允许攻击者无限次猜测,那么即使是最艰难的时间也无关紧要,因为他可以轻松地尝试过去几年的所有有效代码。

你应该生成一个(伪)随机的代码,而不是一个基于静态数据的代码。在Linux上,只需读取/dev/random:
$code = bin2hex(file_get_contents('/dev/random', false, null, -1, 32));
                                                                  ^^
                                                          desired length/2