Symfony2:如何生成密码的sha512哈希


Symfony2: How do i generate sha512 hash of a password?

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

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

    $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;

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

  • BCryptPasswordEncoder
  • 消息数字密码编码器
  • Pbkdf2密码编码器
  • 明文密码编码器

使用哪一个可以在security.yml中配置,密钥为encoder。如果上面写着sha512,那么您正在使用MessageDigestPasswordEncoder

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

如果您真的想知道SHA512哈希是如何工作的,可以查看MessageDigestPasswordEncoder。它将salt和密码组合在一个类似"password{salt}"的字符串中。它计算这个字符串的散列5000次。这是为了使密码哈希变慢,所以不容易使用暴力。

在检查密码是否有效时,使用hash_equals。这是一个恒定的时间比较,可以防止对密码哈希的定时攻击。

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