2

我需要比较用户输入的密码是否有效。我如何获得 sha512 加密。我也在我的项目中使用 FOSUserBundle。

4

3 回答 3

10

在您的控制器中,您可以这样做(假设您将 sha512 设置为编码算法app/config/security.yml

    $userName = 'username';
    $password = "pass";
    $userManager = $this->get('fos_user.user_manager');
    $user = $userManager->loadUserByUsername($userName);
    $encoder = $this->get('security.encoder_factory')->getEncoder($user);
    $encodedPass = $encoder->encodePassword($password, $user->getSalt());
    echo $user->getPassword() === $encodedPass;
于 2012-03-30T08:59:37.563 回答
4

Symfony 有几种不同的方式来存储密码。散列和检查密码的逻辑存储在几个“编码器”类中:

使用哪一个可以在 security.yml中的 key 下进行配置encoder。如果这样说sha512,您正在使用MessageDigestPasswordEncoder.

对于不同的用户类型,编码器类型可以不同。要为用户获取正确的编码器,您可以询问EncoderFactory。这已经在UserPasswordEncoder中为您完成:您将用户和纯密码传递给UserPasswordEncoder->isPasswordValid,它会使用属于该用户的正确编码器检查密码。这是检查用户密码的最简单的界面。

如果你真的想知道 SHA512 散列是如何工作的,你可以查看MessageDigestPasswordEncoder。它将盐和密码组合成一个字符串,如“password{salt}”。它计算这个字符串的哈希值 5000 次。这是为了让密码哈希变慢,所以不容易暴力破解。

检查密码是否有效时,使用hash_equals. 这是一个常数时间比较,它可以防止对密码哈希的计时攻击。

于 2017-02-16T10:16:19.780 回答
1

如果你确定你需要的是 SHA512,试试这个

于 2012-03-30T07:53:53.533 回答