Edit:
Проблема в том, что у вас неправильный порядок, вам нужен пароль, а затем сохраненный хеш.
$check = $hasher->CheckPassword($password, $stored_hash);
Источник
Это имеет значение, как я уже говорил (ниже), сохраненный хеш используется для определения способа хеширования пароля для сравнения, поэтому неправильный порядок аргументов приведет к сбою.
Ответ до:
Вы не расшифровываете хэш, вы проверяете его, хэшируя сопоставимые данные таким же образом. Хэши BCrypt включают в себя хэш, соль и количество раундов, поэтому при проверке не должно возникнуть никаких проблем.
Причина, по которой хеш-коды никогда не бывают одинаковыми, состоит в том, что соль будет отличаться каждый раз. Это необходимо для защиты от атак радужного стола.
Насколько я могу судить, ваш чек - это звук. Проблема должна быть в другом месте. Вы уверены, что $user->password
на самом деле содержит хеш полностью? Хэши BCrypt состоят из 60 символов, поэтому убедитесь, что они не усекаются.