我需要比较用户输入的密码是否有效。如何获得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,试试这个。