2013-07-26 66 views
0

我想使用此動作偵聽器方法檢查用戶名和密碼 但我總是得到錯誤的密碼!使用散列映射進行密碼檢查

public void actionPerformed(ActionEvent arg0) { 
    String uN = usernameFiled.getText(); 
    String pass = passwordField.getPassword().toString(); 
    // 

    if (uN.isEmpty() || pass.isEmpty()){ 
      JOptionPane.showMessageDialog(LoginPage.this, "Fields should not be empty!", "Error", JOptionPane.ERROR_MESSAGE); 
      return; 
    } 



    HashMap<String, User> users = UserDAO.getInstance().getUsers(); 

    User temp = users.get(uN); 

    if (temp.getPassword().equals(pass)){ 
      JOptionPane.showMessageDialog(LoginPage.this, "Login successfull", "Success", JOptionPane.INFORMATION_MESSAGE); 

    } 

    else { 
      JOptionPane.showMessageDialog(LoginPage.this, "Wrong username or password", "Error ", JOptionPane.ERROR_MESSAGE); 
    } 
    } 
}); 

代碼的問題是什麼?

+0

首先,你似乎是採用明文存儲的密碼......除此之外,它很難肯定地說 - 您執行了哪些診斷? –

+0

「User#getPassword」實際返回的是什麼?不要忘記它的(正確)大小寫敏感。不要使用'passwordField.getPassword()。toString()'這是一個安全風險。密碼比較應該使用某種散列算法,而不是 – MadProgrammer

回答

0

JPasswordField#getPassword返回char[]此TextComponent中包含的文本。 char[].toString()不返回字符串值,array.toString實際上返回變量和hascode的名稱。

你應該叫new String(passwordField.getPassword())String.valueOf(passwordField.getPassword())

嘗試 -

String pass = new String(passwordField.getPassword()); 

String pass = String.valueOf(passwordField.getPassword()); 
+0

我會試圖對此投票,除非它引入安全漏洞 – MadProgrammer

+0

什麼是安全漏洞,請你解釋一下嗎? –

+0

通過將密碼從char []轉換爲字符串,該字符串在JRE中(在JRE運行時)被執行,您可以讓某人檢查內存並找到明確的密碼文本。這就是爲什麼'getPassword'方法存在 – MadProgrammer

0

passwordField.getPassword() return char[]。所以通過調用toString()給你的對象字符串char[].So,你正在使用的語句,不要給你密碼。

String pass = passwordField.getPassword().toString(); 

以下列方式使用它。

String pass = new String(passwordField.getPassword());