2016-12-15 97 views
2

我们有一个非常标准的Symfony2应用程序。有一个提供者,一个密码编码器等等。密码被散列,散列成本相当大。如何保护Symfony登录免受计时攻击?

换句话说 - 当有人试图登录时(不一定用正确的密码) - 当有真正的用户检查散列以及不存在时,这是显而易见的。在第二种情况下,它更快 - 没有用户 - 不需要散列等。

因此,如果在我们的应用中注册了特定电子邮件,那么很容易知道

Symfony中是否有内置的机制来防止这种泄漏?或者任何确定的最佳做法?

UPD响应第一答案: 如何处理一般这是或多或少清楚,问题是我们如何能做到这一点,而不Symfony的安全框架内的痛苦。

回答

0

使用PHP内置函数password_verify。从文档:

验证给定的哈希匹配给定的密码。

请注意,password_hash()返回算法,成本和salt作为返回散列的一部分。因此,所有需要验证散列的信息都包含在其中。这允许验证功能验证散列,而不需要为盐或算法信息单独存储。

此功能对于定时攻击是安全的。

如果使用symfony的密码编码器,它具有方法isPasswordValid,它在内部使用这个功能,所以您不必担心计时攻击:source code

+0

是的,我们使用这个功能。但是,如果有人输入_not_existing_电子邮件 - 框架(我想)不会尝试比较密码,使页面加载明显的问题。所以很容易说出邮件是否存在于我们的数据库中。那就是问题所在。 – user1312695

0

你需要考虑的是,如果用户不存在,但你仍然想计算一个哈希以愚弄试图枚举用户帐户的攻击者,将没有密码被哈希,所以你有两个选择(可以有更多,但现在我只想到关于这两个):

1._有一个硬编码的密码,当用户不存在时会被哈希。

2._使用伪随机数生成器(PRNG)生成一个随机密码,这将是一个你会散列的密码(我们并不真正在乎这些不可预测性,所以没有必要使用密码安全一)。

第一次尝试的问题是,由于您总是哈希了相同的密码,所以当用户不存在时的响应时间将非常一致,因此即使攻击者没有看到明显更快当用户不存在时的响应,他可以注意到这些场景的平均响应时间。第二次尝试有一个类似的问题,但在这里,你散列一个随机密码并生成随机密码,所以你增加开销并且响应很可能总是花费更长的时间,现有的用户,所以攻击者也可以注意到这种模式。

您可以做的是为每个请求(现有和不存在的用户)添加一个随机噪声,您将在其中添加几毫秒的随机延迟。通过这样做,您可以为不存在的用户使用固定密码,即使您将为不存在的用户计算相同的散列值,随机噪声也会使攻击者难以知道它是真实还是虚假的登录尝试。

+0

其实,我认为第一个选项没有你提到的问题,因为我们可以使用一些固定时间哈希函数,如另一个答案中建议的哈希函数。这是前进的方向,或者,正如我们在另一个项目中所做的那样,我们只是分配固定时间用于授权过程,如果花费少于这个时间,则只是睡眠。这很好,但我的问题是如果我们在Symfony的安全框架中有任何优雅的/推荐的/内置的方式来做这件事。 – user1312695

相关问题