不设置最大密码长度是否存在安全风险?

信息安全 密码 缓冲区溢出
2021-09-05 03:55:41

我是播客“Security Now”的听众,他们经常声称没有理由限制用户在网站上创建帐户时可以在密码中使用的字符数。我从来不明白如何在技术上甚至可以允许无限数量的字符,以及如何不能利用它来创建一种缓冲区溢出。

我在这里找到了一个相关的问题,但我的问题略有不同。另一个问题的作者在他们的描述中明确提到,他们理解为什么将最大长度设置为 100000000 个字符会是一个问题。我实际上想知道为什么会出现问题,是不是就像我刚才说的那样是因为缓冲区溢出?但是要容易受到缓冲区溢出的影响,您不应该首先拥有一种不能超过的边界,因此如果您不限制字符数,您甚至会有这种风险吗?如果您正在考虑耗尽计算机的 RAM 或资源,那么即使是非常大的密码也会成为问题吗?

因此,我想可以不限制密码中的字符数:您所要做的就是不使用 maxlength 属性或在服务器端没有密码验证功能。那会是安全的方法吗?如果是这样,允许无限数量的字符作为密码是否有任何危险?另一方面,NIST建议开发人员至少允许最多 64 个字符的密码。如果他们花时间推荐一个限制,这是否意味着必须有一个?

有人建议这个问题可能与我的问题重复。它不是。另一个问题从密码总是有阈值的前提开始,我只是想知道是否有理由对密码设置阈值。

2个回答

建议设置一个限制,以避免耗尽服务器上的资源。

没有限制,攻击者可以使用非常大的密码调用登录端点,比如说一个千兆字节(让我们忽略一次发送这么多是否可行。您可以一次发送 10MB,但速度更快)。

服务器需要对密码进行的任何工作现在都将变得更加昂贵。这不仅适用于密码散列,还适用于重新组装数据包并将它们发送到应用程序的每一级处理。服务器上的内存使用量也大大增加。

仅仅几个并发的 10MB 登录请求就会开始对服务器性能产生影响,甚至可能会耗尽资源并触发拒绝服务。

这些可能不是密码/数据泄露意义上的安全问题,但通过 DOS 破坏服务或崩溃肯定是。请注意,我没有提到缓冲区溢出:体面的代码可以处理任意大的密码而不会溢出。

总结一下,我认为当有人说“没有理由限制密码的字符数”时,他们是在谈论常见的小限制(例如:10 或 20 个字符)。除了懒惰或使用旧系统之外,确实没有其他理由。256 个字符的限制大于大多数人的期望(测试这些限制的人除外)是合理的,并且可以防止与任意大的有效负载相关的一些问题。

密码应该被散列/加盐。除了 GB 大小的密码可能带来的 DoS 攻击风险外,OWASP建议限制密码长度,因为:

一些散列算法(例如 Bcrypt)具有输入的最大长度,大多数实现为 72 个字符(有一些报告称其他实现的最大长度较低,但在撰写本文时尚未确定)。在使用 Bcrypt 的情况下,应在输入上强制执行最大长度为 64 个字符,因为这提供了足够高的限制,同时仍然允许字符串终止问题并且不会透露应用程序使用 Bcrypt。

由于这一点以及 DoS 的潜力,他们建议 Bcrypt 限制为 64 个字符(由于算法和实现的限制),其他算法限制在 64 到 128 个字符之间。