密码更改:最佳实践

5
我正在编写“宝宝的第一个Web应用程序”。我的第一个任务是建立一个认证系统,我认为我已经做得不错了。虽然我对整个过程还很陌生,但当用户报告忘记密码时,我会通过电子邮件发送一份临时替代密码(明文)。这可能不是处理这种情况最安全的方法,但目前我是这样做的。我强制要求他在下次登录时更改密码,并使用的技术是在数据库中携带一个“必须更改”字段,对于已收到电子邮件的用户将其设置为true。
我的问题是:在这种情况下,单独的数据库列是否是最好的策略,或者我可以做些更好的事情?

一个用于临时替换的分离列?我不确定我是否理解了你的想法。 - Claudio Redi
一个名为“mustchange”的单独列。它默认为false,并在用户必须在下次登录后立即更改密码时设置为true。 - Tony
3个回答

4
一个单独的列是相当合理的。
操作系统通常有一个“密码过期时间戳”字段,通过将时间戳设置为0(也就是1970年1月1日),可以将其作为“必须在下次登录时更改”的标志。网站通常没有密码过期日期,这种情况下只需要一个简单的布尔标志即可。

很高兴听到我的方法是合理的。我确实会努力思考这些事情,因此很感激确认。 - Tony

2

我假设你正在存储哈希和加盐的密码。如果没有,请这样做。如果是这样,您可以在盐中存储元数据。例如,盐为[0-9a-z]{8},但对于临时密码,它是____[0-9a-z]{4}。(在下投票之前,请继续阅读!)这样做的目的是,一个单独的字段可能会与哈希字段分别进行编辑。当然,这不应该发生,但它可能会发生。(查询失败、愚蠢的系统管理员、使用phpmyadmin并认为自己理解系统的人等)将密码的“状态”保存在盐中可避免此类混乱:在验证密码时,您始终能够看到您针对临时密码进行了验证,并且您将始终能够识别需要获取“输入新密码”提示的用户。


有趣。我确实对密码进行了哈希处理,我一定会研究加盐的想法。谢谢。 - Tony

1

我的做法一直是将电子邮件验证(向注册用户发送电子邮件以确保注册用户拥有该地址)过载,以充当密码重置机制。我使用关于用户的某些信息(用户名、ID、电子邮件和重要的是数据库中的当前密码哈希)生成哈希值,该哈希值包含在发送给用户的URL中,用户可以在此处设置自己选择的新密码。

话虽如此,关于用户身份验证的“最佳实践”95%的时间是使用其他人编写并广泛测试的库。只需搜索适合您框架的库即可。


啊哈,电子邮件验证!我没有考虑过这个问题,但当然这是一个常见而明智的做法。谢谢。至于使用别人的库:当然,这几乎总是一个好主意。然而,我现在处于一个阶段,仍在努力理解涉及的所有问题。为了做到这一点,我最擅长的方式是自己编写一些粗糙的代码,并在进行过程中进行一些改进。尽管如此,我可能最终会使用外部库。认证轮已经被发明了。我怀疑我无法使它更加圆滑。 - Tony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接