注册密码的最佳做法?

Posted

技术标签:

【中文标题】注册密码的最佳做法?【英文标题】:Best practices for passwords on registration? 【发布时间】:2015-04-19 04:59:53 【问题描述】:

我有一个用户注册帐户的网站。在注册字段中,表单字段为:

姓名 电子邮件 确认电子邮件 用户名

但是没有密码字段。当他们点击提交时,他们会收到一个非常复杂的密码,例如 LHJVjhwnv%uu5RbWM9!jeDZUQb

我已呼吁我的开发人员改为这样做,以便用户可以在注册表单上设置自己的密码。在表单上确认该密码,然后将确认链接发送到他们指定的电子邮件。然后这样他们至少可以登录到他们的帐户并通过确认链接验证他们的电子邮件。或者如果他们没有,每次他们登录网站时,它都可以提醒他们验证他们的电子邮件等,否则他们不能在网站上做很多事情(示例)。这样,即使他们没有获得确认链接,他们也可以仍然将其帐户电子邮件更新为其他电子邮件并重新发送。至少在这个阶段,他们可以登录自己的帐户,而不是根本无法

我收到开发者的回复如下

"注册时提供密码的问题是 您将拥有大量虚假帐户。所以刚注册的人 一个不存在的电子邮件地址。至少通过电子邮件验证 您在一定程度上证明了用户的存在。如果他们使用错误的电子邮件注册,他们可以重新注册。”

想请问各位开发者目前采用的方法是否可以接受?

如果没有,我可以使用哪些充分理由来说服开发人员进行更改?”

我试图解释以下内容

每天有 9-10 人注册然后直接使用“密码重置”表单紧接着。此表格涉及他们输入他们注册时使用的电子邮件地址,然后通过电子邮件向他们发送一个链接以设置新密码。因此,如果他们要设置新密码无论如何,为什么不让他们在注册表单上首先设置呢?为什么每天会有 9-10 人在注册后直接使用密码重置字段?我很确定这是因为他们似乎正在努力处理这些复杂的密码(我不反对),这些密码正在通过电子邮件发送给他们并且缺少密钥或字符,或者似乎不知道复制/粘贴或类似的东西那。如果他们可以第一次设置自己的密码,他们就不需要因为通过电子邮件发送的密码不起作用而立即跑到密码重置字段。我觉得每天都有密码重置电子邮件很奇怪。自从我开始使用 Mandrillapp 跟踪外发电子邮件以来,并不是每个人都适合,但每天有 9-10 人。这得到了下一点的支持。

每天至少有 2-3 人填写联系表,表明他们收到的密码无效。如果他们可以自己设置,这一切都可以避免。可能还有更多,只是懒得联系。

在近 8000 个帐户中,50% 从未登录过。我强烈怀疑包含其密码的注册电子邮件进入了他们的垃圾文件夹/垃圾邮件文件夹。尽管我有适当的 SPF、DKIM 等设置。 2 个月前,我决定开始使用 Mandrill 发送邮件以确保邮件进入收件箱,但每天仍有至少 1-2 人表示他们没有收到电子邮件。这让我感到困惑。如果他们可以定义自己的密码,他们就不必担心通过电子邮件等待他们的密码,或者完全没有得到密码。这进一步凸显了我最初的担忧。

感谢您的宝贵时间!

【问题讨论】:

也有常用的方法是自己选择密码,但是需要点击验证链接才能登录 这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Information Security Stack Exchange 会是一个更好的提问地点。 【参考方案1】:

我假设您已经有一个有效的密码重置页面,因此您可以使用相同的代码进行注册:

    让用户使用他的电子邮件注册。 向用户发送带有令牌的链接,令牌的哈希值存储在数据库中。 如果用户点击链接并且令牌有效,欢迎他并让他输入自己的密码。

这正是您已经拥有的密码重置功能,您的网站变得不再(不)安全,因为攻击者也可以使用密码重置功能。

当然弱密码是个问题,所以拒绝弱密码是必须的。这与您在密码重置页面上必须执行的操作相同。对于密码重置,您也不会发送明文密码。

未确认的帐户可以在一段时间后删除,这意味着用户没有对其进行任何操作。如有必要,用户可以重新注册。这仅在用户在确认之前不允许登录时才有效,支持上述程序。当然,这个确认是否那么重要取决于网站。

【讨论】:

【参考方案2】:

不在邮件中发送密码的主要原因是安全性:邮件不是一种安全的媒介。如果您在其中输入密码,那么很多人都可以看到它 - 考虑允许人们使用您的服务 而不使用任何类型的密码来理解我的意思。

允许人们选择自己的密码的主要缺点是95% will use 123456 or password

