2013-06-20 2 views
0

Я знаю, что есть много других вопросов с подобной темой, но я не могу найти тот, который создает решение моей конкретной проблемы. У меня есть приложение Java, которое подключается через JDBC к Lamp для проекта Uni, и я пытаюсь сравнить введенный пароль с паролем, связанным с логином, который они также ввели в базе данных MySQL. У меня есть метод хеширования (MD5), который будет хешировать пользователей, но он продолжает бросать исключение нулевого указателя, и я не могу его исправить!Проверьте строку входа в систему с паролем (MySQL & JDBC)

на кнопку печати Код:

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()); 
    } 
}    

метод Hashing (и связанные с ними переменные):

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 

Пароль является LondonWeight

Любые идеи?

+0

Опубликовать Stacktrace – Mubin

ответ

1

пароль не установлен равным значению parass par pass, поэтому password.getBytes() не будет работать. Как насчет pass.getBytes()

+0

Ну, я больше не получаю огромную ошибку! Но он приходит с неправильным входом в систему. Я скопировал и вставил пароль, так что это правильно, будет ли это связано с хэшированием, которое вызывает несоответствие? –

0

con, как представляется, всегда быть пустым

Вы должны получить объект соединения, прежде чем вы можете сделать con.prepareStatement("SELECT Login, Password from Staff");

Там могут быть и другие проблемы в вашем коде, но это трудно сказать, какие проблемы вы ударять без a stacktrace

Имеет ли ваш стол для персонала более одного ряда? Похоже, что если имя пользователя, которое вы используете для isd, первое, возвращаемое вашим оператором SQL, вы получите «Неправильный вход». вы не лучше делать бы

SELECT Login, Password from Staff where Login = UserName 

(это не синтаксически правильно в вашем контексте, но вы получите дрейфа ...)

Таким образом, если дон; т получить строку, то это неправильный вход, а затем вам просто нужно сравнить хешированные значения.

+0

Как я уже сказал, у меня есть заявление о подключении, которое я просто оставил для конфиденциальности. –

Смежные вопросы