Php 生成密码重置的密码
我正在做一个模块,允许用户重置密码。我注意到大多数网站都提供了确认链接,其中包含具有唯一哈希的查询字符串 我的问题是:每次同一用户请求忘记密码时,如何生成这个唯一的哈希?我是否应该将此哈希存储在数据库中,并在以后使用它进行验证?安全吗?或者我应该创建某种生成一次性密码的算法吗?如何生成OTP?是的,您应该Php 生成密码重置的密码,php,hash,one-time-password,Php,Hash,One Time Password,我正在做一个模块,允许用户重置密码。我注意到大多数网站都提供了确认链接,其中包含具有唯一哈希的查询字符串 我的问题是:每次同一用户请求忘记密码时,如何生成这个唯一的哈希?我是否应该将此哈希存储在数据库中,并在以后使用它进行验证?安全吗?或者我应该创建某种生成一次性密码的算法吗?如何生成OTP?是的,您应该 生成随机重置令牌。见例 将其存储在数据库中(可能有到期时间) 使用重置令牌向用户发送电子邮件 用户使用查询字符串中的重置令牌访问重置密码页面 检查数据库以查看与重置令牌关联的用户,以及是否过期
$hash = md5(time() . $userid . 'mysite');
这将创建一个很好的散列
2) 可以,将其存储在数据库中。3) 是的,只要您在一段固定时间后使哈希过期,它就会安全。
4) 不,生成一次性密码通常会惹恼用户。只需使用带有用户ID、用户salt(您对用户密码进行salt)和伪随机数据的哈希函数就可以了:
$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小时”或类似内容)
在使用或过期时将其从数据库中删除方法确实是生成某种随机事件并将其存储在数据库中。一旦更改密码,您就从表中删除相关记录,这样链接就不能再次使用
- 将url邮寄给用户,包括“令牌”
- 如果访问了链接,请检查令牌是否存在,允许用户更改密码
- 从数据库中删除令牌
正如在其他回答中已经提到的,对用户ID进行SHA1或MD5,结合微时间和一些盐字符串通常是安全的。不,不会,因为这是可预测的。如果他大幅更改盐,那么这将是不可预测的。没有必要准确地使用“mysite”。大家好,谢谢你们的快速回复。我将继续使用数据库方法=),我建议不要这样做。它不像time()
那么糟糕,但仍然不安全。测量他和服务器之间的延迟的攻击者可能会猜出哈希值至少各1个20-50次。至少使用microtime来代替microtime…您好,我知道microtime是可以使用的。但假设我要做一个请求密码模块。用户提供他们的有效电子邮件,系统发送一封带有确认链接的电子邮件,该链接带有包含用户ID和哈希的查询字符串。当用户收到电子邮件并单击确认链接时,系统应将其带到相应页面并验证哈希是否正确?要再次检查此散列,如何使用microtime生成相同的散列???@artifact:Edited。有了uniqid
和每个用户的散列,现在就不应该轻易猜测了,对吗?@artifact:你说的“猜测散列”是什么意思?你的意思是通过知道用户id、用户密码和salt来猜测重置密码散列吗?你能详细说明一下吗?嗨,Blizz,我想在数据库中存储是一种方式。感谢blizz1)盐最好足够大,这样它就不会被暴力破解中的几个散列猜到2)每次使用mtu rand
有那么难吗?PHP中有一个函数可以创建加密安全的随机数,你为什么要重新发明一个“自制”的随机字符串生成器,它有一个加密弱散列(如MD5),由弱种子(如microtime
)播种……没人说你不能将所有这些结合起来。我通常使用用户ID、2个随机数、微时间和一些随机字符串。大家好,请回答。我对反应的速度感到非常惊讶。哇!堆积如山的岩石!!附加建议:在存储到数据库之前,始终将重置密码散列,因为它也可以临时用作用户密码(我的意思是它可以像常规用户密码一样访问用户帐户)。在这个答案中,您说“生成唯一的随机重置密码”。这不是错误的方法,就是不正确的术语。如果我请求一个忘记的密码-和你的电子邮件地址-它应该给你发送一封电子邮件,随机字符串(又名nonce或token),但你现有的密码应该继续工作!这防止我仅仅通过知道你的用户名或帐户电子邮件就拒绝你的服务。所以,永远不要为用户生成一个真正的随机密码,这不是一个好方法。只生成一个随机令牌。@Kzqai“重置密码”并不意味着“已重置的密码”,但我明白你的意思,令牌或nonce是更好的选择。我已经编辑了答案。我可以使用以前用户的密码(散列)作为随机令牌吗?(第一步)?实际上,我需要它作为重置url的参数来传递它。我可以这样做吗?