SSH 和 *NIX 登录通常会特别浮现在我的脑海中,尽管我已经在许多不同的应用程序中看到了这一点,包括 Windows 登录。由于某种原因,它在网络应用程序中似乎不太常见。该过程不只是“对输入密码进行散列并将其与现有散列进行比较”吗?无论密码是否正确,这不是一样的成本吗?在 *NIX 中,您可以毫无问题地终止登录尝试,因此它对重复尝试的攻击者没有太大的威慑力。
通常,如果登录失败,会有一个人为的随机等待时间。这是为了防止定时攻击。如果密码未经散列存储(或使用弱散列方法),这可以防止攻击者测量系统比较两个密码字符串所用的时间。让我们假设正确的密码是“abc”。现在攻击者会反复尝试密码“a”到“z”,并看到密码“a”拒绝登录的时间比“b”到“z”更长。那是因为系统必须将两个字节(“a”和空字节)与真实密码进行比较,才能意识到“a”不是正确的密码。然后攻击者会尝试从 'aa' 到 'az',他可以意识到对于 'ab' 系统需要更长的时间才能意识到密码错误。使用这种方法可以大大减少搜索空间,从而减少暴力破解密码所需的时间。如果在比较密码后通过添加伪随机等待时间来弥补这一点,则测量系统比较两个密码所花费的时间变得更加困难。如果登录过程测量比较密码所需的时间,然后从随机等待时间中减去该时间,则更是如此,以防止通过统计异常检测来绘制信息。显然,如果使用不存在彩虹表的强散列方法对密码进行散列,那么这将变得毫无意义,因为人们无法有目的地生成具有特定散列前缀的密码。
此外,这也减少了攻击者可能尝试密码的次数,因为在该连接上尝试下一个密码之前必须中止登录(在 ssh 的情况下)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句