建议的最小密码长度约为 8 个字符,那么有没有标准/建议的最大密码长度?
最大密码长度应该是多长?
这个问题的答案,就像安全中的很多问题一样,是“取决于”。
查看密码长度时需要考虑几个因素。首先是长密码旨在防止的一些事情,这通常是密码猜测攻击(在线或离线)的蛮力。
对于在线密码猜测,如果您有一个相对激进的锁定策略(例如,3 次错误尝试,然后是不确定的锁定),那么针对单个帐户的攻击不太可能成功,除非攻击者清楚密码是什么将。
如果您正在寻找针对具有相同锁定策略的大量用户的攻击,攻击者可以在其中计算出用户名(例如网络论坛),那么最重要的因素可能是使用的密码不是任何真的很常见。
顺便说一句,在帐户锁定方面需要注意的一件事是,这里针对在线应用程序的激进策略可以使拒绝服务攻击变得非常容易,而无需额外的对策。
如果存在离线暴力破解的风险,那么密码强度就变得更加重要。这里的问题是,改进的处理能力和攻击方法使其在强度方面成为移动目标。实际上,我会说您会查看 10 多个字符并强制执行密码不在常见字典列表中(例如 @andy 说密码短语在这里是一个不错的选择)。
这里要考虑的另一个因素是您的用户群,以及应用程序的使用方式。在某些情况下,我会说非常严格的密码要求实际上会导致应用程序的安全性降低。如果您有一个用户在同一个地方的应用程序(例如,许多公司应用程序)并且您使密码策略非常“强”(在密码长度和轮换要求方面),那么用户很可能会开始写下他们的密码,这可能首先破坏了该应用程序的安全目标之一。
关于这方面的更多信息的一个很好的来源是一本书,名为Authentication: From Passwords to Public Keys
到目前为止答案很好,但我想提出另一种可能性:密码短语。正如StackOverflow自己的 Jeff Atwood 所建议的那样,如果您不受技术限制的限制,您可能会考虑允许和建议密码短语。您可以强制执行它们,但这可能会疏远大多数网站上的一些用户。由于它们的长度,它们可能更难破解,而且它们也比“A1lUrB@se!”之类的密码更容易记住。或类似的事情。
如果您要对密码进行哈希处理,为什么要设置上限?
您不必担心达到文本字段的最大字符限制,无论是基于 Web 还是其他方式。因此,您可以想象最多设置几百个字符,以限制您正在使用的任何文本字段的一些边界条件。
当然,如果您正在谈论生成一个您将尝试在多个站点上使用的密码,那么没关系;似乎没有人同意这一点。更糟糕的是,我发现网站在不同的输入字段上具有不同的最大字符限制,因此要登录,您必须首先输入错误,然后才能获得恰好允许更多字符的不同字段。当然,如果每个站点都只是让它成为典型文本字段的最低预期能力,而不试图人为地限制它,那么大约 2k 个字符是允许的,你根本不必担心这一点。
编辑添加:这里顺便提到的东西让我暂停:
您必须将散列工作扩展到您的服务器或设备上可用且合理的范围内。例如,我们在 Discourse 中有一个小的拒绝服务错误,我们允许人们在登录表单中输入最多 20,000 个字符的密码
因此,如果您以一种计算成本尽可能高的方式对事物进行哈希处理,那么对设置和尝试密码设置一个合理的限制可能是值得的。几百个字符可能仍然可以防止事情过度爆炸,同时仍然比用户可能尝试的要多得多。