创建“更改密码”功能时应采取哪些安全措施?

时间:2010-09-19 21:18:16

标签: security design-patterns passwords

我正在为我的网络游戏http://ninjawars.net添加“更改密码”功能,该功能目前已修复(且基本上不会更改)密码。

我想避免弄乱它,所以我想确保我有基本的安全基础。

从Facebook的做事方式中拿出我可以提取的内容,要记住的关键点要点是:

  • 需要旧密码(当然)。
  • 确认两次新密码输入。
  • 注销帐户(仅限所有其他页面,不知何故)?
  • 需要安全的密码长度&密码适合每个特定系统上密码所需的所有 [插入各种条件]
  • 要求新密码与旧密码不同。
  • 防止多次更改密码。

Facebook也是:
  - 要求新密码与过去的密码不同。 (似乎是边缘情况使用)

这些只是我可以从facebook帐户系统的外部用户界面收集的政策。在提供“更改密码”系统时,我应该涵盖哪些其他安全点?

修改 在我的特定情况下,我打算用 [插入各种标准] 来相对宽容,因为字符必须进入密码本身。我的网站不是银行,如果玩家想要使用密码“password1”,那么他们应该期望他们的帐户被他们的朋友接管。另一方面,我的焦点是确保我的网站通过密码更改系统本身中的任何不安全性来防止任何“恶意接管”的机会。

以下答案中的更多优点:

  • 将密码更改通知发送给用户的电子邮件。
  • 保持更改电子邮件和更改密码,每个都取决于彼此。
  • 使用安全加密(https)连接进行此类更改。

8 个答案:

答案 0 :(得分:8)

保持更改密码以及对电子邮件地址的任何更改。这样,任何想要改变的人都必须知道两者。

当用户请求更改密码时,会通过电子邮件将指向该页面的链接发送给他们。这将确认他们是帐户的所有者,并在有人试图访问其帐户时提醒他们。然后,当密码被更改时,通过电子邮件将确认信息发送给他们。

答案 1 :(得分:4)

这可能很明显,但请记住通过加密连接(HTTPS)进行整个密码更改过程。

答案 2 :(得分:2)

我偶尔会看到的一件事是向电子邮件发送自动电子邮件,通知密码更改。如果无意或恶意地完成更改,这将为收件人提供恢复更改的机会/链接。显然,这需要一个类似的警告周期来更改电子邮件地址以提供更多安全性。

答案 3 :(得分:2)

我注意到没有人提出这个建议,或者我在其他人的回答中遗漏了一些细微之处。

仅当用户知道在他们请求更改密码时将发送到其电子邮件地址的“秘密字符串”时,才允许更改密码。为方便起见,您可以将此“秘密字符串”作为URL,以便他们可以快速在电子邮件中单击它。这确保了请求更改密码的人也可以登录注册的电子邮件(人们的游戏帐户比他们的私人电子邮件地址更容易放松)。

正如ChrisF所提到的,您必须确保此人不能同时更改密码和电子邮件。您还需要确保更改电子邮件需要了解当前密码(您可能不应该要求用户可以登录他的旧电子邮件来阅读“秘密字符串”,因为更改电子邮件地址的主要原因是因为他们丢失旧的电子邮件地址。)

答案 4 :(得分:2)

我想要的一个有趣的改变是如果我输入一个非常长的密码,请不要强迫我包含一些特定类型的字符。许多系统需要非常错综复杂的字母,大写字母,数字和特殊字符组合,当我想要的只有35个字符时,我不可避免地会创建一个6字符“已批准”的密码 - 但是因为“不安全”而被拒绝。哈哈^^

此外,如果您正在使用任何具有内置实际代码功能的类库,框架或模板 - 请使用它而不是自己滚动。事实上,即使不是 - 看看经过充分测试的附加组件或外部解决方案(OpenId?) - 安全性很难,也是重新发明imo车轮的最糟糕的地方之一。

答案 5 :(得分:1)

我认为您还应该检查密码是否与登录名不同。有些用户这样做,相信我。

答案 6 :(得分:1)

这实际上取决于密码保护的信息类型。例如,如果您拥有用户的财务信息,则密码要求应该与您只拥有其名称或类似名称的密码要求大不相同。另外,请记住,独裁密码要求只会鼓励用户创建符合要求的不安全密码。您应该对密码中允许的字符数设置相当高的上限(如果用户想要使其密码更强,请让他们)。您还应该允许用户同时使用大写和小写,允许他们使用数字,并允许他们在密码中使用符号。

至于要求密码足够安全,您应该确保它与以前的密码不同,除非是数字(例如,在密码中增加日期),您应该确保它不在前XXX列表中常见密码(例如,不允许“password1”),您应确保密码不包含用户名或用户的电子邮件地址。在密码更改表上,您应该建议用户不要使用与他们的电子邮件地址(或他们与您的网站连接的任何其他帐户)使用的密码相同的密码 - 尽管显然您不应尝试登录这些连接的服务检查一下。

答案 7 :(得分:0)

我今天只是想着这个问题。

而不是正常的复杂性要求,我认为下载一个免费提供的MD5彩虹表并将这些密码放入NoSQL数据库会很有趣。然后,当用户设置密码时,请尝试查找他们选择的密码。如果找到,请拒绝该密码。

在规模上,这可以通过只有一个或两个托管查找服务的专用盒来完成,因为设置/更改密码是一种不经常的活动。