我有以下代码段,我在其中构造一个字符串以作为电子邮件确认码发送给用户:
$confirmation_code = $user_id . time() . date('d-m-Y',time());
$confirmation_code = sha1($confirmation_code);
有没有可能$confirmation_code
在任何一步被复制?
注意:请记住,$user_id
每个用户都是独一无二的
我有以下代码段,我在其中构造一个字符串以作为电子邮件确认码发送给用户:
$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