1

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

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

有没有可能$confirmation_code在任何一步被复制?

注意:请记住,$user_id每个用户都是独一无二的

4

2 回答 2

1

鉴于$user_id每个用户都是独一无二的,这应该(理论上)意味着您的确认代码永远不会冲突(“不唯一”)

然而,实际上,SHA1 哈希可能会发生冲突(有关更多信息,请参阅此 MSDN 博客文章)。

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

于 2013-03-24T08:20:08.500 回答
1

是的,代码应该是唯一的,除非您每秒为每个用户生成一个以上的代码。这也是非常可预测的。如果攻击者知道用户的 id 以及生成代码的大致时间,那么猜测代码就很容易了。如果允许攻击者进行无限次数的猜测,那么即使是粗略的时间也无关紧要,因为他可以轻松地尝试过去几年的所有有效代码。

您应该真正生成(伪)随机代码,而不是基于相当静态数据的代码。在 Linux 上,只需阅读以下内容/dev/random

$code = bin2hex(file_get_contents('/dev/random', false, null, -1, 32));
                                                                  ^^
                                                          desired length/2
于 2013-03-24T08:23:45.947 回答