关于安全:什么更安全?

What is safer? Should I send an email with a URL that expires to users to reset their password or should I email a newly generated password?

我想知道当用户忘记密码时,什么是更安全的选择

  • 向电子邮件地址发送随机生成的新密码(我的数据库中的所有电子邮件地址都已确认有效)。

  • 发送一封电子邮件,其中包含一个链接,该链接将在用户可以重置其密码的特定时间段内过期。

除了后者使用额外的表之外,您认为什么是更安全/更好的做法?


如果发送包含密码的电子邮件,则意味着:

  • 密码将通过某些网络(未加密),可以"看到"
  • 密码将保留在用户的邮箱中
    • 可以破解的
    • 任何一个有权使用电脑的人都可以看看

所以,在电子邮件中发送密码似乎不太安全…

作为一个用户,我会觉得我的密码是"更安全"的链接,包含某种令牌,并在一段时间后过期。

"过期一段时间"这一部分很重要,顺便说一句:它确保如果有人在一段时间后单击链接(例如,访问用户邮箱的人),该链接将不会用于生成新密码。

当然,这意味着我不能仅仅"在邮箱中搜索"来找到密码——但我总是可以要求一个新的密码,我又忘记了它。^^


这里的其他答案让人困惑。它们完全一样。两者都允许访问用户的帐户,都以纯文本形式发送,并且都是常用的。选择你喜欢的。

一旦使用链接/密码,立即强制更改密码,并在24-72小时后使链接/密码过期。


Send an email with a link that expires within a certain time frame where the user can reset their password.

当然是那个。

电子邮件始终是清晰的(可能您的站点连接可能不清晰),并且可以接触更多的机器。不要在电子邮件中输入密码。临时重置令牌还意味着,如果邮箱稍后被黑客入侵,令牌将不再使用。

Aside from the fact the latter uses an extra table,

不必。您可以生成一个加密令牌,授权特定用户在特定时间内重置密码;不需要额外的数据。

使用基于HMAC的消息身份验证代码(花式哈希)的示例:

1
2
3
details= user_id+' '+token_expiry_timestamp
mac= hmac_sha2(server_secret, details)
token= details+' '+mac

然后将token作为邮件中可点击URL的一部分发送给用户。当您收到一个点击返回时,计算出该用户和时间的mac应该是什么,以及您的服务器端机密,并对照传入的mac检查它。如果匹配,则必须是您之前签名的密码请求。

1
2
3
4
5
6
7
8
user_id, token_expiry_timestamp, mac= token split on ' '
details= user_id+' '+token_expiry_timestamp
if hmac_sha2(server_secret, details)!=mac
    complain
else if token_expiry_timestamp<now
    complain
else
    allow password for user_id to be changed

这不需要状态,但是您应该使用较短的过期时间,因为如果不记录使用情况,令牌可以多次使用。


人们似乎忽略了一个不同点,那就是——以一个Web应用程序为例——密码重置选项通常对访问一个站点并且知道要重置密码的帐户的用户名/登录名的任何人都是开放的。

通过在电子邮件中发送一个链接,用户必须单击该链接才能重置其密码,这样可以避免用户意外或恶意地重置其他人的密码-只会让他们收到一封以"如果您没有要求重置密码,请忽略此电子邮件"结尾的电子邮件。

即使这本身不是一个安全风险,在没有确认的情况下重置密码可能是一个主要的麻烦。


显然后者更安全。电子邮件就像一张明信片。几乎任何人都可以随意阅读。此外,一旦密码被更改,发送电子邮件以关闭循环。


有些人认为两者都是等效的——这是不正确的,原因如下:

1)使用重置链接,如果攻击者有权访问电子邮件,因此使用重置链接更改密码,即使攻击者删除了实际重置电子邮件和通知,他们也会提醒用户。如果用户请求重置邮件密码,并且攻击者看到随机密码(甚至更晚),则攻击者可以访问您站点上的用户帐户而不向用户发出警报。

2)另外,如果您发送密码,用户可能会尝试在其他站点上重新使用密码,并且具有电子邮件访问权限的攻击者可以访问其他站点,即使其他站点不易受到帐户恢复接管的影响。

通过在电子邮件和重置链接中发送随机密码,如果攻击者控制用户的电子邮件,他们就可以访问用户的帐户。在这种情况下,您可以做什么,取决于您拥有多少用户的句柄-例如,如果您有他们的主要和备用电子邮件地址,那么当请求和使用重置时,您应该向两个电子邮件帐户发送通知,或者如果他们有电话,您可以向他们发送除电子邮件之外的文本,等等。您可以监视使用情况本身b但这更难。

其他几个问题:

链接可以多次使用吗?除了过期和具有不可预测的值(带有附加的MAC以便在没有服务器状态的情况下进行验证),如果多次尝试重置某个帐户的密码(注册成功/失败、远程IP地址、时间戳等),并在第一次尝试后中止并使该帐户处于某些不活动状态,则可能需要关闭内部警报。E状态。

如果你需要更多的防御机制来防止通过你的账户恢复流程(取决于账户的价值)接管账户,那么看看有多少滥用是一个好主意。

