我正在使用Symfony2來實現密碼重置功能。我有關於哈希和salting確認代碼用於驗證重置請求的問題。Symfony是從哈希衍生鹽還是不是哈希鹽?
$user
變量包含一個Acme\SecurityBundle\Model\User
的實例。這個類的算法是bcrypt且成本15.
的Acme \ SecurityBundle \模型\用戶
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是從哈希衍生鹽還是不是哈希鹽?
P.S.我以同樣的方式更新用戶的密碼。
順便說一下,在德數據庫中的哈希值是這樣的:''$ 2Y $ 15 $ TjVaanFIV3psTlo4Y29HRexVg9nctTmXTcXeEoOZroZCgqMWroIT。'' – Stan 2014-09-10 08:35:20
或者我不應該通過鹽加全部? [見BCryptPasswordEncoder.php中的這一行](https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Security/Core/Encoder/BCryptPasswordEncoder.php#L57) – Stan 2014-09-10 09:17:24