Php Symfony是从散列中提取盐还是从isn';这土豆条一点也不咸吗?
我正在使用Symfony2实现密码重置功能。我对用于验证重置请求的确认代码的哈希和盐析有疑问Php Symfony是从散列中提取盐还是从isn';这土豆条一点也不咸吗?,php,symfony,hash,Php,Symfony,Hash,我正在使用Symfony2实现密码重置功能。我对用于验证重置请求的确认代码的哈希和盐析有疑问 $user变量包含Acme\SecurityBundle\Model\user的实例。该类的算法是bcrypt,代价是15 Acme\SecurityBundle\Model\User 散列和验证在控制器内部进行,如下所示 散列: 验证: 正如您所看到的,在散列时添加了salt,但在验证时没有添加salt。尽管如此,确认代码还是成功验证了 有人能解释一下吗?Symfony是从杂烩中提取盐,还是杂
$user
变量包含Acme\SecurityBundle\Model\user
的实例。该类的算法是bcrypt,代价是15
Acme\SecurityBundle\Model\User
散列和验证在控制器内部进行,如下所示
散列:
验证:
正如您所看到的,在散列时添加了salt,但在验证时没有添加salt。尽管如此,确认代码还是成功验证了 有人能解释一下吗?Symfony是从杂烩中提取盐,还是杂烩根本没有腌制
另外,我用同样的方法更新用户的密码。看看散列值本身
$2y$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
| | | |
| | | hash-value = K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
| | |
| | salt = nOUIs5kJ7naTuTFkBy1veu (22 characters)
| |
| cost-factor = 10 = 2^10 iterations
|
hash-algorithm = 2y = BCrypt
…您可以看到盐包含在存储的哈希值中。验证函数可以从存储的散列中读取使用过的salt和其他参数,这就是为什么不必将这些参数传递给函数
根据Symfony的源代码,内部使用PHP函数。如果省略“salt”参数,此函数将生成一个安全的salt,因此我建议省略此参数。如果传递salt参数,函数将注意salt的格式是否有效。您已经完成了一半。使用BCrypt生成的最终哈希包括cyphertext、成本和使用的盐。PHP
password\u hash
函数是通用函数,允许您传入一个salt(某些算法需要这样做),但是如果在encode上没有提供,BCrypt将生成一个salt,而在decode上可能会忽略它(因为您可以从hash中获得它),因此传入null是可以的
因此,不仅在解码时不需要传入salt,在编码时也不应该传入salt,因为BCrypt将以加密安全的方式处理这个问题
请参阅此文件和PHP文档,了解顺便说一句,de数据库中的哈希如下:
$2y$15$tjvaanfiv3pstlo4y29hrexvg9ncttmxtcxeoozozcgqmwroit.
还是我不应该通过salt add all?getSalt
方法返回长度为24的base64编码字符串。散列中的盐是怎样的22个字符?=
字符是否已删除?谢谢。我现在明白了。我将从getSalt
返回null
,让PHP处理这个问题。A需要getSalt
方法的定义。根据该页底部的注释,值$password.{.$salt.}如果getSalt
返回某些内容,则创建code>并使用bcrypt散列,否则它只是使用bcrypt编码。而且我不存储我的salt,那么AP中的散列如何成功验证?get valuegetSalt
返回值是否完全被忽略?我怀疑Symfony文档页面不准确,至少对于BCrypt来说是这样。如果您查看BCrypt PasswordEncoder的源代码,当明文密码和salt被传递到password\u hash
时,它们仍然是分开的。因此,正如我们所讨论的,salt仍然可以从散列中检索,虽然您没有单独持久化salt,但在保存整个散列时,您间接地持久化了salt。具有一个mergePasswordAndSalt
函数,其行为与该文档中的相同,并被其他编码器(如MessageDigest one)使用。
// 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
);
$2y$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
| | | |
| | | hash-value = K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
| | |
| | salt = nOUIs5kJ7naTuTFkBy1veu (22 characters)
| |
| cost-factor = 10 = 2^10 iterations
|
hash-algorithm = 2y = BCrypt