2013-07-26 36 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());