为什么输入错误密码比输入正确密码要花更长的时间来处理?

为什么输入错误密码比输入正确密码要花更长的时间来处理?

我注意到这种情况最突出的地方是在工作中使用 SSH 时,但我觉得我也在其​​他地方观察到了这种行为。

当我尝试从办公室的 Windows 桌面登录 Linux 服务器时,我注意到如果我输错了密码,大约需要 5 秒钟才能看到“拒绝访问”的提示。而当我正确输入密码时,登录(以及欢迎消息等)几乎是即时的。

这其中是否存在什么逻辑原因,或者是否是由于工作中使用的机器的特定奇怪配置?

答案1

可能存在内置的人工超时,使得暴力攻击更难成功。

您会在许多涉及安全身份验证的登录提示中看到这一点......

答案2

这是为了防止暴力攻击而故意设置的延迟。较长的延迟还可以防止攻击者猜测用户名错误和密码错误之间的区别(散列和检查密码所花的时间明显比检查用户名要长)。

答案3

从技术上来说,这故意拖延是为了防止类似“线性化攻击” (还有其他攻击和原因)

为了说明这次攻击,考虑一个程序(没有这个故意的延迟),它检查输入的序列是否与正确的序列匹配,在本例中恰好是“西巴为了提高效率,程序员决定一次检查一个字符,一旦发现错误字符就退出,然后再开始检查长度。

正确的序列长度比不正确的序列长度需要更长的时间处理。更妙的是(对于攻击者而言),第一个字符正确的序列号比第一个字符不正确的序列号需要更长的时间。等待时间的连续步骤是因为每次都多了一个循环,需要对正确输入进行比较。

  • 因此,攻击者可以选择一个四字符的字符串并且以X耗费最多时间。(猜测)
  • 攻击者可以将角色修复为X并改变第二个字符,在这种情况下他们会发现耗时最长。
  • 然后攻击者可以将前两个字符修复为坐标并改变第三个字符,在这种情况下他们会发现b耗时最长。
  • 然后攻击者可以将前三个字符修复为星火并改变第四个字符,在这种情况下他们会发现A耗时最长。

因此,攻击者可以一次恢复一个字符的序列。

线性化.java。

Linearization.docx,示例输出

序列号长度为四个字符,每个字符有 128 个可能的值。那么就有 128 4 = 2 28 = 268,435,456 个可能的序列。如果攻击者必须随机猜测完整的序列号,她会猜测大约 227 = 134,217,728尝试,这是一项巨大的工作量。另一方面,通过使用上述线性化攻击,每个字母平均只需要猜测 128/2 = 64 次,总共预计工作量约为 4 * 64 = 2 8 = 256 次猜测, 这是一项微不足道的工作。

大部分武术剧本改编自(摘自 Mark Stamp 的《信息安全:原则与实践》)。此外,上述计算并未考虑确定正确序列长度所需的猜测量。

相关内容