Bcrypt не всегда сравнивает пароли в Node.js - PullRequest
0 голосов
/ 21 мая 2018

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

В файле проблемы:

passport.use(new LocalStrategy(function(username,plainTextPassword,done) {
  process.nextTick(() => {
    db.query('SELECT * FROM users WHERE username = ?',[username],(err,rows) => {
      if (err) return done(err);
      if (!rows[0]) return done(null,false);

      let hash = rows[0].password;
      let user = rows[0];
      bcrypt.compare(plainTextPassword, hash, (err, res) => {
        console.log(plainTextPassword);      // test
        console.log(hash);                   // $2b$10$EefqCwYTMHDDtIGH.SIHIu.BPCOiT7Bp4Zzej5iUoxlKtMZ67oHtC
        console.log(res);                    // false
        if (!res) return done(null,false);
        return done(null,rows[0]);
      });
    });
  });
}));

Я копирую зарегистрированные значения plainTextPassword и хэша и вставляю их в этот код:

const bcrypt = require('bcrypt');
const saltRounds = 10;
bcrypt.compare('test', '$2b$10$EefqCwYTMHDDtIGH.SIHIu.BPCOiT7Bp4Zzej5iUoxlKtMZ67oHtC', (err,same) => {
  console.log(same);    // true
}

, и это возвращает true, а не false, как console.log(res)первого блока кода возвращается.Первый блок кода хорошо проверял большинство паролей, но этот кажется другим.Никаких специальных символов нет, plainTextPassword имеет значение «test», а хэш хранится в VARCHAR (150) в базе данных mysql.

1 Ответ

0 голосов
/ 22 мая 2018

См. [] (https://en.wikipedia.org/wiki/Bcrypt: "Параметр стоимости задает счетчик итераций расширения ключа как степень двух, что является входом для алгоритма шифрования"

$ 10 $ указывает параметр стоимостииз 10, указывая 2 ^ 10 раундов расширения ключа.

Конечно, строка кода: const saltRounds = 10; не используется, удалите мертвый код.

...