我有以下代码片段,我正在构建一个字符串,以电子邮件确认代码的形式发送给用户:
$confirmation_code = $user_id . time() . date('d-m-Y',time());
$confirmation_code = sha1($confirmation_code);
是否有可能在任何步骤$confirmation_code
被复制?
注意:请记住$user_id
对每个用户来说都是唯一的
答案 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