大多数大型网站都使用这种方法来平衡安全性、业务需求和舒适度:

允许用户设置自己的密码。拒绝最简单的(有这方面的库)。注意:复杂的密码规则会让客户望而却步。 通过邮件发送确认链接。 在点击链接之前不允许登录。 如果他们仍然尝试登录,请告诉他们必须先单击链接并提供“再次发送确认链接”链接,以防第一封邮件丢失。

【讨论】:

【参考方案3】:

我已呼吁我的开发人员改为这样做,以便用户可以在注册表单上设置自己的密码....

这会让您面临大量的弱密码和重用攻击。重用已经过实证研究和reported between 50% and 76%。其他学术研究表明nearly all users (almost 100%) reuse passwords。

因此,分配密码有助于解决主要的实际问题。分配密码后,您将受到相同的攻击,但因为用户可能会在另一个站点上重复使用分配的密码。


... 想请问各位开发者目前采用的方法是否可以接受?

是的,只要密码符合安全要求,就可以接受。我什至更喜欢它,尤其是当用户选择的密码未针对错误密码列表进行检查时。

错误的密码列表很重要,因为我们知道攻击者会使用它们。由于过去的所有违规行为,它们实际上有数百万个密码(我是否提到密码重用是一个普遍存在的问题?)。这些列表很容易找到,一位研究人员最近发布了他的 6,000,000+ 列表。见How I Collect Passwords。


Aaron 关于电子邮件和纯文本是正确的。您实际上可以放置另一个安全控件来限制暴露。即,要求您的邮件服务器使用 SSL/TLS 或连接失败。

或者,生成密码并在屏幕上显示给用户。指示用户打印密码,以免忘记密码。我什至告诉我的用户把它们写下来,放在钱包里。

主要威胁是基于网络的攻击者试图通过弱/受伤/错误密码获得对服务器的未经授权的访问。因此,带外/频道外的电子邮件并不是什么大问题。丢失的钱包或钱包也不是什么大问题。令人担忧的是基于网络的攻击者猜测密码或使用 username,passwords 元组来破坏其他站点。


每天有9-10人注册,然后直接使用“密码重置”表格。此表单涉及他们输入他们注册时使用的电子邮件地址,然后通过电子邮件向他们发送一个链接以设置新密码。

好的,这是一个安全缺陷,因为用户可以绕过安全控制。

为了它的价值,我经常使用随机密码生成器为帐户生成密码。我什至懒得把它们写下来。当我需要访问该帐户时,我只需完成丢失密码的过程。

这就是这些东西对我的价值。每个该死的网站都希望用户管理帐户和密码。我已经厌倦了花费精力来管理所有帐户,所以我什至不会在上面浪费周期。


在注册时提供密码的问题是您将拥有大量虚假帐户。因此,仅使用不存在的电子邮件地址注册的人。至少通过电子邮件验证,您在一定程度上证明了用户的存在。如果他们使用错误的电子邮件注册,他们可以重新注册

好的,所以这是一个不同的问题。 BOT 注册通常通过验证码来缓解。我从来没有真正研究过真实用户/虚假帐户的用途。

虚假帐户有什么好处?在我看来,用户正试图怀孕一半。他们要么有帐户,要么没有帐户。


在近 8000 个帐户中,有 50% 从未登录过。我强烈怀疑包含他们密码的注册电子邮件进入了他们的垃圾文件夹/垃圾邮件文件夹。尽管我有适当的 SPF、DKIM 等设置。

嗯,这是一个不同的问题(您应该通过测试来确认)。这意味着为用户显示密码并告诉他们打印页面。


关于密码管理的主题还有很多。您应该阅读 Peter Gutmann 的 Engineering Security 的第 7 章。


我已向我的开发者提出上诉...

最后,你是老板。如果开发人员或承包商没有遵循说明或编码不符合要求,则解雇他们。在我乞求我为服务付费的人之前,我会被诅咒的。

程序员是一毛钱,你可以在Rent-A-Coder 这样的地方找到很多程序员。印度人和巴基斯坦人几乎不劳而获(在某些情况下每天不到 10 美元)。我不知道他们怎么能以这么少的钱工作并生存下来......

【讨论】:

以上是关于注册密码的最佳做法?的主要内容,如果未能解决你的问题,请参考以下文章

创建链接以重置密码的最佳做法是啥? [关闭]

视图验证的MVC最佳做法?

如何对新员工的注册表进行密码保护

用户密码盐的最佳长度是多少? [关闭]

为忘记密码生成随机令牌的最佳实践

在.net core mvc应用程序上存储用户密码的最佳方法[重复]