当注册(通过散列)和登录在 2 个不同的 javascript 函数中时,如何将密码与数据库中的散列密码进行比较?
How to compare a password with a hashed one in database when sign-up(pass hashing) and login are in 2 different javascript function?
我正在 javascript 开发一个身份验证程序。我让它在没有散列的情况下工作。为此,我使用了一个数据库来存储用户 ID、用户名和密码。使用注册功能将用户信息添加到数据库中。然后我们有一个登录页面,它发送一个 sql 查询来获取使用用户名和密码的用户。如果匹配,则我们将会话设置为找到的用户,然后转到仪表板。
使用哈希时,我使用 bcrypt 成功地对密码进行了哈希处理,并将其存储在数据库中。但是,当尝试使用 bcrypt 的 compare 函数 比较用户给出的密码时,未定义哈希。我怎样才能让它发挥作用?
我尝试使用以下方法:
let hash = bcrypt.hashSync(password, 10);
这对用户提供的密码进行了散列处理,但这会给我一个不同的新密码,因为这是散列处理的工作原理。当不包括散列变量时,我总是得到它未定义的错误。
exports.login = function(req, res){
let sess = req.session;
if(req.method === "POST"){
let bcrypt = require('bcrypt');
let saltRounds = 10;
let post = req.body;
let name = post.user_name;
let password = post.password;
let sql = "SELECT id, first_name, last_name, user_name FROM `users` WHERE `user_name`='" + name + "'";
bcrypt.compare(password, hash, function(err, res) {
db.query(sql, function(err, results){
if(results.length && res){
req.session.userId = results[0].id;
req.session.user = results[0];
console.log(results[0].id);
res.redirect('/home/dashboard');
}
else{
message = 'Username or password incorrect';
res.render('index.ejs',{message: message});
}
});
});
} else {stuff}
}
密码散列是在另一个函数中完成的:
exports.signup = function(req, res){
message = '';
if(req.method === "POST"){
// bcrypt hashing: Maybe planning on doing passport if usefull
let bcrypt = require('bcrypt');
let saltRounds = 10;
let post = req.body;
let name = post.user_name;
let password = post.password;
bcrypt.hash(password, saltRounds, function(err, hash) {
let sql = "INSERT INTO `users`(`user_name`,`password`) VALUES ('" + name + "','" + hash + "')";
let query = db.query(sql, function (err, result) {
message = "Account has been created.";
res.render('signup.ejs', {message: message});
});
});
} else {
res.render('signup');
}
};
目标是通过有效比较获得散列密码。现在,我只有哈希工作,我不知道如何做第二部分。
I would like to keep the 2 functions separated
代码在没有散列的情况下工作。但升级才是目的。
Then we have a login page that sends a sql query to get the user using username and password. If there is a match then we set the session to the user found and we go to the dashboard.
现在应该使用相同的方法。您不是检索密码,而是检索哈希,而不是检查它是否相等,而是使用 bcrypt.compare
.
However, when trying to compare a password given by user using the compare function of bcrypt, the hash is not defined. How can I make it work?
您的 hash
变量未定义,因为您需要先执行 SQL 查询:
let name = post.user_name;
let password = post.password;
// TODO: rename "password" column to "password_hash"
let sql = "SELECT id, password, first_name, last_name, user_name FROM `users` WHERE `user_name`=?";
// ^^^^^^^^ prevent SQL injection by using parameterised query ^
db.query(sql, name, function(err, results) {
if(!err && results.length) {
var hash = results[0].password;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
bcrypt.compare(password, hash, function(err, ok) {
if (!err && ok) {
req.session.userId = results[0].id;
req.session.user = results[0];
…
} else{
…
}
});
} else {
…
}
});
我正在 javascript 开发一个身份验证程序。我让它在没有散列的情况下工作。为此,我使用了一个数据库来存储用户 ID、用户名和密码。使用注册功能将用户信息添加到数据库中。然后我们有一个登录页面,它发送一个 sql 查询来获取使用用户名和密码的用户。如果匹配,则我们将会话设置为找到的用户,然后转到仪表板。
使用哈希时,我使用 bcrypt 成功地对密码进行了哈希处理,并将其存储在数据库中。但是,当尝试使用 bcrypt 的 compare 函数 比较用户给出的密码时,未定义哈希。我怎样才能让它发挥作用?
我尝试使用以下方法:
let hash = bcrypt.hashSync(password, 10);
这对用户提供的密码进行了散列处理,但这会给我一个不同的新密码,因为这是散列处理的工作原理。当不包括散列变量时,我总是得到它未定义的错误。
exports.login = function(req, res){
let sess = req.session;
if(req.method === "POST"){
let bcrypt = require('bcrypt');
let saltRounds = 10;
let post = req.body;
let name = post.user_name;
let password = post.password;
let sql = "SELECT id, first_name, last_name, user_name FROM `users` WHERE `user_name`='" + name + "'";
bcrypt.compare(password, hash, function(err, res) {
db.query(sql, function(err, results){
if(results.length && res){
req.session.userId = results[0].id;
req.session.user = results[0];
console.log(results[0].id);
res.redirect('/home/dashboard');
}
else{
message = 'Username or password incorrect';
res.render('index.ejs',{message: message});
}
});
});
} else {stuff}
}
密码散列是在另一个函数中完成的:
exports.signup = function(req, res){
message = '';
if(req.method === "POST"){
// bcrypt hashing: Maybe planning on doing passport if usefull
let bcrypt = require('bcrypt');
let saltRounds = 10;
let post = req.body;
let name = post.user_name;
let password = post.password;
bcrypt.hash(password, saltRounds, function(err, hash) {
let sql = "INSERT INTO `users`(`user_name`,`password`) VALUES ('" + name + "','" + hash + "')";
let query = db.query(sql, function (err, result) {
message = "Account has been created.";
res.render('signup.ejs', {message: message});
});
});
} else {
res.render('signup');
}
};
目标是通过有效比较获得散列密码。现在,我只有哈希工作,我不知道如何做第二部分。
I would like to keep the 2 functions separated
代码在没有散列的情况下工作。但升级才是目的。
Then we have a login page that sends a sql query to get the user using username and password. If there is a match then we set the session to the user found and we go to the dashboard.
现在应该使用相同的方法。您不是检索密码,而是检索哈希,而不是检查它是否相等,而是使用 bcrypt.compare
.
However, when trying to compare a password given by user using the compare function of bcrypt, the hash is not defined. How can I make it work?
您的 hash
变量未定义,因为您需要先执行 SQL 查询:
let name = post.user_name;
let password = post.password;
// TODO: rename "password" column to "password_hash"
let sql = "SELECT id, password, first_name, last_name, user_name FROM `users` WHERE `user_name`=?";
// ^^^^^^^^ prevent SQL injection by using parameterised query ^
db.query(sql, name, function(err, results) {
if(!err && results.length) {
var hash = results[0].password;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
bcrypt.compare(password, hash, function(err, ok) {
if (!err && ok) {
req.session.userId = results[0].id;
req.session.user = results[0];
…
} else{
…
}
});
} else {
…
}
});