我想使用 SHA1 哈希算法存储(插入)和获取(检索)密码,因为它比以纯文本形式存储密码要好。当插入到我的数据库中的 users
表时,插入了 SHA1 哈希,但是在登录时它没有成功。我需要修改 Javascript 文件中的功能代码吗?
我正在使用带有 POST 方法的 HTML 登录表单。
这需要执行我的函数文件中的 SQL 代码。
function authenticate(request, respond) {
var input_username = request.body.username; // username from user input
var input_password = request.body.password; // password from user input
var msg = "";
// Call the getLoginDetails function from DB
DB.getLoginDetails(input_username, function(error, result) {
if (error) {
respond.json(error);
} else {
// If user can be found, result has one record
if (result.length > 0) {
if (input_password == result[0].password) {
msg = "Successful.";
console.log(msg);
} else {
msg = "Failed.";
console.log(msg);
}
} else { // If user not found, result has no record
msg = "User not found!";
}
修改前(DB.js)文件。
insertData(user, callback) {
var sql = "INSERT INTO users (`id`,`username`,`password`) VALUES(?,?,?)";
db.query(sql, [user.getId(), user.getUsername(), user.getPassword()], callback)
}
getLoginDetails(user, callback) {
var sql = "SELECT password FROM users WHERE username = ?";
db.query(sql, [user], callback);
}
修改(DB.js)文件后
//Insert user with SHA1 algorithm
insertData(user, callback) {
var sql = "INSERT INTO users (`id`,`username`,`password`) VALUES(?,?,SHA1(?))";
db.query(sql, [user.getId(), user.getUsername(), user.getPassword()], callback)
}
//Login with SHA1 algorithm
getLoginDetails(user, callback) {
var sql = "SELECT SHA1(password) FROM users WHERE username = ?";
db.query(sql, [user], callback);
}
最佳答案
您的代码中有几个问题:
var sql = "SELECT SHA1(password) FROM users WHERE username = ?";
在这里,您要重新散列已存储在数据库中的 SHA1 散列值。那应该只是:
var sql = "SELECT password FROM users WHERE username = ?";
然后,在密码验证方面,您在进行比较时不会对输入密码进行哈希处理,因此您将原始密码(用户输入)与 SHA1 哈希(从数据库中检索)进行比较。
您需要包含一个执行 SHA1 散列的函数(例如 this one ),并使用它来散列输入密码:
var sha1 = require('sha1');
// ...
if (result.length > 0) {
if (sha1(input_password) == result[0].password) {
// success
} else {
// failure
}
}
// ...
附带说明一下,存储哈希显然比存储原始密码好,但 SHA1 可能有点弱。可能值得研究类似 bcrypt 的内容.
关于javascript - 在 MySQL 中使用 SHA1 哈希值插入和检索用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48615633/