将输入的密码与BCrypt哈希密码在数据库中进行比较

时间:2017-03-14 20:02:55

标签: java mysql database hash bcrypt

我正在尝试登录,将输入的密码和用户名与我的数据库进行比较,如果两者匹配,则可以登录。 我刚开始使用MySQL和BCrypt。 到目前为止,这是我的代码:

@FXML
    void anmeldenButton(ActionEvent event) throws NamingException, ClassNotFoundException {
        String myUrl = "jdbc:mysql://localhost:3306/pwmanager?verifyServerCertificate=false&useSSL=true";
        Connection conn = null;
        username = tfuser1.getText().toString();
        try {
            conn = DriverManager.getConnection(myUrl, "", "");
            query = "SELECT benutzername, passwort FROM nutzer WHERE (benutzername = ? and passwort = ?)";
            PreparedStatement ps = conn.prepareStatement(query);
            ps.setString(1, username);
            ps.setString(2, password);
            ResultSet rs = ps.executeQuery();

            while (rs.isBeforeFirst()) {
                checkUser = rs.getString(1);
                checkPass = rs.getString(3);

                if (BCrypt.checkpw(pf1.getText(), checkPass) && (checkUser.equals(username))) {
                    System.out.println("yay");
                } else {
                    System.out.println("ney");
                }
            }

            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您的代码没有多大意义。

输入的密码可能不等于存储的密码,因为存储的密码是经过哈希处理的,而输入的密码则不是。所以你不能使用

and passwort = ?

其次,您的查询只选择两个值,但随后使用

checkPass = rs.getString(3)

由于仅使用用户名,您需要从数据库中获取存储的哈希密码,然后使用Bcrypt验证输入的密码和存储的哈希密码是否匹配。

另外,

while (rs.isBeforeFirst())

也没有多大意义,并且查询应该返回0或一行。所以只需使用

if (rs.next())