ChatGPT解决这个技术问题 Extra ChatGPT

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

我可以理解对密码施加最小长度很有意义(以保护用户免受他们自己的伤害),但我的银行要求密码长度在 6 到 8 个字符之间,我开始怀疑......

这不是让暴力攻击更容易吗? (坏的)

这是否意味着我的密码未加密存储? (坏的)

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

几乎可以肯定存在“三击即出”的政策,它消除了暴力攻击的威胁。
对于非传统系统,例如现代网站,没有任何借口。
我不认为答案是纯粹的 IT。最小大小 (6) 和最大尝试限制是“可能”消除疯狂的猜测。我的猜测是,最大大小 (8) 是为了限制对“糟糕,我忘记了我的代码”或“我快速输入代码”或“我错误输入了一个字符”的支持的调用次数(以及因此的成本)等等。如果你不记得密码,除了你写密码的纸。
我就读的大学有非常愚蠢的密码规则:只有 8 个字符,至少 1 个数字,但不能在密码的开头或结尾,需要来自键盘上方 2 行以上的字符等等等等。最后他们通过这些规则使暴力破解更容易 -.- 。我知道你没那么傻,但请不要制定这样愚蠢的规则! (只需要把它从我的系统中取出 :) )
@call好吧,如果您因此而施加最大长度,那么您将收到我的“我忘记了密码”的电话,因为我的站点唯一密码都很长,并且将我限制为12个字符是保证我会的可靠方法不记得了。

C
Community

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

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

https://imgs.xkcd.com/comics/password_strength.png


也许银行可能会选择限制密码,因为在 ATM 上您不能输入超过 8 个字符。
至少在自动取款机上,如果您尝试蛮力攻击,它会吃掉您的卡。我指的是仅用于在线登录的密码。
可悲的是,假设密码始终是散列的。最大长度密码是以明文形式存储的密码的症状。
叹息,即使在 PayPal,“正确的马电池订书钉”也比他们的 最大长度高出 8 个字符......
@kleinfreund 因为如果它被散列,密码长度对他们来说无关紧要(散列函数将任何长度的字符串转换为固定长度)。
u
unforgettableidSupportsMonica

密码字段上指定的最大长度应被视为安全警告。任何明智的、有安全意识的用户都必须做最坏的打算,并期望该站点按字面意思存储您的密码(即没有散列,正如 epochwolf 所解释的那样)。

在这种情况下:

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

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

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


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

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

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

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


您仍然可以发送 1gb 的数据,但有最大限制。进行限制的软件几乎总是在网络服务器之后。
不过,在进行计算密集型操作之前,您仍然可以删除除前 256 个字符之外的所有字符。在 1gb 数据上运行 sha 哈希将比在 256 个字符上运行相同的哈希花费更长的时间。
@Eyal:Web 应用程序客户端发生的任何事情本质上都是不可信的;因此,哈希变成了密码等价物,这使这种练习徒劳无功。 (Web 浏览器可能不接受 1-GB 文本输入,而自定义客户端可能会在“thisisthehashedpassword”表单字段中发送 1-GB 字符串)
@Piskvor:但是无论如何都无法阻止 1-GB 字符串。用户总是可以请求 example.com/?password=abcabcabcabc ... 并根据自己的意愿提出请求。标准 DoS。
@Piskvor 和 Eyal,幸运的是,Apache 和 IIS(可能还有其他成熟的服务器)限制了通过 URL 传递的字段长度:boutell.com/newfaq/misc/urllength.html
S
Sparr

首先,不要假设银行有优秀的 IT 安全专业人员为他们工作。 Plenty don't

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


同意!看看过去几年英国银行在线访问安全失败的字符串......
我已经通过一个让我记住所有密码的方案在每个网站上使用了不同的密码,但它们都相当长。我在便签上写密码的唯一网络用户是那些施加愚蠢的最大长度限制并因此迫使我远离我喜欢但唯一的密码的网络用户......
@romkyns 我认为您的方案不使用符号?我曾经有过这样一个方案,它可以生成简短的难以暴力破解的密码,但是当我使用的 10-20% 的网站禁止使用常见的特殊字符时,我不得不放弃它。
没有特殊字符,没有,但它总是添加数字和大写字符,因为我知道有些网站需要这样。希望我在想出它时就知道最大长度限制……但是我为近亲制定的(更简单的)计划到目前为止效果很好!
@romkyns 此类方案的其他问题:共享密码的网站。如果您的方案类似于 nameofwebsitefO0(googlefO0 yahooofO0 等),那么您如何记得您应该在 flickr.com 上使用“yahooofO0”或在 askubuntu.com 上使用 stackoverflowfO0?密码过期的网站。那么您需要扩展该方案以包含可以更改的部分。但如果过期规则检查子字符串,则会失败。
A
ABM

OWASP Authentication Cheat Sheet 现在不鼓励将最大密码长度设置为小于 128 个字符

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

引用整段:

