2016-12-24 56 views
1

我必须创建一个电子邮件验证和密码重置系统,因此我需要一个令牌生成器。起初我认为这些令牌必须是绝对唯一的,但是当我检查数据库中的哈希(令牌)和电子邮件时,我不明白为什么我不应该使用足够长度的随机字符串,而不会追加uniqid()例如这也会很明显)。有一个帐户验证或密码重置令牌真的是唯一的?

我对这个假设是否正确?

+3

是的,他们需要是唯一的,只能使用一次。如果同一个用户去并且试图使用相同的密钥并且不被允许,那么这可能是一个问题。 –

+0

另外,如果你使用的是数据库中的AI/PK密钥(你应该),那么使用一个唯一的密钥以及AI/PK,将使它更加独一无二的“给用户”。顺便说一句,我回到了问题,看看是否还有活动;还有一条评论,但被删除了。我唯一看到的更多的是我的评论。我认为这个问题与这个问题很相似(应该)回答这个问题。如果你愿意,你可以ping我,因为我现在已经把问题留给了好人。享受你的圣诞,*欢呼* –

回答

1

不是,它只需要为该用户唯一。

例如,您可以将密码重置为要求提供用户名或电子邮件地址的一部分。在这方面,您的重置令牌只需要对该用户唯一。

而且,由于你没有查找令牌已知良好的令牌的列表它的速度更快的所有用户。

例如,一个全球唯一的密码重置令牌我要么必须使用一些额外的细节为用户信息等,以区别于其他人令牌或我必须通过某种方式的所有已知标记的搜索。

使用唯一的用户/哈希码我只需验证为此用户提供的代码是否有效。通过比较,你通常会发现一个数组搜索,甚至一个哈希表查找将花费更多的时间。

例如,如果用户没有启动密码重设,其内部用户可能是这样的比较,如果他们有。注意在这个例子中,我们只允许一个最近的密码重置请求(而不是多个):

User.getName() = "Bob" 
User.getUserName() = "Bob5412" 

User.resetPasswordRequestedTime() = null 
User.resetPasswordToken() = null 
or 
User.resetPasswordRequestedTime() = 1482628217 
User.resetPasswordToken() = "f7de43859d244439b101df4e02cc4e17" 

现在我只需要检查,如果令牌是有效的请求用户。无需担心“全球独一无二”。

在我的代码我可能需要的任何密码重置请求由4小时内,用户可以完成,因此,如果他们的要求之后排在我不理会,不检查任何他们的请求。

+0

是的,正是我的想法。而令牌过期函数绝对是我会实现的,因为它是减少可用脆弱令牌池的好方法。 –