我正在做一个允许用户重置密码的模块。我注意到大多数网站如何提供包含具有唯一哈希的查询字符串的确认链接。
我的问题是:每次相同的用户请求忘记密码时,如何生成此唯一哈希?我应该将此哈希存储在数据库中并在以后使用它进行验证吗?它会安全吗?或者我应该创建一些生成一次性密码的算法?如何生成OTP?
答案 0 :(得分:27)
是的,你应该
关于重置令牌的生成(或者你想要的任何调用令牌)似乎有很多混乱。请阅读我所链接的答案,不要用哈希和弱种子重新发明轮子。
答案 1 :(得分:3)
只是使用一些带有用户ID的哈希函数,用户的盐(你用户的密码,对吗?)和伪随机数据应该没问题:
$pwd_reset_hash = hash ( 'sha256' , $user_id . $user_salt, uniqid("",true));
将其存储在数据库中(连同请求时间)作为此用户的重置键
user_id pwd_reset_hash time_requested
===========================================
123 ae12a45232... 2010-08-24 18:05
当用户尝试使用它时,请检查哈希是否与用户匹配,以及时间是否是最近的(例如“重置代码有效3小时”或类似内容)
在使用或过期时从数据库中删除
答案 2 :(得分:1)
要走的路确实会生成某种随机的东西并将其存储在数据库中。更改密码后,您将从表中删除相关记录,以便无法再次使用该链接。
正如在其他回复中已经说过的那样,做一个用户ID的SHA1或MD5,加上microtime和一些盐串通常是一个安全的赌注。
答案 3 :(得分:0)
1)要生成唯一的哈希,请混合当前时间,用户ID和一些盐(文本)。例如,如果您的网站是mysite.com,请使用以下代码:
$hash = md5(time() . $userid . 'mysite');
这将创建一个很好的哈希。
2)是的,将其存储在数据库中 3)是的,只要你在一段固定的时间后使哈希到期,它就会安全 4)不,生成一次性密码通常会使用户烦恼。