Node.js bcrypt compare为正确的密码返回false

时间:2017-08-23 13:47:18

标签: javascript node.js encryption passwords bcrypt

我使用bcrypt来哈希并比较用户密码,但是在我注册新用户然后尝试登录之后,即使密码正确,bcrypt compare函数也会返回false。

1)创建新用户

function NewUser(request, reply) {
    let e = decodeURIComponent(request.params.q_email)
    let p = decodeURIComponent(request.params.q_password)

    dbCheckUserExists(e,
    (yes) => {
        return reply("User already exists")
    },
    (no) => {
        bcrypt.hash(p, 3, (err, hash) => {
            if (err) {
                return reply("Error creating new user")
            } else {
                dbCreateUser(request, reply, e, hash)
            }
        });
    });
}

function dbCreateUser(request, reply, email, pwdHash) {
    var sql = "INSERT INTO Users(Version, Email, Password, Balance) VALUES (?,?,?,?)"
    var args = [1, email, pwdHash, 0]
    sql = mysql.format(sql, args)
    executeSql(sql,
        (err, rows, fields) => {
            if (err) {
                return reply("Error creating new user")
            } else {
                return reply("Successfully created new user")
            }
        }
    );
}

2)登录

function dbLogin(request, reply, yes, no) {
    let e = decodeURIComponent(request.payload.q_email)
    let p = decodeURIComponent(request.payload.q_password)
    //reply('email: ' + e + ' password: ' + p)

    var sql = "SELECT Password FROM Users WHERE Email = ? LIMIT 1"
    sql = mysql.format(sql, e)

    executeSql(sql,
        (err, rows, fields) => {
            if (err) {
                throw err
            } else {
                if (rows.length == 0) {
                    //no()
                    reply("email not found")
                } else {
                    bcrypt.compare(p, rows[0].Password, (err, res) => {
                        if (res == true) {
                            reply("correct password")
                            //dbCreateSession(request, reply, yes, no)
                        } else if (res == false){
                            reply("incorrect password: " + p + " " + rows[0].Password)
                        }
                        else {
                            //no()
                            reply("neither true nor false")
                        }
                    });
                }
            }
        }
    );
}

我创建了一个用电子邮件"你好"和密码"世界"并运行以下查询

SELECT Email, Password FROM `Users` WHERE Email = 'hello'

返回以下内容

hello   $2a$04$JwaMtM577eqLRNd0m5tbTewP1IxBMSAwyW9kczPjOPjDgu9I

然而,当我尝试登录时,我得到以下(自定义回复)

incorrect password: world $2a$04$JwaMtM577eqLRNd0m5tbTewP1IxBMSAwyW9kczPjOPjDgu9I

谁能看到我哪里出错?

3 个答案:

答案 0 :(得分:1)

我一直盯着屏幕看太久了!

问题是数据库中的密码字段被截断(55个字符而不是60个字符)

答案 1 :(得分:1)

也许你最终得到了无效的哈希,尝试用bcrypt生成哈希:

bcrypt.hash(myPlaintextPassword, saltRounds, function(err, hash) {
  // Store hash in your password DB. 
});

然后,您可以尝试以简单的方式检查数据库中的哈希是否与您将使用的输入的硬编码版本匹配(密码变量:p为字符串'world'

bcrypt.compare('world', hash, function(err, result) {
 if (err) { throw (err); }
 console.log(result);
});

如果它有效(可能会),那么尝试对请求的输入执行相同的操作。

你应该更好地了解出了什么问题。

答案 2 :(得分:1)

增加数据库中密码字段的大小,即

varchar(125)