我应该对密码施加最大长度吗?

Should I impose a maximum length on passwords?

提问人:nickf 提问时间:9/19/2008 更新时间:9/8/2022 访问量:103201

问:

我可以理解对密码施加最小长度很有意义(以节省用户自己的身份),但我的银行要求密码长度在 6 到 8 个字符之间,我开始想知道......

  • 这难道不会让暴力攻击变得更容易吗?(坏)
  • 这是否意味着我的密码是以未加密的方式存储的?(坏)

如果有人(希望)有一些优秀的 IT 安全专业人员为他们工作,并且施加了最大密码长度,我是否应该考虑做类似的事情?这样做的优点/缺点是什么?

安全 加密 密码

评论

21赞 Stu Thompson 9/19/2008
几乎可以肯定的是,有一个“三击就出局”的政策,它消除了暴力攻击的威胁。
30赞 mparaz 2/12/2009
对于非遗留系统(如现代网站)来说,这是没有借口的。
7赞 call me Steve 5/31/2010
我不认为答案是纯粹的 IT。最小大小 (6) 和最大尝试限制“可能”以消除疯狂的猜测。我的猜测是,最大大小 (8) 是为了限制对“哎呀,我忘记了我的代码”或“我输入代码以快速”或“我输入错误一个字符”等的支持调用次数(以及因此的成本)。除了你写密码的纸,如果你不记得它..
20赞 cwap 8/25/2010
我就读的大学有非常愚蠢的密码规则:只有 8 个字符,至少 1 个数字,但不在密码的开头或结尾,需要来自键盘上 2 行以上的字符等。最后,它们通过-.- .这些规则使暴力破解更容易我知道你很傻,但请不要制定那样愚蠢的规则!(只是不得不把它从我的系统中拿出来:))
19赞 Roman Starkov 12/16/2010
@call 好吧,如果你出于这个原因强加了最大长度,那么你会收到我的“我忘记了密码”的电话,因为我的网站唯一密码都很长,将我限制在 12 个字符是保证我不会记住它的可靠方法。

答:

0赞 LizB 9/19/2008 #1

存储空间便宜,为什么要限制密码长度。即使您要加密密码,而不仅仅是对其进行哈希处理,64 个字符的字符串也不会比 6 个字符的字符串加密更多。

银行系统很可能覆盖了较旧的系统,因此他们只能为密码留出一定的空间。

评论

9赞 Stu Thompson 9/19/2008
除非有非常正当的理由,否则密码应该进行哈希处理。哈希生成固定长度的字符串。除非系统存储实际密码,否则没有空间参数,这可以说是一个糟糕的主意。
10赞 Roman Starkov 5/19/2011
加密密码是一个糟糕的主意。一个不道德的员工就是你泄露无数密码所需要的一切。从一开始就不存储它们,从而省去麻烦。
222赞 epochwolf 9/19/2008 #2

密码被散列为 32、40、128,无论长度如何。最小长度的唯一原因是防止容易猜到的密码。最大长度没有目的。

强制性的 XKCD 解释为什么如果你强加一个最大长度,你会对你的用户造成伤害:

The obligatory XKCD

评论

8赞 André Chalella 9/19/2008
也许银行可能会选择限制密码,因为在自动取款机上,您输入的密码不能超过 8 个字符。
14赞 nickf 9/19/2008
好吧,至少在自动取款机上,如果你尝试暴力攻击,它会吃掉你的卡。不过,我指的是仅在线登录的密码。
46赞 jevon 8/10/2011
可悲的是,这假设密码总是被哈希处理。最大长度密码是以明文形式存储的密码的症状。
18赞 Roman Starkov 8/30/2011
唉,即使在 PayPal,“正确的马电池钉书钉”也比他们的<审查>最大长度高出 8 个字符......总台
5赞 Vicky Chijwani 4/15/2017
@kleinfreund因为如果密码是哈希的,密码长度对他们来说并不重要(哈希函数将任何长度的字符串转换为固定长度)。
4赞 Lucas Oman 9/19/2008 #3

我认为你在这两个要点上都非常正确。如果他们按应有的方式存储哈希密码,则密码长度不会影响其数据库架构。具有开放式密码长度会引发暴力攻击者必须考虑的多一个变量。

除了糟糕的设计之外,很难看到任何限制密码长度的借口。

23赞 Sparr 9/19/2008 #4

首先,不要以为银行有优秀的IT安全专业人员为他们工作。很多没有

