强制用户使用强密码有效吗?

信息安全 密码 用户教育
2021-08-26 07:08:17

我正在设计一种服务,除其他外,它可以存储敏感信息。为确保不会未经授权访问此信息,将使用从其密码 (PBKDF2) 派生的密钥对其进行加密。密码将以 BCrypt 散列 + 加盐格式存储在数据库中。它永远不会以纯文本形式存储。

所保存信息的性质使得需要强密码。一些网站通过强制执行严格的字符准则来强制其用户使用具有大熵的密码。这些复杂的密码可能导致不同网站上的密码重用 [1]。这是一件坏事™ [2]。

我宁愿让我的用户选择一个既强大又不太可能被重复使用或已经在另一个不太安全的 Web 服务上使用的密码。因此,我正在考虑为我的用户以他们的母语使用类似于 XKCD [3] 的密码方案。

用户将看到来自超过 6 个字符的大型单词列表中的 4-5 个不同的单词(没有包含特殊字符的单词,只有 ASCII)。密码输入对话框将被格式化为 4-5 个字段而不是普通的单个字段,以加强密码短语范式。注册后,可以随意重新生成密码,使用户能够选择由他们容易记住的单词组成的密码短语。用户不能输入自己的话。

我从个人经验中知道 CreeperHost [4] 已经使用了这种方法,尽管只有一个密码字段和四个连接的英文单词。

我的问题如下:

  • 这种方法会比让用户自己选择更安全/有效吗?
  • 有没有人有实施类似计划的经验?有效吗?
  • 将密码字段划分为多个不同的字段是有益的还是会暴露太多信息?

我正在专门寻找与这种特定方法的实际应用相关的答案(如果有的话)。我熟悉这种密码生成方法的理论优缺点。


  1. 纠结的密码重用网络 - http://www.jbonneau.com/doc/DBCBW14-NDSS-tangled_web.pdf
  2. 密码重用 - http://xkcd.com/792/
  3. 密码强度 - http://xkcd.com/936/
  4. Creeperhost - http://www.creeperhost.net/
4个回答

允许任何密码。只是强调后果。

你的计划对用户来说很奇怪和陌生,我相信很多人宁愿停止使用你的服务也不愿遵守。您不是让他们选择自己的密码,而是强迫他们记住您为他们选择的密码。这是大多数人无法接受的。您认为您通过“再试一次”给他们一个选择,但用户体验的差异与 ATM 与单臂强盗大致相同。

请记住,最大的问题是人为因素。您首先应该避免的是将密码写在白板上。这些人有一个非常安全的密码。然后它在电视上播出

如果你想确保你身边没有人能够破解它,那么你需要的是内部程序,而不是猴子培训用户。可能一个系统对加盐密码的访问受到与用户登录面板相同的重试限制的保护。此外,让工人无法进入并不重要。商店的文员可以无限制地使用收银机。防止盗窃的是意识到不可避免的后果。使用管理员会话记录。使用“最少 2 人访问”程序。银行就是这样做的,因为强大的用户密码不能保护一切。

具体问题:

这种方法会比让用户自己选择更安全/有效吗?

是的。您将减少密码重复使用并立即删除非常常见的密码。

有没有人有实施类似计划的经验?有效吗?

过去我见过很多“替代”密码方案。大多数只是增加了支持问题和复杂性,而没有显着提高安全性。

将密码字段划分为多个不同的字段是有益的还是会暴露太多信息?

我认为您已经通过与众不同来击败基本的自动无知识攻击。这留下了有针对性的攻击。但是,如果有可用的公开注册,那么攻击者可以发现您需要 5 个字或其他任何内容。因此,我认为您不会通过将信息拆分为字段来为攻击者提供更多信息。

显然,如果身份验证失败,请不要提供有关哪些单词是错误的建议 - 这将破坏安全性!

更多建议

关于可用性的其他答案中还有很多其他好的建议。

如果安全性和可用性很重要,也许可以看看比密码更好的东西。也许是短信?

