首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >密码恢复的现代建议

密码恢复的现代建议
EN

Software Engineering用户
提问于 2016-02-23 05:39:45
回答 3查看 1.6K关注 0票数 3

我将在身份验证中实现密码恢复。我已经有一段时间没有把这些放在一起了,我想知道是否有什么我应该知道的。

我现在的想法是:

  1. 用户单击“忘记我的密码”进入密码恢复页面:一个带有电子邮件字段的表单。
  2. 他们输入电子邮件,然后用链接和密码恢复令牌/密钥(MD5字符串-它只需要有点随机和长?)发送到该地址。在password_recovery数据库表中也有一个条目,该表将该令牌绑定到他们的帐户,并有一个过期日期(1小时?)
  3. 他们检索电子邮件并单击链接将他们带到密码集页面:两个字段输入他们的密码,然后再次确认他们的密码。
  4. 完成后,请使用新密码再次登录。

看上去还行吗?在不再建议采用这种方法的这些年里,有什么变化吗?

更新

我选择添加的内容:

  • 我将令牌存储在散列的数据库中。如果黑客能够以某种方式访问数据库表,他们就无法使用存储的令牌。希望(用sha256散列)
EN

回答 3

Software Engineering用户

回答已采纳

发布于 2016-02-24 11:45:32

看上去还行吗?

是的,假设电子邮件是您网站认证的主要形式。

在不再建议采用这种方法的这些年里,有什么变化吗?

就我所知没有。

以下是一些你需要考虑的要点。

您将给用户

什么样的反馈

当电子邮件不存在时,你会说什么和做什么?

  • 如果你显示像“对不起,这封电子邮件不存在”这样的信息,你实际上是在泄露关于谁是或不在你的数据库中的信息。
  • 因此,你可以用这样的方式显示一条信息:“如果这封电子邮件对应于一个用户帐户,你将得到进一步的说明”。这是更安全的,但它可能会混淆你的用户(“为什么我没有收到电子邮件?”)
  • 第三种选择是始终发送电子邮件,只有在电子邮件不在数据库的情况下才发送不同的内容。这会让你的表格被滥用,因为任何人都可以键入其他人的电子邮件,你的电子邮件最终会被垃圾邮件处理。

如果您的系统使用用户名,最好是询问用户名,而不是电子邮件地址。您将恢复电子邮件发送到与帐户相关的电子邮件地址,而不向用户透露。

你如何保护这个过程不被滥用

  • 很容易看出某人如何使用这个表单生成电子邮件,然后使用社交工程来激励用户点击链接(或者更糟糕的是,转发电子邮件)。因此,你应该在你的电子邮件中清楚地说明这一点。
  • 你需要保护这个表格不受暴力的影响。例如:每个帐户不超过一个主动请求(在上一个帐户到期之前不重新发送电子邮件),每个IP地址的尝试次数有限,节流,CAPTCHA等。

令牌

令牌实际上是用户帐户的一次性密码。

  • 令牌应该是随机和不可预测的,并且存储在数据库中,并与相应的用户ID和时间戳相关联。您不需要MD5,也不需要对令牌中的任何内容进行编码。PHP中的示例,用于32个字符令牌:bin2hex(openssl_random_pseudo_bytes(16));
  • 标记必须有一个很短的生命时间。1小时对我来说似乎有点长,我想如果你忘记了你的密码,你现在想恢复它,所以30分钟可能是足够的,但老实说,这取决于你。重点是限制令牌生存期。
  • 一旦使用完令牌,就必须立即禁用它。
  • 在任何给定时间,每个用户不应该有一个以上的活动令牌。从关系数据库的角度来看,在users表中使用(可空)字段而不是单独的表时,更容易强制执行此规则。
  • 我不确定散列重置令牌是否有用。从您的数据库中,这种风险已经通过短暂的生存期和一次性使用而减轻了.真正的风险在于传输,因为它们是通过电子邮件(不安全的)发送的,因此它们可以被破坏。但为什么不呢。
票数 6
EN

Software Engineering用户

发布于 2016-02-23 23:51:22

我肯定会四处看看,找出最新和最伟大的加密算法。有很多关于哪一种算法最有效的争论,但总的来说,我发现,在最先进的算法中,两者之间的优势是可以忽略不计的。尽管如此,我肯定会考虑MD5的替代方案,如SHA256、SHA512、RipeMD或WHIRLPOOL。做你的研究并重申你的加密方法还没有被破坏,这总是一个好主意。

而且,我在你的问题中没有看到包括SALTing在内的任何东西。这肯定是您可以考虑实现的,以便为可能实现密码的用户提供额外的安全性,这些密码很容易被黑客使用字典攻击或哈希表破解。

最后一件事(我假设你已经考虑过这一点);我肯定会确保他们输入到你的忘记密码系统中的恢复邮件实际上与你为该用户文件中的电子邮件相匹配.为了安全起见,我也可能包括一个安全问题。

票数 2
EN

Software Engineering用户

发布于 2016-02-23 10:19:13

我不知道这是否是一个一般性的方法,或者这是否只是我个人的方式/想法,这样的问题,但我会做以下几点。

以客户端的IP为例,用您喜欢的任何算法加密它,但是结果在链接中作为标记,并在其中添加时间戳。

然后,该链接仅对客户端的IP和给定时间有效。

现在,即使是处于中间攻击中的人也无法劫持重置标记。

您也可以请求用户的MAC地址,但在我看来,这基本上是过头了。

这是我个人实现保存现代重置令牌的方法。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/310824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档