bcrypt.compare ( ) всегда возвращает false

#node.js #express #bcrypt

#node.js #выразить #bcrypt ( шифрование )

Вопрос:

Я пробовал как bcrypt (версия 5.0.0), так и bcryptjs (версия 2.4.3) для хэширования и сравнения паролей. Но функция сравнения в обоих пакетах всегда возвращает false.

Хеширование

 userSchema.pre('save', async function (next) {
  this.password = await bcrypt.hash(this.password, 12);
  this.passwordConfirm = undefined;
  next();
});
 

Сравнение

 userSchema.methods.checkPassword = async function (inputPass, hashedPass) {
  return await bcrypt.compare(inputPass, hashedPass);
};
 

Обновить
Проблема, похоже, исчезла в других моих проектах с точно такой же настройкой.

Комментарии:

1. Обычная схема для паролей заключается в том, что вы сохраняете хэшированную версию пароля, а затем, когда пароль отправлен, вы его хэшируете, а затем сравниваете два хэша. В вашем checkPassword методе я предполагаю, что один из них — это ранее сохраненный хэш, а другой — входящий пароль. Если это так, это необходимо хэшировать перед сравнением. Вы не можете сравнить хэш с простым паролем.

2. Я думаю, что вы не делаете хэш входного пароля, прежде чем сравнивать входной пароль и пароль пользователя. Сначала вы должны создать хэш входного пароля, а затем сравнить оба пароля, он должен возвращать true, если входной пароль правильный

3. Хэш-метод @jfriend00 каждый раз генерирует уникальный хэш, даже если в нем указан один и тот же ввод. Поэтому, даже когда я сначала хэширую входной пароль, а затем сравниваю его с уже хэшированным паролем, хранящимся в БД, он возвращает false . Кроме того, ранее я использовал bcrypt так же, как я использовал его здесь. В тот раз это сработало, но внезапно перестало работать. Кроме того, нет официального обновления относительно каких-либо изменений в том, как работает bcrypt compare. Я не понимаю, почему он перестал работать.

4. Вы явно делаете что-то не так, если хэш каждый раз отличается при вводе одних и тех же входных данных. Функция хеширования была бы довольно бесполезной, если бы это было так. Я подозреваю, что вы не начинаете с одних и тех же входных данных каждый раз или делаете что-то еще неправильно. Возможно, вы хешируете хэш или что-то в этом роде.

5. @jfriend00 я проверил, но в реализации генерации хэша нет ничего плохого. Просто так работает bcrypt. Он генерирует новую соль каждый раз, когда получает входные данные, и, следовательно, каждый раз создается уникальный хэш, даже если предоставленные входные данные совпадают. Я подозреваю, что с функцией «сравнить» что-то не так, потому что ранее, в январе 2021 года, она работала таким образом совершенно нормально. Но теперь, внезапно, он работает таким странным образом, что всегда возвращает false .

Ответ №1:

вы не можете использовать функцию await с возвратом, просто попробуйте

 userSchema.methods.checkPassword = async function (inputPass, hashedPass) {
  let isValid = await bcrypt.compare(inputPass, hashedPass);
  return isValid;
};
 

Комментарии:

1. Использование await с возвратом не является проблемой. Но я тоже попробовал этот подход, и он не сработал.