2012-02-15 79 views
0

我们的一位客户抱怨使用纯文本密码进行登录密码恢复。我知道的唯一解决方法是在查询字符串中使用encripted username和passord自动登录。明文密码与自动登录

还有哪些其他选项可以提高密码恢复安全性?

谢谢。

+0

你是指以明文形式发送他们当前密码,还是生成一个新密码并发送? – Brandon 2012-02-15 22:03:50

+0

什么是密码恢复安全性?为什么密码需要恢复? – crush 2012-02-15 22:04:04

+0

@Brandon:我的意思是当前密码。 – abenci 2012-02-16 08:01:56

回答

2

您可以给他们发送一个URL,让他们自己重置密码。

您可以创建一个数据库表,该数据库表至少存储用户标识和散列值。

向用户发送包含散列的链接,并在接收页面上查找相关信息并允许用户重置帐户的密码。我希望你将其作为散列值存储在数据库中。纯文本密码绝对不能存储或发送。

只要确保链接已过期或在密码更改后停用。否则,有人可以随时访问该链接并更改密码。

+1

换句话说,在任何地方存储纯文本密码绝不是一个好主意。 – crush 2012-02-15 22:07:32

+0

有趣的是,我们使用ASP.NET MVC 3标准成员资格,并且使用了密码。这是ASP.NET MVC 3提供的简单改变一些参数的东西吗? – abenci 2012-02-16 07:59:58

+0

是的,您可以将默认成员资格提供程序配置为使用散列密码而不是加密密码。你必须设置'enablePasswordRetrieval =“false”'和'enablePasswordReset =“true”'。你也可以设置'passwordFormat =“Hashed”' – danludwig 2012-02-16 18:27:48

0

我不会以纯文本形式向用户的电子邮件地址发送帐户的实际密码。原因是因为如果有人攻击了用户的电子邮件地址,他们有他们的真实密码。此密码很可能也会用于其他系统。

另一种方法是发送一个加密的查询字符串,该查询字符串链接到该用户,并允许他们根据某种特定于该用户的安全问题或人口统计信息来更改其密码。

Facebook使用朋友图像匹配名称。如果你有他们的DOB和地址,你可以使用它(不安全)。或者你可以设置具体的安全问题和答案,这会更好。

+0

纯文本版本的密码甚至不应该在数据库中可用于发送给用户。身份验证应使用单向散列来验证数据库的密码。 – tawman 2012-02-15 22:09:32

+0

@tawman:我同意哈希和盐是要走的路。 – 2012-02-15 22:46:17

1

沿着相同的路线布兰顿的出色答卷,这里是我们做什么:

  1. 不要储存在纯文本,甚至可解密的值密码。始终使用单向哈希算法存储密码。这意味着只有用户才能知道明文密码是什么。

  2. 当用户忘记密码时,向他们提供输入他们电子邮件地址的表单,然后单击提交。

  3. 当他们提交他们的电子邮件地址时,创建一个包含两个主要部分的表格行:第一个是密码重置令牌(我们使用Guid)。标记应该有时间戳,以便您知道它何时创建以及何时到期(我们在提交后2小时内过期)。第二部分是密码,用户必须输入才能重置密码。

  4. 发送一封电子邮件给用户,指向一个页面的链接,该页面将接受令牌和密码。当他们点击链接(或访问页面并手动输入代码)时,您可以向他们展示一个页面,让他们在不知道之前的值的情况下更改密码。

使用时间受限的令牌是一个好主意,因为如果用户的电子邮件帐户后受到损害,犯罪分子无法使用电子邮件重置密码 - 当然假定电子邮件帐户在密码重置请求的2小时内不会受到影响。