javascript - 在 MySQL 中使用 SHA1 哈希值插入和检索用户

标签 javascript mysql sha1

我想使用 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/

相关文章:

javascript - 如何在NodeJS中从hmacsha1生成Node JS签名代码

Scala HMAC-SHA1 签名?

javascript - 使用 webpack 打包 CSS

mysql - 转换为存储过程

javascript - 与 umijs 结合使用 react-pdf 生成非常慢

mysql - 一对多关系的数据库设计

php - 警告/错误 :- No tuples available at this result index PHP-APACHE-ODBC-MYSQL-CENTOS

unicode - SHA-1 和 Unicode

javascript - WebGL 使用 gl-matrix 库 mat4.translate 未运行

javascript - Redux 存储在 React 类组件中返回 null 值