如何保护Symfony登录免受时间攻击?

3
我们有一个标准的Symfony2应用程序。有供应商、密码编码器等等。密码使用非常大的哈希成本进行加密。
换句话说,当有人尝试登录(不一定要用正确的密码)时,如果存在真实用户,则检查哈希值是显而易见的;如果不存在,则会快得多 - 没有用户 - 就无需进行哈希等操作。
因此,很容易知道特定的电子邮件是否在我们的应用程序中注册。
Symfony中有任何内置机制可防止此类信息泄露吗?或者有没有已经建立的最佳实践方法?
更新以回应第一个答案: 如何总体处理这个问题已经比较清楚了,但问题是我们如何在Symfony的安全框架内轻松解决它。
2个回答

1
需要考虑的是,如果用户不存在但您仍想计算哈希以欺骗试图枚举用户帐户的攻击者,则将没有密码要进行哈希,因此有两个选项(可能会有更多,但现在我只考虑了这两个):
1.当用户不存在时,使用硬编码密码进行哈希。
2.使用伪随机数生成器(PRNG)生成随机密码,这将是您要进行哈希的密码(我们确实不关心这里的不可预测性,因此没有必要使用加密安全的密码)。
第一次尝试的问题在于,由于您始终在哈希相同的密码,因此当用户不存在时的响应时间将非常一致,因此即使攻击者在用户不存在时看不到明显的更快响应,他也可以注意到这些情况的平均响应时间。第二次尝试存在类似的问题,但在这里,您正在哈希一个随机密码并生成该随机密码,因此您正在添加开销,并且响应很可能总是需要比仅对现有用户进行身份验证时花费更长的时间,因此攻击者也可以注意到模式。
你可以在每个请求中添加随机噪声(对于现有和不存在的用户),并添加几毫秒的随机延迟。这样做,您可以为不存在的用户使用固定密码,即使您将为不存在的用户计算相同的哈希值,该随机噪声也会使攻击者更难知道它是真实还是虚假的登录尝试。

1
实际上,我认为第一种选项没有你提到的问题,因为我们可以使用一些固定时间哈希函数,比如在另一个答案中建议的那个。这是前进的方式,或者,就像我们在另一个项目中所做的那样,我们只为授权过程分配固定的时间,如果时间少于这个时间,就让它睡眠。这都很好,但我的问题是,如果在Symfony的安全框架中有任何优雅/推荐/内置的方法来完成这件事。 - Sergey Grechin

0
使用 PHP 内置函数 password_verify。从文档中可以看到:

验证给定的哈希值是否与给定的密码匹配。

请注意,password_hash() 函数返回算法、成本和盐作为返回哈希的一部分。因此,所有需要验证哈希的信息都包含在其中。这允许 verify 函数在不需要单独存储盐或算法信息的情况下验证哈希。

此函数对抗时序攻击是安全的。

如果您使用 Symfony 密码编码器,则具有 isPasswordValid 方法,它在内部使用此函数,因此您无需担心时序攻击:源代码

1
是的,我们确实使用这个函数。但是如果有人输入了“不存在”的电子邮件地址 - 框架(我想)不会尝试比较密码,从而使页面加载速度明显加快。因此,很容易判断该邮件地址是否存在于我们的数据库中。这就是问题所在。 - Sergey Grechin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接