我需要比较用户输入的密码是否有效。我如何获得 sha512 加密。我也在我的项目中使用 FOSUserBundle。
3 回答
在您的控制器中,您可以这样做(假设您将 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;
Symfony 有几种不同的方式来存储密码。散列和检查密码的逻辑存储在几个“编码器”类中:
使用哪一个可以在 security.yml中的 key 下进行配置encoder
。如果这样说sha512
,您正在使用MessageDigestPasswordEncoder
.
对于不同的用户类型,编码器类型可以不同。要为用户获取正确的编码器,您可以询问EncoderFactory。这已经在UserPasswordEncoder中为您完成:您将用户和纯密码传递给UserPasswordEncoder->isPasswordValid
,它会使用属于该用户的正确编码器检查密码。这是检查用户密码的最简单的界面。
如果你真的想知道 SHA512 散列是如何工作的,你可以查看MessageDigestPasswordEncoder。它将盐和密码组合成一个字符串,如“password{salt}”。它计算这个字符串的哈希值 5000 次。这是为了让密码哈希变慢,所以不容易暴力破解。
检查密码是否有效时,使用hash_equals
. 这是一个常数时间比较,它可以防止对密码哈希的计时攻击。
如果你确定你需要的是 SHA512,试试这个。