Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony是从散列中提取盐还是从isn';这土豆条一点也不咸吗?_Php_Symfony_Hash - Fatal编程技术网

Php Symfony是从散列中提取盐还是从isn';这土豆条一点也不咸吗?

Php Symfony是从散列中提取盐还是从isn';这土豆条一点也不咸吗?,php,symfony,hash,Php,Symfony,Hash,我正在使用Symfony2实现密码重置功能。我对用于验证重置请求的确认代码的哈希和盐析有疑问 $user变量包含Acme\SecurityBundle\Model\user的实例。该类的算法是bcrypt,代价是15 Acme\SecurityBundle\Model\User 散列和验证在控制器内部进行,如下所示 散列: 验证: 正如您所看到的,在散列时添加了salt,但在验证时没有添加salt。尽管如此,确认代码还是成功验证了 有人能解释一下吗?Symfony是从杂烩中提取盐,还是杂

我正在使用Symfony2实现密码重置功能。我对用于验证重置请求的确认代码的哈希和盐析有疑问

$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 value
getSalt
返回值是否完全被忽略?我怀疑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