Node.js 如何正确比较数据库中的加密/哈希密码?

Node.js 如何正确比较数据库中的加密/哈希密码?,node.js,mongodb,bcrypt,Node.js,Mongodb,Bcrypt,我以前见过这个问题,但在其他语言(C#和PHP)中,但我正在使用Javascript。我正在将用户名和密码存储到数据库中,但密码正在通过bcrypt散列 我可以正确地存储它,但我无法从数据库中提取它并正确地进行比较。它总是记录我的“密码不匹配”消息 这是我的注册码,用于将用户名和密码存储到我的数据库中 app.post('/register', function (req, res) { var usernameCollection = mongoDBDatabase.collection(

我以前见过这个问题,但在其他语言(C#和PHP)中,但我正在使用Javascript。我正在将用户名和密码存储到数据库中,但密码正在通过bcrypt散列

我可以正确地存储它,但我无法从数据库中提取它并正确地进行比较。它总是记录我的“密码不匹配”消息

这是我的注册码,用于将用户名和密码存储到我的数据库中

app.post('/register', function (req, res) {
  var usernameCollection = mongoDBDatabase.collection('accounts');
  username = req.body.username;
  bcrypt.hash(req.body.password, saltRounds, function (err, hash) {
    usernameCollection.insertOne({
      personId: req.body.username,
      username: req.body.username,
      password: hash
    }).then(function(data) {
    if (data) {
   //res.redirect('/' + username);
   //window.location.href = "/" + username;
    }
  });
 });
});
这是我的代码,我在数据库中搜索用户名,并试图比较密码,但没有结果

//login page: storing and comparing email and password,and     redirecting to home page after login
app.post('/login', function (req, res) {
  var usernameCollection = mongoDBDatabase.collection('accounts');
  var username = req.body.username;
  var enteredPassword = req.body.password;

  usernameCollection.findOne({
    $or:[
          { username: username}
        ]
    }).then(function(user){
      if (user) {
        console.log('That username was found in the database');

        bcrypt.compare(enteredPassword, user.password, function(err, result){
          if(result == true){
              console.log('Password matches!');
              res.redirect('/' + username);
         }
          else{
            console.log('Password did not match');
            res.redirect('/');
          }
        });
      }
      else{
        console.log('The username ' + username + ' was NOT found in the database');
      }
    });
});

我只想将存储的密码与输入的密码进行比较,并确认它们与用户登录时的密码相同。

可能是重复的,我无法在新的Mongo安装和新的NPM
mongodb
软件包上重现此问题。我唯一能怀疑的是,在链中的某个地方,Bcrypt字符串被“解释”为以
$
开头(Mongo喜欢美元)。可能尝试将
'x'+散列存储为密码,然后比较
user.password.substr(1)
。(这很难看,但只是证明这一长期理论的一种方式……希望是错误的。)我看到了@AnthonyWinzlet,但我没有使用UserSchema,也不确定这是什么@你简直就是一头野兽。我没有想到这一点,这是可行的。幸好你能发现问题,但这意味着这里有一些问题需要解决:如果你的用户想给自己命名为
“$up3rm4n”
?由于我无法通过新安装重现此问题,因此我认为您的第一步应该是确保NPM包
mongodb
是最新的,检查行为,然后检查Mongo本身。如果错误仍然发生,则必须涉及第三方软件包(代理Mongo?
mongoDBDatabase
而不是纯粹的
require('mongodb')。MongoClient
?)祝您好运,发现后请随时通知我们!可能是因为我无法在新的Mongo安装和新的NPM
mongodb
软件包上重现此问题。我唯一能怀疑的是,在链中的某个地方,Bcrypt字符串被“解释”为以
$
开头(Mongo喜欢美元)。可能尝试将
'x'+散列存储为密码,然后比较
user.password.substr(1)
。(这很难看,但只是证明这一长期理论的一种方式……希望是错误的。)我看到了@AnthonyWinzlet,但我没有使用UserSchema,也不确定这是什么@你简直就是一头野兽。我没有想到这一点,这是可行的。幸好你能发现问题,但这意味着这里有一些问题需要解决:如果你的用户想给自己命名为
“$up3rm4n”
?由于我无法通过新安装重现此问题,因此我认为您的第一步应该是确保NPM包
mongodb
是最新的,检查行为,然后检查Mongo本身。如果错误仍然发生,则必须涉及第三方软件包(代理Mongo?
mongoDBDatabase
而不是纯粹的
require('mongodb')。MongoClient
?)祝您好运,发现后请随时通知我们!