为什么检查错误的密码要比检查正确的密码花费更长的时间?


83

这个问题一直困扰着我。

在Linux上,当要求输入密码时,如果您输入的密码正确,它将立即检查,几乎没有延迟。但是,另一方面,如果您输入了错误的密码,则检查时间会更长。这是为什么?

我在所有尝试过的Linux发行版中都观察到了这一点。


您也会发现Windows也是如此。另外,将标题更改为“为什么密码错误比正确密码花费更长的时间”。会使它与编程更多相关。
he_the_great

我刚登录我的Ubuntu系统,输入了错误的密码,并问了自己同样的问题。:-)
johngreen 2014年

Answers:


106

实际上,这是为了防止暴力攻击每秒尝试数百万个密码。这个想法是为了限制可以多快地检查密码,并且应该遵循许多规则。

  • 成功的用户/密码对应立即成功。
  • 可以检测到的故障原因应该没有明显的区别。

最后一个特别重要。这意味着没有有用的消息,例如:

Your user name is correct but your password is wrong, please try again

要么:

Sorry, password wasn't long enough

“无效的用户和密码”和“有效的用户但无效的密码”响应失败之间甚至没有时间差异。

每个失败都应传递完全相同的信息,无论是文字信息还是其他信息。

一些系统甚至更进一步,每次失败都会增加延迟,或者只允许三个失败,然后在允许重试之前会有很大的延迟。


1
这如何防止应用程序派生,尝试输入密码,如果在一定时间内未返回成功,则杀死-9个孩子并再次分叉。是的,仅当您可以以某些用户身份登录时才有效,但是何时停止了任何人?
BCS

2
它不会阻止任何人,但是您仍然必须延迟“一定时间”。即使是很小的延迟也会使检查数百万个密码变得毫无用处,并且如果您在登录时执行此操作,就会被检测到-您是否认为登录失败不会记录任何内容?
paxdiablo,

5
BCS:如果您已经具有有效的登录名,并且具有足够的特权来执行建议的操作,则很有可能您不再需要蛮力攻击(因为您可以使用其他攻击媒介)。延迟对于外部攻击者最有用。
Erich Kitzmueller 09年


12

我不确定,但是在输入错误的密码后集成延迟会增加攻击的难度,这种情况很常见。这使得攻击实际上是行不通的,因为仅检查几个密码就需要花费很长时间。

甚至尝试输入几个密码-生日,猫的名字以及类似的东西-都变得毫无乐趣。


而且,第二次失败的超时通常比第一次失败的超时长-这也很好。
乔纳森·莱夫勒

您是否看到有关最可能的密码的新闻帖子?123456非常非常受欢迎!
Spence 2010年

@Spence,我实际上确实看到了这些项目,但是,从记忆中看,它并不像人们想象的那么糟糕,它们(就像媒体不愿意做的那样)使它不成比例。密码是从在线发现的受感染帐户的列表中提取的,这意味着它们极有可能是不安全的(因为它们已被破坏)。123456可以很好弥补损害占30%(例如),但不太可能是附近的任何地方跨越显著的所有账户。
paxdiablo

不,这些列表来自密码数据库黑客,其中大多数代表了数以百万计的样本集。这些黑客攻击的结果已在多个在线数据集中得到证实,并高度代表了“平均”消费者。获得更好密码的唯一方法是在创建时对其进行强制执行,或者更好地使用2因子身份验证,这反过来更有用。
Spence

12

基本上是为了缓解暴力和字典攻击。

《 Linux-PAM应用程序开发人员指南》中

计划延误

extern int pam_fail_delay(pam_handle_t *pamh, unsigned int micro_sec);

Linux-PAM提供了此功能,以简化对pam_authenticate()的失败调用之后,控制权返回给应用程序之前的时间延迟。使用此功能时,应用程序程序员应检查该功能是否可用,

#ifdef PAM_FAIL_DELAY
    ....
#endif /* PAM_FAIL_DELAY */

通常,应用程序通过调用pam_authenticate()或pam_chauthtok()来请求用户通过Linux-PAM进行身份验证。这些功能调用相关Linux-PAM配置文件中列出的每个堆叠的身份验证模块。按照此文件的指示,多个模块之一可能会失败,从而导致pam _...()调用返回错误。希望在应用程序继续之前也要暂停一下。这种延迟的主要原因是安全性:延迟的作用主要是阻止暴力字典的攻击,但同时也有助于阻止定时(隐蔽通道)攻击。


8

这是一种非常简单,几乎毫不费力的方法,可以大大提高安全性。考虑:

  1. 系统A没有延迟。攻击者拥有一个创建用户名/密码组合的程序。以每分钟数千次尝试的速度,只需几个小时即可尝试每种组合并记录所有成功的登录。

  2. B每次错误猜测后,系统都会产生5秒的延迟。攻击者的效率已降至每分钟12次尝试,有效地削弱了蛮力攻击。查找有效的登录信息可能要花几个月的时间,而不是几个小时。如果黑客那么耐心,他们就会合法化。:-)


4

失败的身份验证延迟会降低登录尝试的速度。如果有人尝试对某人进行字典攻击或蛮力攻击,或者可能是用户帐户,则该想法将要求攻击者等待失败延迟,从而迫使他花费更多时间并给您更多机会进行检测。

您可能还想知道,根据您用作登录shell的方式,通常可以使用一种配置此延迟的方法。

