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

时间:2016-12-15 13:05:49

标签: php symfony security hash

我们有一个非常标准的Symfony2应用程序。有一个提供商,一个密码编码器等等。密码的散列具有相当大的散列成本。

换句话说 - 当有人试图登录时(不一定使用正确的密码) - 很明显,当有真正的用户检查哈希时,以及何时不是。在第二种情况下,它更快 - 没有用户 - 不需要哈希等。

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

Symfony中是否有任何内置机制可以防止这种泄漏?或者任何既定的最佳实践?

UPD回应第一个答案: 一般来说,如何处理这个问题或多或少都是明确的,问题是我们如何在Symfony的安全框架内轻松实现这一目标。

2 个答案:

答案 0 :(得分:0)

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

  

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

     

请注意,password_hash()返回算法,cost和salt作为返回哈希的一部分。因此,验证哈希所需的所有信息都包含在其中。这允许验证函数验证散列,而无需为salt或算法信息单独存储。

     

此功能可以安全抵御时间攻击。

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

答案 1 :(得分:0)

您需要考虑到,如果用户不存在,但您仍然想要计算哈希来欺骗攻击者试图枚举用户帐户,那么就没有密码可以进行哈希处理,所以你有两个选项(可能会有更多,但现在我只想到这两个):

1._拥有一个硬编码的密码,当用户不存在时,该密码将被散列。

2._使用伪随机数生成器(PRNG)来生成一个随机密码,这个密码将是你要用的密码(我们并不真正关心这里的不可预测性,因此有'不需要使用加密安全的方法。)

第一次尝试的问题在于,由于您总是使用相同的密码进行哈希处理,因此用户不存在时的响应时间将非常一致,因此即使攻击者没有这样做也是如此。当用户不存在时,他会看到明显更快的响应,他可以注意到这些场景的平均响应时间。第二次尝试也有类似的问题,但在这里,您需要对随机密码进行哈希处理并生成该随机密码,因此您需要增加开销并且响应很可能总是花费更长的时间。当只是对现有用户进行身份验证时,攻击者也可以注意到该模式。

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