也就是说,最大密码长度毫无价值。它通常要求用户创建一个新密码(暂时搁置关于在每个站点上使用不同密码的价值的争论),这增加了他们写下密码的可能性。它还大大增加了从蛮力到社会工程的任何载体攻击的敏感性。

评论

0赞 Stu Thompson 9/19/2008
同意!看看过去几年英国银行在线访问安全故障的一连串......
6赞 Roman Starkov 12/16/2010
我已经通过一个让我记住所有密码的方案在每个网站上使用不同的密码,但它们都很长。我唯一在便签上写下密码的网站是那些施加愚蠢的最大长度限制的网站,从而迫使我远离我喜欢但唯一的密码......
0赞 Sparr 12/17/2010
@romkyns我认为你的方案不使用符号?我曾经有过这样的方案,可以产生短而难以暴力破解的密码,但是当我使用的 10-20% 的网站禁止使用常见的特殊字符时,我不得不放弃它。
0赞 Roman Starkov 12/17/2010
没有特殊字符,没有,但它总是添加数字和大写字符,因为我知道有些网站需要这样做。希望我在想出它时就知道最大长度限制......但是到目前为止,我为近亲编造的(更简单的)计划非常有效!
1赞 Sparr 12/17/2010
此类方案@romkyns其他问题:共享密码的网站。如果你的方案类似于nameofwebsitefO0(googlefO0,yahoofO0等),那么你怎么记住你应该在 flickr.com 上使用“yahoofO0”,或者在 askubuntu.com 上使用stackoverflowfO0?使密码过期的网站。然后,您需要扩展方案以包含可以更改的部件。但是,如果过期规则检查子字符串,则失败。
0赞 tekiegreg 9/19/2008 #5

应该有最大长度吗?这在IT领域是一个奇怪的话题,因为较长的密码通常更难记住,因此更有可能被写下来(出于显而易见的原因,这是一个很大的禁忌)。较长的密码也往往会被遗忘,虽然不一定是安全风险,但可能导致管理麻烦、生产力损失等。认为这些问题迫在眉睫的管理员可能会对密码施加最大长度。

我个人认为,在这个具体问题上,每个用户都有自己的。如果您认为自己可以记住 40 个字符的密码,那么您就更强大了!

话虽如此,密码正迅速成为一种过时的安全模式,但智能卡和证书身份验证被证明很难甚至不可能像您所说的那样暴力破解,并且只需要将公钥存储在服务器端,私钥始终在您的卡/计算机上。

评论

