Java 将输入的密码与数据库中的BCrypt哈希密码进行比较
我正在尝试登录,将输入的密码和用户名与我的数据库进行比较,如果两者匹配,则可以登录。 我刚开始使用MySQL和BCrypt。 以下是我目前的代码:Java 将输入的密码与数据库中的BCrypt哈希密码进行比较,java,mysql,database,hash,bcrypt,Java,Mysql,Database,Hash,Bcrypt,我正在尝试登录,将输入的密码和用户名与我的数据库进行比较,如果两者匹配,则可以登录。 我刚开始使用MySQL和BCrypt。 以下是我目前的代码: @FXML void anmeldenButton(ActionEvent event) throws NamingException, ClassNotFoundException { String myUrl = "jdbc:mysql://localhost:3306/pwmanager?verifyServerCert
@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();
}
}
谢谢你的帮助 您的代码没有多大意义 输入的密码不可能等于存储的密码,因为存储的密码是散列的,而输入的密码不是。所以你不能用
and passwort = ?
其次,查询只选择两个值,但随后使用
checkPass = rs.getString(3)
由于只有用户名,您需要从数据库中获取存储的哈希密码,然后使用Bcrypt验证输入的密码和存储的哈希密码是否匹配
而且
while (rs.isBeforeFirst())
也没有什么意义,查询应该返回0或一行。所以只要使用
if (rs.next())
遗漏了问题?啊,对不起!我没有结果!if语句从来都不是真的或假的。如果有两个条件,则有一个if。你有没有想过使用调试器和/或附加的print语句来解释它的else分支为什么会出现这种情况?除此之外,你正在混合不同的层;您的ui代码不应该直接与数据库通信。您将抽象放在这些层之间,以避免一个类在几个monster方法中完成所有工作。