我应该对密码设置最大长度吗?


162

我可以理解,对密码施加最小长度是很有意义的(为了使用户免于自己的攻击),但是我的银行要求密码长度必须介于6到8个字符之间,我开始怀疑...

  • 这难道不只是使暴力攻击更容易吗?(坏)
  • 这是否意味着我的密码未加密存储?(坏)

如果有人(希望)有一些出色的IT安全专业人员正在为他们强加最大密码长度,我是否应该考虑做类似的事情?这有什么优点/缺点?


16
几乎可以肯定,有“三击而出局”的政策,它消除了暴力攻击的威胁。
Stu Thompson

23
对于非遗留系统,例如现代网站,没有任何借口。
mparaz

7
我认为答案并非纯粹是IT。最小大小(6)和最大尝试限制“可能”消除了疯狂的猜测。我的猜测是,最大大小(8)是为了限制对“糟糕的我忘记了我的代码”或“我输入的代码速度太快”或“我输错一个字符”的支持的呼叫次数(以及因此而产生的费用)等,另外在其上写密码,如果你不记得它的纸张..
叫我史蒂夫

17
所注册的大学具有疯狂的密码规则:仅8个字符,至少1个数字,但不在密码的开头或结尾,需要超过键盘上方2行等的字符,等等。最后这些规则-.-使暴力破解变得容易。我意识到您不是那个愚蠢的人,但是请不要制定如此愚蠢的规则!(只需将其从我的系统中
删除即可

17
@call那么,如果你并处最大长度为理由,那么你将得到“我忘记了密码”的呼叫从我的,因为我的网站,唯一的密码都长,并限制我12个字符是一个肯定的方式,以保证我会不记得了。
罗曼·斯塔科夫

Answers:


193

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

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

强制性XKCD


6
也许银行可能会选择限制密码,因为在ATM上,您最多只能输入8个字符。
安德烈Chalella

11
至少在自动取款机上,如果您尝试蛮力攻击,它将吞噬您的卡。我指的是仅用于在线登录的密码。
尼克

39
遗憾的是,假设密码始终是哈希值。最大长度密码是以明文形式存储的密码的症状。
jevon 2011年

14
遗憾的是,即使是在PayPal上,“正确的马电池钉” 也要超出其<已审查的>最大长度8个字符... 前台
Roman Starkov 2011年

3
@kleinfreund,因为如果对其进行哈希处理,则密码长度对他们而言并不重要(哈希函数将任意长度的字符串转换为固定长度)。
Vicky Chijwani,

75

在密码字段上指定的最大长度应作为“ 安全警告”阅读。任何明智,注重安全的用户都必须承担最糟糕的后果,并希望该站点按字面意义存储您的密码(即,如epochwolf所述,不进行哈希处理)。

在这种情况下:

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

如果您正在开发一个接受密码的网站,请不要设置愚蠢的密码限制,除非您想用相同的笔刷遮盖它。

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


17
我还向此类网站发送标准电子邮件,其中提到它们迫使我使用较短,安全性较低的密码,而且我也碰巧在具有此类愚蠢限制的每个网站上重复使用。这使他们知道这是一个问题,并且还可能使Joe Coder可以利用一些手段向高层展示:证据表明,用户因此对网站的看法不佳。
罗曼·斯塔科夫

3
我不确定您是否应该假设密码上限意味着它们存储的是纯文本密码。有时,它们会截断输入,并简单地将前x个字符传递给hashing()。(检查方法是将密码设置为超出限制,然后尝试使用超出最大长度的密码字符进行登录)。
benc 2012年

5
@benc肯定,这是可能的,但是重点是,作为用户,您无法知道这是否是他们的工作。最大长度(尤其是较短的长度)是一个警告信号,我认为最好假设最坏的情况(或与提供者联系以确认它们)。
tardate

1
请详细说明。这个答案仅仅是一个陈述。
kleinfreund

1
最大密码并不一定意味着它以纯文本形式存储;可能是出于技术原因,例如bcrypt仅允许密码(最多72个字符)。
emorris

58

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

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

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


35
您仍然可以发送1gb的数据,并具有最大限制。进行限制的软件几乎总是位于Web服务器之后。
epochwolf

6
您仍然可以丢弃除前256个字符以外的所有字符,然后再进行计算密集型操作。在1gb的数据上运行sha哈希将比在256个字符上的相同哈希花费更长的时间。
rcreswick

2
@Eyal:Web应用程序客户端发生的任何事情本质上都是不受信任的;因此,哈希成为等效的密码,这徒劳无益。(网络浏览器可能不会接受1GB的文本输入,并且自定义客户端可能会在“ thisisthehashedpassword”表单字段中发送1GB的字符串)
Piskvor在2011年

4
@Piskvor:但是无论如何也无法阻止1-GB字符串。用户始终可以请求example.com/?password=abcabcabcabc ...,并使他的请求随心所欲。标准DoS。
Eyal

4
@Piskvor和Eyal,幸运的是,Apache和IIS(可能还有其他成熟的服务器)限制了通过URL传递的字段的长度:boutell.com/newfaq/misc/urllength.html
sampablokuper,2012年

21

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

也就是说,最大密码长度毫无意义。它通常要求用户创建一个新密码(有关暂时在每个站点上使用不同密码的价值的争论),这增加了他们将其写下来的可能性。从蛮力到社会工程学的任何媒介,也极大地增加了受到攻击的可能性。


同意!看看过去几年来英国银行在线访问安全性的失败之列...
Stu Thompson

6
我已经通过一种使每个人都记住它们的方案在每个网站上使用了不同的密码,但是它们都相当长。我在粘滞便笺上写下密码的唯一Websies是那些施加moronic最大长度限制并因此迫使我脱离我偏爱却又独特的密码的网站...
Roman Starkov 2010年

@romkyns我认为您的方案不使用符号?我曾经有过这样的计划,该计划产生了短而难以破解的密码,但是当我使用的网站中有10-20%禁止使用常见的特殊字符时,我不得不放弃它。
Sparr 2010年

没有特殊字符,没有,但是它总是添加数字和大写字符,因为我知道有些网站要求这样做。希望我知道最大长度限制...但是到目前为止,我为近亲弥补的(更简单)方案效果很好!
罗曼·斯塔科夫

1
@romkyns此类方案的其他问题:共享密码的站点。如果您的方案类似于nameofwebsitefO0(googlefO0 yahoofO0等),那么您还记得在flickr.com上使用“ yahoofO0”还是在askubuntu.com上使用stackoverflowfO0的想法?密码过期的网站。那么您需要扩展方案以包括可以更改的部分。但是,如果到期规则检查子字符串,则失败。
Sparr 2010年

13

OWASP身份验证备忘单现在建议不要将最大密码长度设置为少于128个字符

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

引用整个段落:

较长的密码可提供更多的字符组合,从而使攻击者更难以猜测。

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

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

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


11
此来源不鼓励最大密码长度限制,但不鼓励(少于128个字符)的最大密码长度限制。
马修(Matt)

9

我可以想象执行一个最大密码长度的原因是,如果前端必须与许多旧系统后端接口,其中一个本身就强制了一个最大密码长度。

另一个思考过程可能是,如果用户被迫使用短密码,那么他们比轻易猜出(由他们的朋友/家人)流行的短语或昵称更有可能发明乱码。这种方法当然仅在前端强制使用混合数字/字母并拒绝具有任何词典单词(包括用33t讲的单词)的密码时才有效。


1
虽然可以理解,但是传统系统有时必须支配设计。只要有可能,他们都不应影响它。在新系统中,您想要做的最后一件事是在现代安全攻击还没有普遍出现之前就设计了一种安全策略。或更糟糕的是,更新的软件首先设计不正确。现有的公司系统可以使用HTTP,但是没有理由在新系统或扩展中不使用SSL。同样,密码策略不应仅仅因为LAST的人做错了就继续受到攻击,如果保持不变,最好进行巨大的成本/收益研究。
Katastic Voyage

6

施加最大密码长度的一个可能有效的原因是,对密码进行哈希处理的过程(由于使用了慢速哈希函数(例如bcrypt))会占用太多时间。为了对服务器执行DOS攻击而可能被滥用的东西。

然后,服务器应再次配置为自动删除耗时太长的请求处理程序。因此,我怀疑这将是一个很大的问题。


4

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

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


3

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


1
应该有最大输入长度,是的,但绝对不能小于64。最大长度为8或12太可笑了。
Dan Bechard 2014年

2

忽略人们说不要验证长密码的信息。Owasp的字面意思是128个字符就足够了。只是给了足够的呼吸空间,如果您愿意,可以多说300、250、500。

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

密码长度较长的密码提供了更多的字符组合,因此使攻击者更难以猜测。

...

密码的最大长度不应设置得太短,因为它将阻止用户创建密码短语。典型的最大长度是128个字符。如果密码短语仅包含小写拉丁字符,则通常少于20个字符。


与讨论无关。问题是限制长度是否有好处,而不是128是否足够。
vikki

1

存储价格便宜,为什么要限制密码长度。即使您要加密密码而不是仅对其进行散列,加密64个字符串也不会花费超过6个字符串。

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


9
除非有非常合理的理由,否则应该对密码进行哈希处理。散列会产生固定长度的字符串。除非系统存储了实际的密码,否则就没有空格参数,这可能是一个糟糕的主意。
Stu Thompson

8
加密密码是一个糟糕的主意。一个不道德的员工就是您泄露大量密码的全部方法。通过永远不要将它们存储在第一位来节省麻烦。
罗曼·斯塔科夫

1

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

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

智能卡解决方案不能很好地配合我。我已经有太多纸牌了……我不需要另一个花招。


当他们的哈希数据库被盗(假设它们甚至撒盐/哈希/拉伸,我确定它们不会)时,他们会切断重要的密钥空间,从而延长了暴力攻击的时间。是时候换银行了。
克里斯·戈麦斯

1

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


1

除非必要,否则请不要施加任何限制。请注意:在许多不同的情况下,它可能而且将是必要的。处理遗留系统是这些原因之一。确保正确测试过长密码的情况(您的系统可以处理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/


0

应该有最大长度吗?这在IT领域是一个很好奇的话题,因为较长的密码通常更难记,因此更容易被写下来(出于明显的原因,BIG禁止使用)。较长的密码也往往会被遗忘,这虽然不一定带来安全风险,但可能导致管理麻烦,生产力下降等。管理员认为这些问题很紧迫,很可能会给密码设置最大长度。

我个人相信在这个特定的问题上,对每个用户来说都是自己的。如果您认为自己可以记住40个字符的密码,那么,强大的功能就给您了!

话虽这么说,但是密码正迅速成为一种过时的安全性模式,正如您所说的那样,智能卡和证书身份验证非常困难,甚至无法进行暴力破解,并且只有公共密钥需要与私有密钥一起存储在服务器端。始终在您的卡/计算机上输入密钥。


人们可以轻松记住自己喜欢的歌曲的歌词,圣经经文或其他谚语。与典型的密码相比,这些密码长。我只测试了一个,输入了79个字符!(当然,密码短语越长,出错的可能性就越大。当STUPID网站未向您显示您在密码框中输入的最后一个字符时,更糟。)
Katastic Voyage

0

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

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


0

传统系统(已经提到过)或与外部厂商系统的接口可能需要8个字符的上限。将用户从自己手中救出来也可能是一种误导的尝试。以这种方式进行限制会导致系统中出现过多的pssw0rd1,pssw0rd2等密码。


0

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

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

Digst auth可以通过其他未加密的通道进行身份验证。如果使用SSL或其他某种全通道加密,则无需使用摘要身份验证机制,这意味着可以将密码存储为散列(因为可以安全地通过网络以明文形式发送密码(给定的安全值)。


-4

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


3
就是这样-根本不应该有任何限制。
路加·史蒂文森

-4

我认为应该应用的唯一限制是2000个字母限制,或者其他非常高的限制,但是仅在存在问题时才限制数据库大小


9
密码应进行哈希处理...数据库的大小也不会成为问题,因为密码是经过哈希处理的。
epochwolf

4
@epochwolf –我可以想到一个原因,为什么不应该总是对密码进行哈希处理(因为我是今天自己发现的):需要代表用户提交给第三方的密码不能存储为哈希值值。[例如,需要存储用于通过外部域发送电子邮件的凭据的应用程序。]
Kenny Evitt 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.