我应该对密码设置最大长度吗?
我可以理解,对密码施加最小长度是很有意义的(为了使用户免于自己的攻击),但是我的银行要求密码长度必须在6到8个字符之间,我开始怀疑...
- 这难道不只是使暴力攻击更容易吗? (坏的)
- 这是否意味着我的密码未加密存储? (坏的)
如果有人(希望)有一些出色的IT安全专业人员正在为他们提供最大密码长度,我是否应该考虑做类似的事情?这有什么优点/缺点?
解决方案
存储价格便宜,为什么要限制密码长度。即使我们要加密密码而不是仅对其进行散列,加密64个字符串也不会花费超过6个字符串。
银行系统可能会覆盖较旧的系统,因此它们只能为密码留出一定的空间。
密码被散列为32、40、128,无论长度如何。最小长度的唯一原因是为了防止容易猜出的密码。没有最大长度的目的。
强制性XKCD解释了如果强加了最大长度,为什么会对用户造成伤害:
我认为我们在两个要点上都非常正确。如果他们按照应有的方式存储散列的密码,则密码长度不会影响其数据库架构。开放式密码长度会引发暴力攻击者必须考虑的另一个变量。
除了不良的设计之外,很难看到任何限制密码长度的借口。
首先,不要以为银行有优秀的IT安全专业人员为他们工作。不用。
也就是说,最大密码长度毫无意义。它通常需要用户创建一个新密码(有关暂时在每个站点上使用不同密码的价值的争论),这增加了他们将其写下来的可能性。从蛮力到社会工程学的任何媒介,也极大地增加了受到攻击的可能性。
应该有最大长度吗?这在IT领域是一个很好奇的话题,因为较长的密码通常更难记,因此更容易被写下来(出于明显的原因,BIG禁止使用)。较长的密码也往往会被遗忘,这虽然不一定带来安全风险,但可能导致管理麻烦,生产力下降等。管理员认为这些问题很紧迫,很可能会规定密码的最大长度。
我个人相信在这个特定的问题上,对每个用户来说都是自己的。如果我们认为自己可以记住40个字符的密码,那么,强大的功能就给我们了!
话虽这么说,但是密码正迅速成为一种过时的安全性模式,正如我们所说的那样,智能卡和证书身份验证非常困难,甚至无法蛮力行事,只有公钥需要与私钥一起存储在服务器端。始终在卡/计算机上输入密钥。
更长的密码或者口令短语仅根据长度就很难破解,并且比要求复杂的密码更容易记住。
可能最好选择相当长的最小长度(10+),以限制该长度无用。
我可以看到最大密码长度的唯一好处是可以消除由于密码过长而引起的缓冲区溢出攻击的风险,但是有更好的方法来处理这种情况。
如果我们接受来自不受信任来源的密码,则允许完全不受限制的密码长度有一个主要缺点。
发件人可能会尝试给我们提供如此长的密码,从而导致拒绝他人提供服务。例如,如果密码是1GB的数据,而我们花了所有时间接受密码,直到用完内存。现在,假设此人向我们发送此密码的次数与我们愿意接受的次数相同。如果我们不小心涉及其他参数,则可能导致DoS攻击。
按照今天的标准,将上限设置为256个字符似乎过于慷慨。
仅8个字符长的密码听起来简直是错误的。如果应该有一个限制,那么至少20个字符是更好的主意。
我可以想象要强制使用最大密码长度的原因之一是,前端是否必须与许多旧式系统后端接口,其中一个本身会强制使用最大密码长度。
另一个思考过程可能是,如果用户被迫使用短密码,那么他们比轻易猜出(由他们的朋友/家人)流行的短语或者昵称更有可能发明乱码。当然,这种方法仅在前端强制使用混合数字/字母并拒绝包含任何词典单词(包括用33t讲的单词)的密码时才有效。
传统系统(已经提到过)或者与外部供应商系统的接口可能需要8个字符的上限。将用户从自己手中救出来也可能是一种误导的尝试。以这种方式进行限制会导致系统中出现过多的pssw0rd1,pssw0rd2等密码。
我的银行也这样做。它曾经允许使用任何密码,而我有一个20个字符的密码。一天,我更改了它,瞧瞧,它最多给了我8个字符,并且剪掉了旧密码中的非字母数字字符。对我来说没有任何意义。
在我使用非字母数字的20个字符的密码之前,银行的所有后端系统都可以正常工作,因此传统的支持不可能是原因。即使是这样,它们仍然应该允许我们拥有任意密码,然后进行适合旧系统要求的哈希。更好的是,他们应该修复遗留系统。
智能卡解决方案不能很好地适应我。我已经有太多卡片了……我不需要另一个花招。
密码字段上指定的最大长度应作为安全警告阅读:
任何明智,注重安全的用户都必须承担最坏的后果,并希望该站点按字面意义存储密码(即,如epochwolf所述,不进行哈希处理)。
在这种情况下:
(a)尽可能避免像瘟疫一样使用此网站[他们显然知道有关安全性的一些误解]
(b)如果我们必须使用该网站,请确保密码是唯一的,与我们在其他地方使用的密码不同。
如果我们要开发一个接受密码的网站,请不要设置愚蠢的密码限制,除非我们想用同一笔刷子涂上焦油。
[当然,在内部,代码可以仅将前256/1028 / 2k / 4k(无论如何)字节视为"重要"字节,以免处理庞大的密码。)
我认为应该应用的唯一限制是2000个字母限制,或者其他很高的限制,但是仅在存在问题时才限制数据库大小