我的SHA1字符串是否有可能不是唯一的?

时间:2013-03-24 08:17:54

标签: php duplicates unique sha

我有以下代码片段,我正在构建一个字符串,以电子邮件确认代码的形式发送给用户:

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

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

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

2 个答案:

答案 0 :(得分:1)

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

然而,实际上,SHA1哈希可以发生冲突(有关详细信息,请参阅this MSDN blog article)。

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

答案 1 :(得分:1)

是的,代码应该是唯一的,除非您每秒为每个用户生成多个。它也非常可预测。如果攻击者知道用户的id以及生成代码的粗略时间,则猜测代码是微不足道的。如果允许攻击者进行无限次的猜测​​,即使是粗暴的时间也不重要,因为他可以轻松地尝试过去几年的所有有效代码。

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

$code = bin2hex(file_get_contents('/dev/random', false, null, -1, 32));
                                                                  ^^
                                                          desired length/2