在Swing中,密码字段有一个getPassword()(returns char[])方法,而不是通常的getText()(return String)方法。同样,我也遇到了一个建议,不要使用String来处理密码。

为什么字符串对密码安全构成威胁?使用char[]感觉不方便。


当前回答

虽然这里的其他建议似乎有效,但还有一个很好的理由。使用纯字符串时,意外将密码打印到日志、监视器或其他不安全的地方的可能性要大得多。char[]不那么脆弱。

考虑一下:

public static void main(String[] args) {
    Object pw = "Password";
    System.out.println("String: " + pw);

    pw = "Password".toCharArray();
    System.out.println("Array: " + pw);
}

打印:

String: Password
Array: [C@5829428e

其他回答

大小写字符串:

    String password = "ill stay in StringPool after Death !!!";
    // some long code goes
    // ...Now I want to remove traces of password
    password = null;
    password = "";
    // above attempts wil change value of password
    // but the actual password can be traced from String pool through memory dump, if not garbage collected

案例CHAR阵列:

    char[] passArray = {'p','a','s','s','w','o','r','d'};
    // some long code goes
    // ...Now I want to remove traces of password
    for (int i=0; i<passArray.length;i++){
        passArray[i] = 'x';
    }
    // Now you ACTUALLY DESTROYED traces of password form memory

是否应该使用String或Char[]来实现这一目的是有争议的,因为两者都有各自的优点和缺点。这取决于用户需要什么。

由于Java中的字符串是不可变的,所以每当有人试图操纵字符串时,它会创建一个新的Object,而现有的字符串不会受到影响。这可以被视为将密码存储为字符串的一个优点,但即使在使用后,该对象仍保留在内存中。因此,如果有人以某种方式获得了对象的内存位置,那么此人可以很容易地跟踪存储在该位置的密码。

Char[]是可变的,但它的优点是在使用后,程序员可以显式地清理数组或重写值。因此,当它被使用后,它会被清理干净,没有人会知道你存储的信息。

基于以上情况,我们可以根据他们的需求来决定是使用String还是使用Char[]。

虽然这里的其他建议似乎有效,但还有一个很好的理由。使用纯字符串时,意外将密码打印到日志、监视器或其他不安全的地方的可能性要大得多。char[]不那么脆弱。

考虑一下:

public static void main(String[] args) {
    Object pw = "Password";
    System.out.println("String: " + pw);

    pw = "Password".toCharArray();
    System.out.println("Array: " + pw);
}

打印:

String: Password
Array: [C@5829428e

前面的很多答案都很好。还有一点我在假设(如果我错了,请纠正我)。

默认情况下,Java使用UTF-16存储字符串。使用字符数组、char[]数组,有助于使用Unicode、区域字符等。该技术允许所有字符集在存储密码时受到同等尊重,因此不会因字符集混淆而引发某些加密问题。最后,使用字符数组,我们可以将密码数组转换为所需的字符集字符串。

Java中的字符串是不可变的。因此,无论何时创建字符串,它都将保留在内存中,直到被垃圾收集。因此,任何访问内存的人都可以读取字符串的值。

如果字符串的值被修改,那么它将最终创建一个新字符串。因此,原始值和修改后的值都保留在内存中,直到被垃圾收集。

使用字符数组,一旦达到密码的目的,就可以修改或删除数组的内容。在修改数组之后,甚至在垃圾收集开始之前,都不会在内存中找到数组的原始内容。

出于安全考虑,最好将密码存储为字符数组。