2013-06-20 49 views
0

我知道還有很多其他問題與類似的主題,但我找不到一個創建解決方案,我的具體問題。我有一個通過JDBC連接到Uni項目的Java應用程序,我試圖將輸入的密碼與他們也輸入到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()); 
    } 
}    

散列方法(和相關的變量):

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

Post stacktrace – Mubin

回答

1

密碼未設置爲傳遞參數表的值,所以password.getBytes()將不起作用。怎麼樣pass.getBytes()

+0

好吧,我不會再有大錯誤了!但它會出現不正確的登錄。我複製並粘貼密碼,這是正確的,是否會造成不匹配的散列? –

0

con似乎永遠是空

你需要獲得一個連接對象之前,你可以做con.prepareStatement("SELECT Login, Password from Staff");

有可能在你的代碼中的其他問題,但它很難說你沒有擊中哪個問題堆棧跟蹤

您的員工表中是否有多行?看起來像是除非你所說的用戶名是你的SQL語句返回的第一個用戶名,那麼你會得到「不正確登錄」。難道你能更好地做

SELECT Login, Password from Staff where Login = UserName 

(不在您的上下文語法正確,但你的漂移......)

這樣,如果不;噸獲得一排,然後這是一個不正確的登錄,然後你只需要比較哈希值。

+0

就像我說的我有一個連接聲明,我只是把它留給隱私。 –