在GDM中,延迟是在gdm.conf文件中设置的(通常在/etc/gdm/gdm.conf中)。您需要设置RetryDelay = x,其中x是以秒为单位的值。

如今,大多数Linux发行版还支持在/etc/login.defs中定义FAIL_DELAY,允许您设置登录尝试失败后的等待时间。

最后,PAM还允许您在auth行上设置一个nodelay属性,以绕过故障延迟。(这是有关PAM和Linux的文章


1

我不认为这可以像回应所建议的那样简单。

如果对正确密码的响应是(某些值)立即生效,那么您是否不必等到比该值更长的时间才能知道密码是错误的?(至少概率地知道,这对于破解目的是很好的)而且无论如何,您都将并行进行此攻击...这是否就是一大片DoS欢迎垫?


那不是他们的意思。错误密码或正确密码之间有明显的区别。他们的意思是,错误的用户名和密码之间应该没有区别。你是说并行进行这种攻击吗?如何并行运行?
mpen

@Mark,并行运行可能需要打开多个连接并尝试登录。仍然很耗时并且不太实用。
he_the_great

如果您可以在非慢速连接上每秒运行一百万次检查,并且该连接为失败的尝试增加了1秒的延迟,则您需要一百万个攻击客户端才能获得相同的效果。我怀疑服务器是否将允许创建许多telnet会话。
paxdiablo

关键是您不必在尝试下一个密码之前就等待延迟,这有什么用?

@Greg,您确实必须重新连接到主机,并且,如有必要,下一步将是检查IP地址以同样地捕获该主机。
paxdiablo,

1

我以前尝试过的方法似乎奏效,但实际上没有奏效。如果您在乎,则必须查看Wiki编辑历史记录...

什么的工作(对我来说)就是要降低pam_faildelay.so延迟= X中的值/etc/pam.d/login文件(我把它降低到500000半秒),并且还添加NODELAY(前面有一个空间),以在该行的末端共同-AUTH,在他的回答由加布里埃尔说明。

auth [success=1 default=ignore] pam_unix.so nullok_secure nodelay

至少对我来说(debian sid),尽管仅通过更改/etc/pam.d/login中的值就可以延长延迟时间,但是仅对其中之一进行更改不会将延迟时间明显缩短到默认的3秒以下。

这种胡言乱语足以使一个成年男子哭泣!


0

在Ubuntu 9.10上,我认为也是新版本,您要查找的文件位于

/etc/pam.d/login

编辑该行:

auth可选pam_faildelay.so delay = 3000000

将数字3更改为您可能想要的另一个数字。

请注意,要获得“ nodelay”身份验证,我认为您应该编辑文件

/etc/pam.d/common-auth

太。在线上:

验证[成功= 1默认=忽略] pam_unix.so nullok_secure

在末尾添加“ nodelay”(不带引号)。但是我认为这是关于“ nodelay”的最终解释。


0

我想从开发人员的角度添加注释。尽管这肉眼看起来并不明显,但是当找到匹配项时,聪明的开发人员就会退出匹配查询。作为见证,成功的比赛比失败的比赛更快地完成。因为,匹配功能会将凭证与所有已知帐户进行比较,直到找到正确的匹配为止。换句话说,假设按ID顺序有1,000,000个用户帐户;001、002、003等。您的ID是43,001。因此,当您输入正确的用户名和密码时,扫描将在43,001处停止并登录。如果您的凭据不正确,则它将扫描所有1,000,000条记录。双核心服务器上处理时间的差异可能以毫秒为单位。在具有5个用户帐户的Windows Vista上,时间为纳秒。


我认为您会发现这里有99%的海报是某个级别或另一级别的开发人员。别再这么夸张了。

我使用Ubuntu,只有一个用户。但是,当我输入错误的密码时,我需要3秒钟才能得到答复。所以,你错了:)
哈利尔·比尔金

0

我同意。这是一个任意的编程决定。将延迟设置为一秒而不是三秒并不会真正损害密码的易破解性,但会使密码更加人性化。


0

从技术上讲,这种故意的延迟是为了防止诸如“线性化攻击”之 类的攻击(还有其他攻击和原因)

为了说明这种攻击,请考虑一个程序(没有故意的延迟),该程序将检查输入的序列以查看其是否与正确的序列匹配,在这种情况下,该序列恰好是“ xyba。为了提高效率,程序员决定一次检查一个字符,一旦发现不正确的字符,则立即退出,然后再开始检查长度。

正确的序列长度比不正确的序列长度需要更长的处理时间。甚至更好(对于攻击者而言),具有正确的第一个字符的序列号将比具有不正确的第一个字符的序列号花费更长的时间。等待时间中的后续步骤是因为每次都有一个以上的循环,比较将在正确的输入上进行。

  • 因此,攻击者可以选择一个四个字符的字符串,并且以x开头的字符串花费的时间最多。(通过猜测工作)
  • 然后,攻击者可以将字符固定为x并改变第二个字符,在这种情况下,他们会发现y花费的时间最长。
  • 然后,攻击者可以将前两个字符固定为xy并更改第三个字符,在这种情况下,他们会发现b花费的时间最长。
  • 然后,攻击者可以将前三个字符固定为xyb并更改第四个字符,在这种情况下,他们会发现a花费的时间最长。

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

Linearization.java。

Linearization.docx,样本输出

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

大部分的书面门派改编自(马克邮票的“信息安全:原理与实践”获得)。同样,以上计算未考虑找出正确序列长度所需的猜测工作量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.