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