这个问题一直困扰着我.
在Linux上,当被要求输入密码时,如果您的输入是正确的,它会立即检查,几乎没有延迟.但是,另一方面,如果输入错误的密码,则需要更长的时间来检查.这是为什么?
我在我尝试过的所有Linux发行版中都观察到了这一点.
实际上,这是为了防止暴力攻击每秒尝试数百万个密码.我们的想法是限制密码的检查速度,并且应该遵循许多规则.
成功的用户/密码对应立即成功.
可以检测到的失败原因应该没有明显区别.
最后一个特别重要.这意味着没有有用的消息,如:
Your user name is correct but your password is wrong, please try again
要么:
Sorry, password wasn't long enough
在"无效用户和密码"和"有效用户但无效密码"失败原因之间甚至没有时间差异.
每次失败都应该提供完全相同的信息,文本和其他信息.
有些系统甚至更进一步,在每次故障时增加延迟,或者只允许三次故障,然后在允许重试之前有大量延迟.
这使得猜测密码需要更长的时间.
我不确定,但是在输入错误的密码之后整合延迟以使攻击更加困难是很常见的.这使得攻击实际上是不可行的,因为它只需要很长时间来检查几个密码.
即使尝试一些密码 - 生日,猫的名字,以及类似的东西 - 也变得毫无乐趣.
基本上是为了减轻暴力和字典攻击.
来自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 _...()调用返回错误.期望在应用程序继续之前还存在暂停.这种延迟的主要原因是安全:延迟主要是为了阻止暴力字典攻击,但也有助于阻止定时(隐蔽频道)攻击.
这是一种非常简单,几乎毫不费力的方式来大大提高安全性.考虑:
系统A
没有延迟.攻击者有一个程序可以创建用户名/密码组合.以每分钟数千次尝试的速度,只需几个小时即可尝试每个组合并记录所有成功的登录.
B
每次不正确的猜测后,系统会产生5秒的延迟.攻击者的效率已经降低到每分钟12次,有效地削弱了蛮力攻击.而不是几个小时,可能需要几个月才能找到有效的登录信息.如果黑客是那么耐心,那么他们就会变得合法.:-)