【发布时间】:2014-05-31 07:50:49
【问题描述】:
当用户忘记密码时,您不应通过电子邮件发送密码。在他的 Pluralsight 课程“Hack Yourself First: How to go on the Cyber-Offense”中,Troy Hunt 指出“SMTP 上没有隐式传输层安全性”。信息安全堆栈交换上的This answer 确认以明文形式(包括通过电子邮件)发送或存储密码是个坏主意。
看来,重置密码的正确方法是不要立即重置它。相反,通过电子邮件向用户发送一个有时间限制的激活链接。这需要用户手动干预,并且在任何阶段都不会通过电子邮件传达密码。
前面提到的Information Security answer 描述了如何实现密码重置机制:
无论如何都不要重置用户的密码 - 用户更难记住“重置”密码,这意味着他/她必须要么更改它,要么写下来 - 例如,在亮黄色的便利贴上他的显示器边缘。相反,让用户立即选择一个新的 - 这就是他们想要做的事情。
如果用户忘记了密码,请使用存储在数据库中的随机生成的重置令牌向他们发送安全的一次性重置链接。令牌必须是唯一且保密的,因此在数据库中对令牌进行哈希处理,并在使用链接时进行比较。
The definitive guide to form based website authentication 类似地描述了实现:
始终对数据库中丢失的密码代码/令牌进行哈希处理。再次,此代码是密码等效项的另一个示例,因此必须对其进行哈希处理,以防攻击者获得您的数据库。当请求丢失密码代码时,将明文代码发送到用户的电子邮件地址,然后对其进行哈希处理,将哈希值保存在您的数据库中 - 并丢弃原始代码。就像密码或永久登录令牌一样。
但是用户如何真正知道新密码。它是否重置为某些默认值?是不是改成了一个随机生成的密码,需要以某种方式与用户沟通?
在“Hack Yourself First: How to go on the Cyber-Offense”中,激活链接会将您带到一个表单,您可以在其中输入新密码。
如果您正在处理一个网站,这可能没问题,您可以进入该网站并与 Web 应用程序交互并选择您自己的新密码。但是使用 .NET Web API 之类的东西,您正在与控制器上的操作进行交互,这些控制器通常应该为您提供数据,而不是用户界面。你不能只给他们一个链接,然后期望他们用它做点什么。
因此,如果您正在处理通过 Web API 进行的身份验证,那么允许用户重置密码并将新密码传达给他们的有效且安全的方法是什么?
【问题讨论】:
标签: security authentication passwords asp.net-web-api reset-password