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

Javascript Node.js bcrypt compare为正确的密码返回false,javascript,node.js,encryption,passwords,bcrypt,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,

我使用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")
                        }
                    });
                }
            }
        }
    );
}
我创建了一个用户,其电子邮件为“hello”,密码为“world”,并运行以下查询

SELECT Email, Password FROM `Users` WHERE Email = 'hello'
返回以下内容

hello   $2a$04$JwaMtM577eqLRNd0m5tbTewP1IxBMSAwyW9kczPjOPjDgu9I
但是,当我尝试登录时,我得到以下结果(自定义响应)


有人知道我哪里出了问题吗?

我盯着屏幕看太久了


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

我盯着屏幕看太久了


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

可能您的哈希无效,请尝试使用bcrypt生成哈希:

bcrypt.hash(myPlaintextPassword, saltRounds, function(err, hash) {
  // Store hash in your password DB. 
});
然后,您可以尝试以一种简单的方式检查数据库中的哈希值是否与要使用的输入的硬编码版本匹配(密码变量:
p
作为字符串
'world'

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


您应该更深入地了解出了什么问题。

也许您最终得到的哈希值无效,请尝试使用bcrypt生成哈希值:

bcrypt.hash(myPlaintextPassword, saltRounds, function(err, hash) {
  // Store hash in your password DB. 
});
然后,您可以尝试以一种简单的方式检查数据库中的哈希值是否与要使用的输入的硬编码版本匹配(密码变量:
p
作为字符串
'world'

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


您应该更深入地了解问题所在。

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

varchar(125)

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

varchar(125)