【问题标题】:Insert and retrieve user using SHA1 hash value in MySQL在 MySQL 中使用 SHA1 哈希值插入和检索用户
【发布时间】:2018-07-14 21:35:36
【问题描述】:

我想使用 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);
    }

【问题讨论】:

  • 我将您的问题回滚到原始版本。如果您想突出显示您尝试过的其他事情,请在问题末尾添加更新。
  • SHA1,尤其是在未加盐的情况下,根本不足以作为密码哈希。 security.stackexchange.com/q/211/32112

标签: javascript mysql sha1


【解决方案1】:

您的代码中有几个问题:

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 之类的内容。

【讨论】:

  • 我在进行更改后收到Error: Cannot find module 'sha1'。我正在使用 Node.js Web 服务器
  • 模块安装了吗? npm install sha1 --save
  • 好的,已经安装了模块,现在我登录失败了。已经更新了我上面使用的代码。
  • 首先,不要重写你的问题,那样它就失去了所有意义。其次,所有的积木都在那里。你试过调试吗?
  • 我在这里对我的函数文件进行了更改:pastebin.com/CMTLC6Bk 并删除了 DB.getLoginDetails 中的额外散列。我也试过重启服务器。纯文本方法仍然可以正常工作。
猜你喜欢
  • 2010-10-11
  • 1970-01-01
  • 2017-02-22
  • 2017-06-10
  • 1970-01-01
  • 2014-01-02
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多