0

我知道还有很多其他类似主题的问题,但我找不到可以为我的特定问题创建解决方案的问题。我有一个 Java 应用程序,它通过 JDBC 连接到 Uni 项目的 Lamp,我正在尝试将输入的密码与他们也在 MySQL 数据库中输入的登录名相关的密码进行比较。我有一个散列(MD5)方法,可以散列用户输入,但它不断抛出空指针异常,我无法修复它!

在按钮按下代码:

private void loginButtonActionPerformed(java.awt.event.ActionEvent evt) {                                            
    String pass = passTextField.toString();
    try {
        try {
            lModel.checkLogin(loginTextField.getText(), pass);
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
    } catch (SQLException se) {
        System.out.println(se.toString());
    }
}            

散列方法(和相关变量):

private Logins l;
private String password;

public String hashPass(String pass) throws NoSuchAlgorithmException {
    MessageDigest mdEnc = MessageDigest.getInstance("MD5"); 
    mdEnc.update(password.getBytes(), 0, password.length());
    String md5 = new BigInteger(1, mdEnc.digest()).toString(16); // Encrypted 
    return md5;
}

检查登录方法(没有连接字符串以保护隐私):

public void checkLogin(String login, String pass) throws SQLException, NoSuchAlgorithmException {
    Connection con = null;
    PreparedStatement stmt= null;
    ResultSet rs = null;
    l = new Logins();
    String passHashed = hashPass(pass);
    String username = login;

    try {

        stmt = con.prepareStatement("SELECT Login, Password from Staff");
        rs = stmt.executeQuery();

        if (rs.next()) {
            if (username.equals(rs.getString("Login"))) {
                if (passHashed.equals(rs.getString("Password"))) {
                    System.out.println("Logged in.");
                } else {
                    System.out.println("Incorrect password - login combination.");
                }
            } else {
                System.out.println("Incorrect log in.");
            }
        }

    } finally {
        if (rs != null) try {rs.close();} catch (SQLException se){}
        if (stmt != null) try {stmt.close();} catch (SQLException se) {}
        if (con != null) try {con.close();} catch (SQLException se) {}
    } 
}

编辑:它都正确解析并且可以检查数据库,但我发现它不登录的原因是因为该方法生成的 MD5 代码产生的输出与存储在数据库中的密码不同。这是数据库之一:

1274d1c52d7a5a9125bd64f1f9a26dce

和生成的:

1030416151603361603636256577523441305746075

密码是伦敦体重

有任何想法吗?

4

2 回答 2

1

密码未设置为 pass 参数的值,因此 password.getBytes() 将不起作用。pass.getBytes() 怎么样

于 2013-06-20T12:40:45.970 回答
0

con似乎总是为空

您需要先获取一个连接对象,然后才能执行con.prepareStatement("SELECT Login, Password from Staff");

您的代码中可能还有其他问题,但是如果没有堆栈跟踪,很难判断您遇到了哪个问题

您的 Staff 表中有超过一排吗?似乎除非您要查找的用户名是您的 SQL 语句返回的第一个用户名,否则您将得到 "Incorrect Log in" 。你会不会做得更好

SELECT Login, Password from Staff where Login = UserName

(在您的上下文中,这在语法上不正确,但您得到了漂移......)

这样,如果没有得到一行,那么它是一个不正确的登录,然后你只需要比较散列值。

于 2013-06-20T12:40:13.313 回答