同样重要的是,在这种情况下,如果可以的话,保持最新的电子邮件地址和其他联系信息(电子邮件地址在不使用时会被回收),以及如何更新/添加电子邮件地址或其他此类信息和通知。

和往常一样,确保你的通知(文本、链接、登录页面)不会让钓鱼者更容易接受。

当然,这些问题中的一些可能不是很重要,除非你有一个大网站。


  • 给他们发一封随机的一次性邮件,密码。

  • 强迫他们改变他们第一次到达时的密码。

  • 通知他们他们改变了密码。

  • 发送随机密码的风险与发送链接的风险一样大。也就是说,任何人都可以先收到电子邮件,然后第一次以用户身份登录。

    通过强制更改,任何第一个到达的人都不能在没有设置密码的情况下再次到达那里。

    通知用户更改会告诉他们密码已更改,这可能发生在攻击者实际登录并更改通知电子邮件之前。

    因此,如果有人先到达站点,那么发送给用户的原始电子邮件将不再有效,因为原始密码不再有效。另外,他们会收到密码更改的通知。

    这为他们提供了一个机会,让他们在系统管理员出现并发现他们无法登录到他们的帐户时通知他们。

    这些都不能阻止一个人截取电子邮件并获得一些访问权,但至少它让原始的、既得利益的、用户知道有什么问题。


    我一直很喜欢设置哈希代码并给它们一个链接。

    之后向用户发送一封电子邮件,让他们知道他们请求了一个密码恢复链接,在他们设置了一个通知他们密码被更改后,这通常是一种很好的礼貌,以防出现违规行为。

    如果用户无意更改密码,他们会很快对一封电子邮件作出反应。

    不幸的是,没有真正的"安全"方法。安全问题一个别针可以帮助,但从来没有真正的安全。


    只要URL不要求密码或其他类似的密码,它仍然比随机发送的密码要好,但仅仅是因为它不会将密码以纯文本形式保存在收件箱中。

    换句话说,链接减少了机会的窗口。


    从Bobince的解决方案扩展…这里需要用户在密码重置页面上重新输入用户名和令牌。

    按要求重置密码页

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    urserId = Input userId
    token = Randomly generated token (or one time password)
    tokenExpire = Decide token expiry date/time
    Store in DB tokenExpiry for this urserId
    urlToken= MD5 hash value of (urserId + token + tokenExpire)
    pwdRestURL = server pwd reset url +"?urlToken=" + urlToken

    Send above generated URL and make sure you do not
        include either of userId or token in email

    Display token to user (This is to be used on password reset page)

    .

    在密码重置页面上(使用上面的pwdressturl url)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    urlToken = Token from URL request
    userId = Input userId
    token = Input token
    tokenExpiry = tokenExpiry from DB for this user
    resetToken = MD5 hash value of (urserId + token + tokenExpire)
    IF
        resetToken == urlToken
        AND tokenExpiry for user is valid
    THEN
        Clear tokenExpiry
        Allow user to change password
    ELSE
        Display Error
    END IF

    .

    上述方法的优点:

    • 即使电子邮件在网络,没有人可以重置密码不知道用户ID和令牌。
    • 令牌有有效期
    • 没有明确的测试个人信息是通过电子邮件转发


    虽然我可能会重复一些答案,但我觉得必须做出响应,因为我们最近遇到了一些关于错误密码恢复工具的问题。我的一个同事的个人帐户被泄露了,这使得我们的谷歌托管的域名应用被泄露了。由于未删除的纯文本密码和愚蠢的密码恢复问题,googleable其他帐户也受到了威胁。

    只需说,我是一个强烈的坚持电子邮件链接到期后4小时。我在那里坐了4个小时登录到我们的一个帐户后,收到链接,确保它仍然是不妥协的。24-48小时太长了,不必这么做。4小时太长了。用户下次登录时需要更改的随机生成的密码是第二好的,但它完全取决于实际登录的用户。密码将永久更改,但是如果用户对链接不做任何操作,则不会重置密码。

    对于一个想危害你的系统的有献身精神的人来说,没有完美的解决方案。有比其他更好的解决方案。


    向他们发送一个链接,以便他们以后可以重置密码。这会迫使他们在一定程度上确认他们正在重置密码的帐户。如果您在不发送电子邮件的情况下重置密码,则任何人都可以登录该站点并重置任何其他人的密码。这会造成拒绝服务类型的漏洞。


    我同意威尔的程序。

    但是,如果您只在给定的选项之间进行选择,尽管这两个选项在本质上是相同的,因为您通过电子邮件发送信息,我认为后者是一种更常见的方法。

    如果黑客请求新密码,用户的旧密码将不再有效。至少对于后一个选项,它实际上不会更改任何用户详细信息。


    除了Ceeyajoz,所有人都在使用有缺陷的逻辑。很难考虑安全问题。

    这两种情况都使用纯文本的电子邮件。当电子邮件被黑客攻击时,两者都同样不安全。

    不管URL是否过期,因为电子邮件被黑客攻击,黑客只需请求另一个密码重置URL。如果临时密码已经更改,黑客就可以请求一个新密码。不管怎样,你都完蛋了。

    所以我说只要发送密码,这样用户就可以少选一个新密码了。

    编辑当我说"发送密码"时,它是在操作的上下文中,您发送一个新的随机密码。