【发布时间】:2014-09-10 08:19:53
【问题描述】:
我正在使用 Symfony2 实现密码重置功能。我对用于验证重置请求的确认代码进行散列和加盐处理有疑问。
$user 变量包含Acme\SecurityBundle\Model\User 的一个实例。这个类的算法是bcrypt,代价是15。
Acme\SecurityBundle\Model\User
namespace Acme\SecurityBundle\Model;
use Acme\SecurityBundle\Model\om\BaseUser;
use Symfony\Component\Security\Core\Util\SecureRandom;
class User extends BaseUser
{
public function getSalt()
{
$random = new SecureRandom();
return base64_encode($random->nextBytes(128 / 8));
}
}
散列和验证发生在控制器内部,如下所示。
散列:
// Generate confirmation code
$tokenGenerator = new UriSafeTokenGenerator();
$resetConfirmationCodePlain = substr($tokenGenerator->generateToken(), 0, 20);
// Hash confirmation code
$factory = $this->get('security.encoder_factory');
$encoder = $factory->getEncoder($user);
$resetConfirmationCode = $encoder->encodePassword($resetConfirmationCodePlain, $user->getSalt());
验证:
// Validate confirmation code
$factory = $this->get('security.encoder_factory');
$encoder = $factory->getEncoder($user);
$isValid = $encoder->isPasswordValid(
$user->getResetConfirmationCode(), $confirmationCode, null
);
如您所见,在散列时添加了盐,但在验证时未添加。尽管如此,确认码验证成功。
有人可以解释一下吗? Symfony 是从哈希中派生盐还是根本不加盐?
附注我以同样的方式更新用户的密码。
【问题讨论】:
-
顺便说一句,de 数据库中的哈希是这样的:
$2y$15$TjVaanFIV3psTlo4Y29HRexVg9nctTmXTcXeEoOZroZCgqMWroIT. -
或者我不应该把盐全部加进去吗? See this line in BCryptPasswordEncoder.php