Java if语句

3

我正在尝试创建一个Swing登录系统,这个if语句有什么问题吗?谢谢:)

 public void login()
    {
           String username = loginField.getText();
           char[] password = loginPass.getPassword();
           if (username.equals("test") && password.equals("test"))
           {
                    System.out.println("logged in");
           }
    }

您的需求并不清晰,因此无法确定它是否以正确的方式工作。 - Amit S
永远不要在源代码中硬编码一些用户名/密码,即使是为了测试目的。从生产代码中删除这些凭据将被遗忘,结果是黑客可以使用默认登录。 - Michael Konietzka
你做了十七件与这个问题无关的事情。感谢您光顾StackOverflow。 - Erick Robertson
@Michael:如果有人想要在没有密码的情况下进入程序,他可以直接无需密码地进入应用程序。无论是硬编码还是其他方式。也许你应该看看逆向工程。如果我没记错的话,还可以看看“另一个Java反编译器”。 - Martijn Courteaux
@Michael:除非您加密了应用程序的某个部分。并且解密算法使用输入的密码... - Martijn Courteaux
@Martijn: 如果用户具有程序本身的访问权限或者以用户权限运行,则用户可以进行逆向工程。可能用户只是客户端,不使用自己的用户权限运行程序,因此他无法进行逆向工程。但是,在代码中编写密码永远都不是一个好选择。 - Michael Konietzka
5个回答

6

您可能需要

new String(password).equals("test")

相反,将数组与字符串进行比较没有太多意义。


1
如果使用字符串作为密码字段是个好主意,那么使用字符数组就没有必要了。 - Pete Kirkham
@Pete Kirkham:请解释一下,为什么字符串应该是一个不好的解决方案(除了答案只建议将数组转换进行检查之外)。 - Mnementh
@Mnementh 我知道的唯一情况是当你在数据库中存储哈希密码时:通常无法将它们转换为字符串。但这里不是这种情况。 - Nikita Rybak

2

是的,检查密码的部分有误。 password 是一个 char[] 数组。因此您必须更改检查密码的方式:

方法1:将其创建为字符串

if (new String(password).equals("test"))

方案二: 遍历数组并逐个字符检查:

public boolean checkPassword(char[] pass, String correctPass)
{
    if (pass.length != correctPass.length()) return false;

    for (int i = 0; i < pass.length; i++)
    {
        if (pass[i] != correctPass.charAt(i)) return false;
    }
    return true;
}

在你的if语句中

if (checkPassword(password, "test"))

您还应该将字符数组清零。 - Pete Kirkham
使用 Arrays.equals 会更简单。 - Nikita Rybak

1

是的。'password' 是一个数组 - 对它进行等于比较是一个引用比较。将其转换为字符串并对其进行 equals 比较。

编辑:看起来这是“正确”的方法:

private static boolean isPasswordCorrect(char[] input) {
    boolean isCorrect = true;
    char[] correctPassword = { 'b', 'u', 'g', 'a', 'b', 'o', 'o' };

    if (input.length != correctPassword.length) {
        isCorrect = false;
    } else {
        isCorrect = Arrays.equals (input, correctPassword);
    }

    //Zero out the password.
    Arrays.fill(correctPassword,'0');

    return isCorrect;
}

来自Java教程


@Pete - 给我点启示。那为什么是个坏主意呢? - javamonkey79
@Pete - 也许你可以发布你的解决方案。因为看起来这里的每个人都错了? :) - javamonkey79
@Pete - NM,我想我明白了。谢谢你的提醒。 - javamonkey79
因为String类型的对象是不可变的——在使用后字符串的内容无法被更改或覆盖。 - Michael Konietzka

1
password.equals("test")

始终会返回false,因为test作为字符串和password作为char[]是不同的类。它们永远不可能相等。

但是您可以使用{{link1:字符串的char[]表示}}并通过{{link2:boolean java.util.Arrays.equals(char[] a,char[] b)}}检查数组是否相等:

java.util.Arrays.equals(password,"test".toCharArray())

在现实生活中,您可能不会将密码作为字符串而是作为char[]。 然后当然您可以直接在Arrays#equals中使用它。


-1
char[]并不等同于String。尝试将其转换为String:
new String(password).equals("test")

如果使用字符串作为密码字段是个好主意,那么使用字符数组就没有必要了。 - Pete Kirkham
我建议只将字符数组转换为字符串,而不是更改输入字段。 - Mnementh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接