为什么大多数应用程序需要很长时间才能验证密码是否正确?

Why does it take so long for most applications to verify that a password is incorrect?

一般来说,SSH 和 *NIX 登录会特别浮现在脑海中,尽管我在许多不同的应用程序中都看到过这种情况,包括 Windows 登录。由于某种原因,它在网络应用程序中似乎不太常见。进程不就是"hash the input password and compare it to an existing hash"吗?不管密码正确与否,这不是都一样吗?在 *NIX 中,您可以毫无问题地终止登录尝试,因此它对重复尝试的攻击者并没有太大的威慑力。

通常,如果登录失败,会有一个人为的随机等待时间。这是为了防止定时攻击。如果密码未经散列存储(或使用弱散列方法),这可以防止攻击者测量系统比较两个密码字符串所花费的时间。让我们假设正确的密码是 "abc"。现在,攻击者会反复尝试密码 'a' 到 'z',然后发现密码 'a' 拒绝登录的时间比 'b' 到 [=16= 长].这是因为系统必须将两个字节('a' 和空字节)与真实密码进行比较,才能意识到 'a' 不是正确的密码。然后攻击者会尝试 'aa' 到 'az',他可以意识到对于 'ab',系统需要更长的时间才能意识到密码错误。使用这种方法可以大大减少搜索 space,从而减少暴力破解密码所需的时间。如果您通过在比较密码后添加伪随机等待时间来对此进行补偿,则测量系统比较两个密码所花费的时间将变得更加困难。更重要的是,如果登录过程测量比较密码所花费的时间,然后从随机等待时间中减去该时间,以防止通过统计异常检测绘制信息。显然,如果使用不存在彩虹表的强哈希方法对密码进行哈希处理,那么这将变得毫无意义,因为不能有目的地生成具有特定哈希前缀的密码。 大多数 Web 应用程序不采用此技术的原因要么是 HTTP 和常见的 Web 服务器给处理时间增加了太多噪音,以至于这种定时攻击变得不可行,要么是大多数 Web 开发人员根本不关心 ;)

此外,这也减少了攻击者可能尝试输入密码的次数,因为在该连接上尝试下一个密码之前必须中止登录(在 ssh 的情况下)。

当目标主机无法到达 DNS 服务器时,*nix 系统上的一个大问题是 UseDNSsshd_config 中 - 它会等待名称解析超时,然后再继续。在 sshd_config 中尝试 UseDNS no,看看它是否有所改善:-)