很可能长时间使用密码,但仍然无法正确处理风险。用户计算机上的特洛伊木马、通过被黑客入侵的电子邮件帐户重置身份验证、网络钓鱼……有些事情是再多的花哨的密码方案和控件都无法解决*。

如果数据很重要,我会做比密码更好的事情。

(有时您最好为用户生成一个随机密码并要求他们将其安全地存储在上锁的抽屉中。这取决于您担心的威胁和攻击,以及系统的使用方式。)

*对于谷歌提供的基于风险的两因素方法,有很多话要说,其中两因素身份验证只是偶尔触发。它控制了成本并极大地提高了安全性。但除非你手头有很多时间,否则我会外包这个:)

您应该阅读有关Diceware的信息。您可以从一个小得多的列表中获得 44 位熵和四个单词。如果您的列表是 2050 个左右的单词并且您选择不替换,则每个单词将是大约 11 位熵,因为 log 2 (2048) = 11。使用 5,000 个单词,您可以获得每个单词 12 位。(日志2 (4096) = 12)

我喜欢“重试”链接的想法,用户可以单击该链接,直到出现他们认为可以记住的组合。

关于你的问题的一件事困扰着我。如果数据使用特定用户的密码加密,则只有该用户才能解密数据。如果您的数据是按用户存储的,那可能没问题。请注意,如果用户忘记了他或她的密码,那么如果密码是加密密钥,则数据将被烤掉。鉴于此,您可能真的需要考虑非对称密钥安排。

为了访问,不要将输入分成四个字段。这为攻击者提供了攻击者不应该拥有的信息。只需决定单词是否用空格分隔并告诉您的用户。

我看到这种方法的问题只是它的非传统性质,这将降低人们甚至使用它的可能性。

就个人而言,我必须有一个非常令人信服的理由才能使用该服务才能忍受这一点,而不是传统的密码输入。我过去曾评论说,我认为应用程序开发人员有责任尝试确保用户使用强密码。然而; 最终这是用户的责任。

还要考虑您正在强迫用户采用一种特定的方法来确保密码熵。XKCD 方法很好,但它不是唯一的方法,也没有绝对的经验证据表明它是最好的,也不能保证如果它今天是最好的,它会在 6 个月后仍然是最好的现在。

请考虑使用密码管理器,它可以生成非常大的、完全随机的密码并自动为用户输入这些密码。您可能会使用这种方法破坏这些应用程序。

另外,请考虑诸如 grc.com密码 haystacks文章之类的内容,该文章声称:

D0g.....................

...比这更强大的密码:

PrXyc.N(n4k77#L!eVdAfp9

...仅仅是因为有一个额外的字符,尽管整体熵(随机性)相当低,并且计算机需要 95 倍的时间来暴力猜测更容易记住的密码。

问题是暴力攻击只真正使用到一定长度的密码(6 到 8 个字符),因为随着密码的变长,计算成本会很高。但即使是非常复杂的短密码也很容易受到暴力破解。较新的攻击是基于混合模式的攻击,使用受损密码作为较大密码中的模式。强大的 GPU 使这种方法可行,而且显然它非常有效。简单地用 's 填充弱密码.似乎不是一个好的解决方案。

另请参阅这篇文章,密码复杂性规则比冗长的规则更烦人,效果更差

因此,至少最近的一些研究表明,与密码强度最相关的因素是密码长度,至少部分原因是对于大多数用户来说,密码过于复杂,即使它们很短。XKCD 方法通过使很容易记住很长的密码来帮助确保密码长度,而这些密码不是简单的众所周知的模式或短语。那就是(可能)它是最终的强度——只是生成的密码的长度。话虽如此,我开始想知道“正确的马电池主食”将在多长时间内承受更新的基于混合模式的攻击。

由于还有其他方法可以实现相同的结果,因此强迫用户使用该方法实际上可能会使您的服务更难使用,而没有相应的安全性回报。此外,如果从现在起六个月后在 XKCD 方法中发现一些弱点,那么您已经被硬连线了,并且必须花费大量精力来更改您的服务。