Security a'的最佳方式;忘记密码';实施

Security a'的最佳方式;忘记密码';实施,security,authentication,passwords,forgot-password,Security,Authentication,Passwords,Forgot Password,我正在寻找实现“忘记密码”功能的最佳方法 我有两个想法: 当用户单击忘记密码时,用户需要输入用户名、电子邮件以及可能的出生日期或姓氏。然后,带有临时密码的邮件将发送到用户电子邮件帐户。用户使用临时密码登录并重置其密码 类似,但电子邮件中会包含一个链接,允许用户重置密码 或者有人能给我建议一个更好更安全的方法吗?我还想发送临时密码或链接,强制用户在24小时内重置密码,否则临时密码或链接将不可用。如何做到这一点?如果注册时包含电子邮件地址。“忘记密码”按钮将向该电子邮件地址发送电子邮件。它确保信息发

我正在寻找实现“忘记密码”功能的最佳方法

我有两个想法:

  • 当用户单击忘记密码时,用户需要输入用户名、电子邮件以及可能的出生日期或姓氏。然后,带有临时密码的邮件将发送到用户电子邮件帐户。用户使用临时密码登录并重置其密码

  • 类似,但电子邮件中会包含一个链接,允许用户重置密码


  • 或者有人能给我建议一个更好更安全的方法吗?我还想发送临时密码或链接,强制用户在24小时内重置密码,否则临时密码或链接将不可用。如何做到这一点?

    如果注册时包含电子邮件地址。“忘记密码”按钮将向该电子邮件地址发送电子邮件。它确保信息发送到受信任的电子邮件


    (除非数据库被黑客入侵,否则一切都不安全)。

    更新:2013年5月修订,以获得更好的方法

  • 用户输入用户名并点击“忘记密码”。我还建议输入电子邮件地址而不是用户名,因为用户名有时也会被忘记
  • 系统有一个带有列
    ID
    Time
    UserID
    的表
    password\u change\u requests
    。当新用户按下按钮时,将在表中创建一条记录。
    Time
    列包含用户按下“忘记密码”按钮的时间。
    ID
    是一个字符串。创建一个长的随机字符串(比如GUID),然后像密码一样对其进行散列(这本身就是一个单独的主题)。然后将此哈希用作表中的“ID”
  • 系统向用户发送一封包含链接的电子邮件。链接还包含原始ID字符串(在散列之前)。链接如下:
    http://www.mysite.com/forgotpassword.jsp?ID=01234567890ABCDEF
    。forgotpassword.jsp页面应该能够检索ID参数。对不起,我不懂Java,所以不能说得更具体了
  • 当用户单击电子邮件中的链接时,他将移动到您的页面。该页面从URL中检索
    ID
    ,再次对其进行散列,并对照表进行检查。如果存在这样的记录,并且不超过24小时,则会提示用户输入新密码
  • 用户输入一个新密码,点击OK,每个人从此都过着幸福的生活。。。直到下次
    这完全取决于您的网站和您试图实现的安全级别,但web应用程序的基本流程如下所示:

  • 用户导航到“忘记我的密码”页面并输入用户名或电子邮件(以唯一的为准)以请求密码重置

  • 在此阶段,您还可以通过询问其他信息来确认请求,例如预定义安全问题的答案或他们的出生日期等。此额外级别可阻止用户接收他们未请求的电子邮件

  • 查找用户的帐户。根据帐户记录保存临时密码(通常是GUID)和时间戳。向用户发送包含临时密码的电子邮件

  • 用户在电子邮件中单击包含临时密码和用户标识符的链接,或导航到“忘记我的密码”页面,复制并粘贴临时密码及其标识符。用户输入新密码并确认

  • 查找用户记录,如果当前时间在步骤2中保存的时间戳的指定时间限制(例如1小时)内,则散列并保存新密码。(显然,只有在临时密码匹配的情况下!)。删除临时GUID和时间戳

  • 这里的原则是通过电子邮件向用户发送一个临时密码,让他们更改密码。最初存储的密码(应该散列!)永远不会更改为临时密码,以防用户记住它

    原始密码永远不会显示给用户,因为它应该是散列的和未知的。


    注意此过程完全依赖于用户电子邮件帐户的安全性。因此,这取决于您希望实现的安全级别。对于大多数网站/应用程序来说,这通常就足够了。

    如前所述,这取决于所需的安全级别,但是,如果您需要更高级别的安全,我看到的一些新颖解决方案包括:

    • 在确认用户身份(安全问题、电子邮件地址等)后显示临时密码的一半,然后将另一半发送到电子邮件帐户。如果电子邮件帐户已被泄露,则不太可能是同一个人也成功实施了中间人攻击。(见英国政府门户网站)

    • 通过电子邮件和其他媒介确认身份-例如,通过文本发送到注册手机的代码。(见易趣/贝宝)


    因为在这两个极端之间的某个地方,实施安全问题可能是DaveG提到的方法。

    当您通过电子邮件发送任何信息时,它将不安全。有太多的方法可以让人得到它。对于一个想要窃取你的信息的熟练黑客来说,这简直是儿戏

    不要通过电子邮件发送任何个人信息,如密码和收入信息,因为如果这些信息被泄露或被盗,可能会让您和您的组织感到非常尴尬。认真考虑安全问题。只要发生一件事,所有的砖头就会倒塌

    关于密码检索,请仔细阅读

    归根结底,这是一个应用程序 遵循最佳实践