较长的密码提供了更多的字符组合,因此使攻击者更难猜测。应用程序应强制执行密码的最小长度。少于 10 个字符的密码被认为是弱密码 ([1])。虽然强制最小长度可能会导致某些用户在记忆密码方面出现问题,但应用程序应鼓励他们设置比典型密码长得多但更容易记住的密码短语(句子或单词组合)。最大密码长度不应设置得太低,因为它会阻止用户创建密码短语。典型的最大长度为 128 个字符。如果密码短语仅包含小写拉丁字符,则通常认为少于 20 个字符的密码短语很弱。每个角色都很重要!!确保用户输入的每个字符都包含在密码中。我们已经看到系统将密码截断长度比用户提供的长度短(例如,当他们输入 20 时截断为 15 个字符)。这通常通过将所有密码输入字段的长度设置为与最大长度密码完全相同的长度来处理。如果您的最大密码长度很短,例如 20-30 个字符,这一点尤其重要。


此来源不鼓励最大密码长度限制,它不鼓励低(少于 128 个字符)最大密码长度限制。
感谢您的参考!尽管如今(2020 年),由于对散列算法的一些限制,他们的建议发生了变化。 Ex 64 个字符,用于使用 Bcrypt 的系统。
引用的备忘单现在明确指出,您应该设置密码长度限制:“设置最大密码长度以防止长密码拒绝服务攻击非常重要。”。
m
mbac32768

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

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


虽然可以理解,但遗留系统有时必须决定设计。只要有可能,他们不应该影响它。在新系统中您最不想要的就是在现代安全攻击甚至普遍之前设计的安全策略。或者更糟糕的是,更新的软件,但一开始就设计不正确。现有的公司系统可能会使用 HTTP,但这不是在新系统或扩展中不使用 SSL 的理由。同样,密码策略不应该仅仅因为最后几个人做错了就继续容易受到攻击。如果保留,最好有一个巨大的成本/收益研究。
A
AardvarkSoup

强加某个最大密码长度的一个潜在有效原因是对其进行哈希处理(由于使用了诸如 bcrypt 之类的慢哈希函数)占用了太多时间;可能被滥用以对服务器执行 DOS 攻击的东西。

再说一次,服务器应该被配置为自动丢弃需要太长时间的请求处理程序。所以我怀疑这会是一个很大的问题。


我刚刚调试了一个密码问题,发现bcrypt只使用了前72个字节。如果密码更长,则没有错误。因此,如果前 72 个相同但后面的任何内容不同,则密码将生效。
L
Lucas Oman

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

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


D
DrStalker

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


应该有一个最大输入长度,是的,但绝对不能小于 64。最大长度为 8 或 12 太荒谬了。
C
CommonSenseCode

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

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

密码长度 较长的密码提供了更多的字符组合,因此使攻击者更难猜测。 ... 最大密码长度不应设置得太低,因为它会阻止用户创建密码。典型的最大长度为 128 个字符。如果密码短语仅包含小写拉丁字符,则通常认为少于 20 个字符的密码短语很弱。


与讨论无关。问题是限制长度是否有任何好处,而不是 128 是否足够。
V
Vincent McNabb

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

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

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


当(我的意思是当)他们的哈希数据库被盗时(假设他们甚至是盐/哈希/拉伸,我敢肯定他们没有),他们切断了重要的密钥空间,这些密钥空间会延长暴力攻击的时间。是时候换银行了。
U
User

如果您接受任意大小的密码,那么人们会假设出于性能原因它在被散列之前被截断为窗帘长度。截断的问题在于,随着您的服务器性能随着时间的推移而增加,您不能轻易地增加截断之前的长度,因为它的散列显然会有所不同。当然,您可以有一个过渡期,其中两个长度都被散列和检查,但这会使用更多资源。


M
Marek Puchalski

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


L
LizB

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

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


除非有非常正当的理由,否则密码应该散列。散列产生固定长度的字符串。除非系统存储实际密码,否则没有空间参数,这可以说是一个糟糕的主意。
加密密码是一个糟糕的主意。一个不道德的员工就是你泄露大量密码所需要的一切。通过从不存储它们来节省麻烦。
t
tekiegreg

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

我个人相信在这个具体问题上,对每个用户自己来说。如果您认为您可以记住 40 个字符的密码,那么您的力量就更大了!

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


人们可以很容易地记住最喜欢的歌词、圣经经文或其他谚语。与典型的密码相比,这些密码非常长。我刚刚测试了一个并输入了 79 个字符! (当然,密码越长,出错的可能性就越大。更糟糕的是,当 STUPID 网站没有显示您在密码框中输入的最后一个字符时。)
b
benPearce

较长的密码或密码短语更难仅根据长度来破解,并且比需要复杂的密码更容易记住。可能最好选择相当长(10+)的最小长度,限制长度无用。


佚名

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


C
Chris J

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

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

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


f
fake girlfriends

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

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

微软自己的做法是密码不能超过 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


d
dewd

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

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

注意:使用 PASSWORD_BCRYPT 作为算法,将导致密码参数被截断为最大 72 字节长度。


u
user17000

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


但这就是问题 - 根本不应该有限制。
J
Josh Hunt

我认为应该应用的唯一限制是 2000 个字母的限制,或者其他高得离谱的限制,但如果这是一个问题,只能限制数据库大小


密码应该被散列......并且数据库大小不会成为问题,因为密码是散列的。
@epochwolf - 我能想到为什么密码不应该总是被散列的一个原因(因为我今天自己发现了它):需要代表用户提交给第三方的密码不能存储为散列价值。 [例如,需要存储通过外部域发送电子邮件的凭据的应用程序。]