Symfony UserPasswordEncoderInterface генерирует разные значения при каждом вызове

Я сделал простую команду в symfony, чтобы взять значение из консоли и закодировать его:

$io = new SymfonyStyle($input, $output);
$email = $input->getArgument('email');

/** @var User $user */
$user = $this->em->getRepository(User::class)->findOneBy([
    'email' => $email
]);

if (empty($user)) {
    $io->error("User with email '$email' not found");
    return 0;
}

$password = $io->askHidden('Password: ');
$hash = $this->encoder->encodePassword($user, $password);

$io->text("Generated hash: $hash");

Фрагмент конфигурации безопасности:

security:
    encoders:
        App\Entity\User:
            algorithm: bcrypt

    providers:
        app_user_provider:
            entity:
                class: App\Entity\User
                property: email 

Это нормально, что каждый вызов одного и того же введенного значения генерирует другое значение? Как можно при доступе проверить, что пароли одинаковые, если при одинаковых значениях генерирует разную кодировку?


person JayAndJay    schedule 05.09.2020    source источник
comment
Это работает как задумано. Частью хеширования пароля является генерация случайной соли. Соль хранится вместе с хешем и используется в процессе проверки. Каждый раз, когда вы создаете новый хэш, вы получаете другую соль, поэтому значение отличается. PHP-функции password_hash и password_verify в конечном итоге используются оболочками Symfony. . Стоит прочитать документы и, возможно, провести некоторое тестирование, чтобы убедиться, что даже если у вас есть два разных значения, они все равно могут безопасно проверить один и тот же пароль.   -  person Cerad    schedule 05.09.2020
comment
И чтобы ответить на ваш последний вопрос: $encoder-›isPasswordValid($hash,$raw) выполнит проверку. Там много примеров.   -  person Cerad    schedule 05.09.2020
comment
Большое спасибо @Cerad. Если вы ответите, я принимаю ваш ответ. Что со мной происходит, так это то, что в определенный момент (через несколько дней после того, как пользователи зарегистрировались и получили доступ) проверка пароля ($encoder->isPasswordValid ($hash, $raw)) возвращает false, и это сводит меня с ума. Вы хоть представляете, что это может быть?   -  person JayAndJay    schedule 05.09.2020
comment
Существует подсистема перефразирования, которая время от времени перефразирует пароль. Не знаю, использует ли ваше приложение его или нет. Но даже это не должно ни на что влиять. Я бы посмотрел на свои старые резервные копии базы данных и посмотрел, изменилось ли само значение хеш-функции. Никогда не слышал о случае, когда один и тот же хеш вдруг переставал проверяться. Какие версии Symfony вы используете?   -  person Cerad    schedule 05.09.2020
comment
@Cerad Я использую версию 4.4.   -  person JayAndJay    schedule 05.09.2020
comment
можете ли вы показать, когда/где вы сохраняете новый пароль и где вы проверяете пароль   -  person Jakumi    schedule 06.09.2020