Node.js 如何正确比较数据库中的加密/哈希密码?
我以前见过这个问题,但在其他语言(C#和PHP)中,但我正在使用Javascript。我正在将用户名和密码存储到数据库中,但密码正在通过bcrypt散列 我可以正确地存储它,但我无法从数据库中提取它并正确地进行比较。它总是记录我的“密码不匹配”消息 这是我的注册码,用于将用户名和密码存储到我的数据库中Node.js 如何正确比较数据库中的加密/哈希密码?,node.js,mongodb,bcrypt,Node.js,Mongodb,Bcrypt,我以前见过这个问题,但在其他语言(C#和PHP)中,但我正在使用Javascript。我正在将用户名和密码存储到数据库中,但密码正在通过bcrypt散列 我可以正确地存储它,但我无法从数据库中提取它并正确地进行比较。它总是记录我的“密码不匹配”消息 这是我的注册码,用于将用户名和密码存储到我的数据库中 app.post('/register', function (req, res) { var usernameCollection = mongoDBDatabase.collection(
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安装和新的NPMmongodb
软件包上重现此问题。我唯一能怀疑的是,在链中的某个地方,Bcrypt字符串被“解释”为以$
开头(Mongo喜欢美元)。可能尝试将'x'+散列存储为密码,然后比较user.password.substr(1)
。(这很难看,但只是证明这一长期理论的一种方式……希望是错误的。)我看到了@AnthonyWinzlet,但我没有使用UserSchema,也不确定这是什么@你简直就是一头野兽。我没有想到这一点,这是可行的。幸好你能发现问题,但这意味着这里有一些问题需要解决:如果你的用户想给自己命名为“$up3rm4n”
?由于我无法通过新安装重现此问题,因此我认为您的第一步应该是确保NPM包mongodb
是最新的,检查行为,然后检查Mongo本身。如果错误仍然发生,则必须涉及第三方软件包(代理Mongo?mongoDBDatabase
而不是纯粹的require('mongodb')。MongoClient
?)祝您好运,发现后请随时通知我们!