0赞 Katastic Voyage 2/9/2017
人们可以很容易地记住最喜欢的歌词、圣经经文或其他谚语。与典型的密码相比,这些密码非常长。我刚刚测试了一个,结果是 79 个字符!(当然,密码短语越长,出错的可能性就越大。更糟糕的是,当一个愚蠢的网站没有向你显示你在密码框中输入的最后一个字符时。
0赞 benPearce 9/19/2008 #6

较长的密码或密码短语更难仅根据长度破解,并且比需要复杂的密码更容易记住。

可能最好选择相当长的 (10+) 最小长度,限制长度无用。

4赞 DrStalker 9/19/2008 #7

我能看到的最大密码长度的唯一好处是消除了由过长的密码引起的缓冲区溢出攻击的风险,但是有更好的方法来处理这种情况。

评论

1赞 Dan Bechard 1/11/2014
应该有一个最大输入长度,是的,但它绝对不应该< 64。最大长度为 8 或 12 简直是荒谬的。
79赞 Jason Dagit 9/19/2008 #8

如果您接受来自不受信任来源的密码,则允许完全不受限制的密码长度有一个主要缺点。

发件人可能会尝试为您提供如此长的密码,从而导致其他人拒绝服务。例如,如果密码是 1GB 的数据,并且您花费了所有时间接受它,直到内存耗尽。现在假设此人向您发送此密码的次数与您愿意接受的次数相同。如果您不注意所涉及的其他参数,这可能会导致 DoS 攻击。

按照今天的标准,将上限设置为 256 个字符似乎过于慷慨。

评论

44赞 epochwolf 9/19/2008
您仍然可以发送 1GB 的数据,但有最大限制。进行限制的软件几乎总是在网络服务器后面。
12赞 rcreswick 9/20/2008
不过,在执行计算密集型操作之前,您仍然可以删除除前 256 个字符之外的所有字符。在 1gb 数据上运行 sha 哈希比在 256 个字符上运行相同的哈希需要更长的时间
3赞 Piskvor left the building 8/11/2011
@Eyal:在 Web 应用程序的客户端上发生的任何事情本质上都是不可信的;因此,哈希成为密码等价物,使这种做法徒劳无功。(Web 浏览器可能不接受 1 GB 的文本输入,自定义客户端可能会在“thisisthehashedpassword”表单字段中发送 1 GB 的字符串)
4赞 Eyal 8/15/2011
@Piskvor:但无论如何都无法阻止 1 GB 字符串。用户始终可以请求 example.com/?password=abcabcabcabc...并随心所欲地提出他的要求。标准 DoS。
6赞 5/25/2012
幸运的是,@Piskvor 和 Eyal,Apache 和 IIS(可能还有其他成熟的服务器)限制了通过 URL 传递的字段的长度:boutell.com/newfaq/misc/urllength.html
-4赞 user17000 9/19/2008 #9

只有 8 个字符长的密码听起来完全错误。如果应该有一个限制,那么至少 20 个字符是更好的主意。

评论

3赞 Luke Stevenson 8/21/2014
但事情就是这样——根本不应该有限制。
9赞 mbac32768 9/19/2008 #10

我能想象到强制执行最大密码长度的一个原因是,如果前端必须与许多遗留系统后端接口,其中一个后端本身会强制执行最大密码长度。

另一个思考过程可能是,如果用户被迫使用短密码,他们更有可能发明随机的胡言乱语,而不是容易猜到的(被他们的朋友/家人)的流行语或昵称。当然,这种方法只有在前端强制执行混合数字/字母并拒绝包含任何字典单词的密码(包括用 l33t-speak 编写的单词)时才有效。

评论

1赞 Katastic Voyage 2/9/2017
虽然可以理解,但遗留系统有时必须决定设计。无论可能,他们都不应该影响它。在新系统中,您最不希望看到的就是在现代安全攻击还未普及之前就设计出安全策略的系统。或者更糟糕的是,较新的软件,但一开始就设计不正确。现有的公司系统可能使用 HTTP,但这并不是在新系统或扩展中不使用 SSL 的理由。同样,密码策略不应该仅仅因为 LAST 的人做错了而继续容易受到攻击。如果保留,最好进行一项巨大的成本/收益研究。
0赞 user1921 9/19/2008 #11

遗留系统(已经提到)或与供应商系统外部的接口可能需要 8 个字符的上限。这也可能是将用户从自己手中拯救出来的错误尝试。以这种方式限制它将导致系统中的 pssw0rd1、pssw0rd2 等密码过多。

1赞 Vincent McNabb 9/19/2008 #12

我的银行也这样做。它曾经允许任何密码,而我有一个 20 个字符的密码。有一天我更改了它,瞧瞧,它给了我最多 8 个,并且删除了我旧密码中的非字母数字字符。对我来说没有任何意义。

银行的所有后端系统以前在我使用带有非字母数字的 20 个字符密码时都可以工作,因此遗留支持不可能是原因。即使是这样,他们仍然应该允许你拥有任意密码,然后进行符合遗留系统要求的哈希值。更好的是,他们应该修复遗留系统。

智能卡解决方案不适合我。我已经有太多的卡片了......我不需要其他噱头。

评论

1赞 Chris Gomez 8/22/2014
当他们的哈希数据库被盗时(我的意思是当)他们的哈希数据库被盗时,他们切断了重要的密钥空间,这些密钥空间会延长到暴力攻击的时间(假设他们甚至加盐/哈希/拉伸,我敢肯定他们不会)。是时候换银行了。
83赞 tardate 9/19/2008 #13

在密码字段中指定的最大长度应读取为安全警告。任何明智的、有安全意识的用户都必须假设最坏的情况,并期望这个网站从字面上存储你的密码(即没有哈希,正如 epochwolf 所解释的那样)。

在这种情况下:

  1. 如果可能的话,避免像使用瘟疫一样使用这个网站。他们显然对安全一无所知。
  2. 如果您确实必须使用该网站,请确保您的密码是唯一的 - 与您在其他地方使用的任何密码不同。

如果您正在开发一个接受密码的网站,请不要设置愚蠢的密码限制,除非您想用相同的刷子涂上柏油。

[当然,在内部,您的代码可能只将前 256/1024/2k/4k/(无论)字节视为“重要”字节,以避免处理庞大的密码。

评论

21赞 Roman Starkov 5/19/2011
我还向这些网站发送了一封标准电子邮件,提到他们强迫我使用更短、更不安全的密码,而且我也碰巧在每个施加这种愚蠢限制的网站上重复使用该密码。这让他们知道这是一个问题,也可能给 Joe Coder 一些杠杆作用,可以向上级展示:证明用户实际上因此而对网站有不好的看法。
4赞 benc 6/28/2012
我不确定您是否应该假设密码最大值意味着他们正在存储纯文本密码。有时,它们会截断输入,并简单地将第一个 x 字符传递到 hashing() 中。(检查方法是将密码设置为超出限制,然后尝试使用超出最大长度的密码字符变体登录)。
6赞 tardate 7/1/2012
@benc当然,这是可能的,但关键是,作为用户,你无法知道这是否是他们正在做的事情。最大长度(尤其是短长度)是一个警告信号,我认为最好假设最坏的情况(或与提供商联系以让他们确认)。
2赞 kleinfreund 3/6/2017
请详细说明。这个答案只是一个陈述。
2赞 emorris 1/25/2018
最大密码并不一定意味着它存储为纯文本;这可能是出于技术原因,例如 bcrypt 只允许最多 72 个字符的密码。
-4赞 Josh Hunt 9/22/2008 #14

我认为唯一应该应用的限制是 2000 个字母的限制,或者其他过高的东西,但只有在有问题的情况下才能限制数据库大小

评论

9赞 epochwolf 9/24/2008
密码应该被哈希...数据库大小不会成为问题,因为密码是哈希的。
4赞 Kenny Evitt 6/12/2012
@epochwolf – 我能想到为什么密码不应该总是被哈希处理的一个原因(因为我今天自己发现了它):需要代表用户提交给第三方的密码不能存储为哈希值。[例如,需要存储通过外部域发送电子邮件的凭据的应用程序。
8赞 AardvarkSoup 9/8/2012 #15

施加一些最大密码长度的一个潜在正当理由是,哈希处理过程(由于使用了慢速哈希函数,如bcrypt)占用了太多时间;可能被滥用以对服务器执行 DOS 攻击的东西。

再说一次,服务器应配置为自动删除耗时过长的请求处理程序。所以我怀疑这会是一个很大的问题。

评论

0赞 dewd 6/4/2022
我刚刚调试了一个密码问题,发现 bcrypt 只使用前 72 个字节。如果密码较长,则没有错误。因此,如果前 72 个相同,但之后的任何内容都不同,则密码将有效。
25赞 kravietz 5/14/2013 #16

OWASP 身份验证备忘单现在不鼓励将最大密码长度设置为小于 128 个字符

https://www.owasp.org/index.php/Authentication_Cheat_Sheet

引用整个段落:

密码越长,字符组合越多,因此攻击者更难猜到。

密码的最小长度应由应用程序强制执行。 少于 10 个字符的密码被视为弱密码 ([1])。 虽然最小长度强制执行可能会导致某些用户在记忆密码方面出现问题,但应用程序应鼓励他们设置密码短语(句子或单词组合),这些密码短语可能比典型密码长得多,但更容易记住。

最大密码长度不应设置得太低,因为它会阻止用户创建密码短语。通常最大长度为 128 个字符。 如果密码短语仅包含小写拉丁字符,则短于 20 个字符的密码通常被认为是弱密码。每个角色都很重要!!

确保用户键入的每个字符实际上都包含在密码中。我们已经看到系统将密码截断的长度短于用户提供的长度(例如,当他们输入 20 个字符时,在 15 个字符处被截断)。 这通常是通过将所有密码输入字段的长度设置为与最大长度密码完全相同的长度来处理的。如果您的最大密码长度很短(例如 20-30 个字符),这一点尤其重要。

评论

13赞 Matthew 9/6/2017
此源不建议最大密码长度限制,不建议最大密码长度限制较低(小于 128 个字符)。
0赞 dequin 9/27/2020
感谢您的参考!尽管现在(2020 年),由于对哈希算法的一些限制,他们的建议发生了变化。例如,使用 Bcrypt 的系统为 64 个字符。
1赞 piotrek 9/15/2021
引用的备忘单现在明确指出,您应该设置密码长度限制:“设置最大密码长度以防止长密码拒绝服务攻击非常重要。
0赞 Chris J 3/15/2014 #17

密码可能不进行哈希处理的一个原因是使用的身份验证算法。例如,某些摘要算法需要服务器上密码的纯文本版本,因为身份验证机制涉及客户端和服务器对输入的密码执行相同的数学运算(通常不会每次都产生相同的输出,因为密码与随机生成的“随机数”相结合,在两台机器之间共享)。

通常,这可以得到加强,因为在某些情况下可以部分计算摘要,但并非总是如此。更好的方法是使用可逆加密存储密码 - 这意味着应用程序源需要受到保护,因为它们将包含加密密钥。

Digst 身份验证允许通过其他非加密通道进行身份验证。如果使用 SSL 或其他全通道加密,则无需使用摘要式身份验证机制,这意味着可以对密码进行哈希存储(因为密码可以通过网络安全地发送明文(对于给定的 safe 值)。

1赞 User 7/31/2014 #18

如果您接受任意大小的密码,则假设在对其进行哈希处理之前,由于性能原因,该密码被截断为窗帘长度。截断的问题在于,随着服务器性能的提高,您不能轻易增加截断前的长度,因为它的哈希值显然会有所不同。当然,您可以有一个过渡期,在过渡期中对两个长度进行哈希处理和检查,但这会占用更多资源。

1赞 Marek Puchalski 3/23/2015 #19

除非必要,否则尽量不要施加任何限制。请注意:在许多不同的情况下,它可能而且将是必要的。处理遗留系统是这些原因之一。确保你很好地测试了非常长的密码的情况(你的系统可以处理10MB长的密码吗?您可能会遇到拒绝服务 (DoS) 问题,因为您将使用的关键定义函数 (KDF)(通常是 PBKDF2、bcrypt、scrypt)将花费大量时间和资源。现实生活中的例子:http://arstechnica.com/security/2013/09/long-passwords-are-good-but-too-much-length-can-be-bad-for-security/

3赞 CommonSenseCode 6/17/2018 #20

忽略那些说不要验证长密码的人。Owasp 从字面上说 128 个字符就足够了。只是为了给足够的呼吸空间,如果你愿意,你可以再给一点,比如 300、250、500。

https://www.owasp.org/index.php/Authentication_Cheat_Sheet#Password_Length

密码长度:密码越长,密码越长,密码长度越长,密码长度越长,密码 字符,从而使攻击者更难 猜。

...

最大密码长度不应设置得太低,因为它会阻止 用户创建密码短语。典型最大长度为 128 字符。短于 20 个字符的密码短语通常 如果它们仅由小写拉丁字符组成,则被视为弱字符。

评论

0赞 vikki 1/28/2020
与讨论无关。问题是限制长度是否有任何好处,而不是 128 是否足够。
0赞 trndjc 3/13/2022 #21

Microsoft 根据开发人员的内部数据(您知道,来自运行计算史上最大的软件企业)为开发人员发布安全建议,您可以在线找到这些 PDF。Microsoft 表示,密码破解不仅几乎是他们最不关心的安全问题,而且:

“犯罪分子试图以各种方式伤害我们的客户,并且 我们发现绝大多数攻击都是通过网络钓鱼、恶意软件进行的 受感染的计算机,以及在第三方上重复使用密码 站点 - 这些站点都没有得到很长的密码的帮助Microsoft。

Microsoft 自己的做法是密码不能超过 16 个字符,也不能短于 8 个字符。

https://arstechnica.com/information-technology/2013/04/why-your-password-cant-have-symbols-or-be-longer-than-16-characters/#:~:text=Microsoft%20imposes%20a%20length%20limit,no%20shorter%20than%20eight%20characters

0赞 dewd 6/4/2022 #22

我发现对密码的前 72 个字节使用相同的字符可以成功验证使用 和 在 PHP 中,无论前 72 个字节之后出现什么随机字符串。password_hash()password_verify()

来自 PHP 文档: https://www.php.net/manual/en/function.password-hash.php

警告:使用 PASSWORD_BCRYPT 作为算法将导致 password 参数被截断为最大长度 72 字节。

1赞 Loren 8/12/2022 #23

OWASP的最新更新现在建议最大长度:https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html

最大密码长度不应设置得太低,因为它会阻止用户创建密码短语。由于某些哈希算法的限制,常见的最大长度为 64 个字符,如密码存储备忘单中所述。设置最大密码长度以防止长密码拒绝服务攻击非常重要。

1赞 M Komaei 9/8/2022 #24

.net core 6 中,我使用 HashPasswordV3 方法,它使用具有 1000 次迭代HMACSHA512。我测试了一些密码长度,它生成了一个 86 个字符的哈希值。

因此,我在 sql server 中为 varchar(100) 设置了 PasswordHash 字段。

https://stackoverflow.com/a/72429730/9875486