首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正在mysql中存储密码...使用散列,对吗?但是如何向用户发送忘记的密码呢?

正在mysql中存储密码...使用散列,对吗?但是如何向用户发送忘记的密码呢?
EN

Stack Overflow用户
提问于 2012-11-09 22:32:14
回答 3查看 340关注 0票数 7

我一直在研究在mysql中存储用户密码,普遍的答案是使用像MD5或SHA1这样的加密算法来存储它。但是,如果用户x忘记了她的密码并希望将其发送给她,该怎么办呢?然后呢?我不能把md5散列发给她!这个问题在现实世界中是如何处理的?有两个数据库吗?一个用来比较哈希,另一个用来比较忘记的密码?但有什么不同呢?当时连接到它的sql用户都是只读的。那么你是怎么做的呢?谢谢!!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-09 22:36:48

这是非常标准的安全实践,从不向用户发送他们的密码。相反,您提供了一个密码重置实用程序,该实用程序与用户访问其电子邮件帐户能力和/或回答有关其配置文件的问题(如安全问题或他们居住的邮政编码)的能力相关。

功能概述:

  1. 用户单击“忘记密码链接”
  2. 用户输入安全质询信息(电子邮件地址,安全问题,如果desired)
  3. System发送带有自动生成链接的密码重置电子邮件(在instance)
  4. System的查询字符串中生成GUID )创建一个密码重置记录,其中包含重置GUID、它用于哪个用户以及密钥何时超时。
  5. 用户检索电子邮件,单击链接。
  6. System匹配GUID,删除密码重置记录,将用户发送到密码重置页面。

<代码>G213

票数 10
EN

Stack Overflow用户

发布于 2012-11-09 22:35:07

最好的解决方案是向用户发送一个链接,用户可以在其中输入新密码,而不必输入忘记的密码。

这个链接应该只工作一次,并且它应该只工作几个小时。

不要创建新密码并通过邮件发送;用户会忍不住想使用该密码(忽略已通过不安全通道传输的事实)。

票数 3
EN

Stack Overflow用户

发布于 2012-11-09 23:45:48

您说得对,密码不应以纯文本(they should be hashed)格式存储,因此不能发送给忘记密码的用户。

从本质上讲,您需要的是一种绕过常规身份验证方案的方法,您应该首先意识到这种机制是应用程序的后门。

通常假设只有所需的用户才能访问发送到您的应用程序中注册的电子邮件地址的电子邮件。“标准”密码重置机制就是基于这个假设的。以下是我对此的看法:

  1. 忘记密码页面被请求,用户被要求在表单中输入他们注册的电子邮件地址,然后他们提交
    • 接收代码检查提交的电子邮件地址是否确实已注册,如果是,则检查:
      • 从相应的storage
      • generate中删除此地址的任何现有密码重置令牌,并为此地址存储新的密码重置令牌
      • 向用户发送电子邮件,通知用户已请求密码重置H213 H114单击链接如果用户未请求reset

,则将

  • 重置为忽略电子邮件

代码语言:javascript
复制
    - respond to the form submission with a page which says something along the lines of "**if** the address submitted was registered then a reset email has been sent"

代码语言:javascript
复制
- If the submitted address was not one registered with the application then do nothing but respond to the submission with a page which says something along the lines of "**if** the address submitted was registered then a reset email has been sent" - just the same as if the address was a valid one (this is to make it more difficult for someone to discover email addresses registered with the application)

  1. 用户随后会收到忘记密码的电子邮件,并单击其中的链接。链接将密码重置令牌传递给application.
  2. Upon接收密码重置令牌,代码检查令牌是否存在于存储器中以及是否尚未过期。如果这些都是真的,则假定必须是提交令牌的注册用户,并且您可以允许他们设置新密码(一个简单的表单,其中包含密码和密码确认输入,以及一个提交按钮,其中不包含任何个人信息-甚至不包含他们的姓名)。
  3. 设置密码后,您可以将用户定向到登录页面,他们可以照常在此输入凭据。

这不是一个完美的方案。这是安全性和便利性之间的权衡,毫无疑问,它构成了应用程序的后门。对于低价值的应用程序,它通常已经足够好了。

进一步阅读:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13309960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档