为什么密码的 char[] 优先于 String?

2022-08-31 01:22:00

在 Swing 中,密码字段具有 (返回 ) 方法,而不是通常的 (返回 ) 方法。同样,我遇到了一个建议,不要用于处理密码。getPassword()char[]getText()StringString

为什么在密码方面会对安全构成威胁?使用感觉不方便。Stringchar[]


答案 1

字符串是不可变的。这意味着一旦你创建了 ,如果另一个进程可以转储内存,你就没有办法(除了反射)在垃圾回收开始之前摆脱数据。String

使用数组,可以在完成数据后显式擦除数据。您可以使用您喜欢的任何内容覆盖数组,并且密码不会出现在系统中的任何位置,即使在垃圾回收之前也是如此。

所以,是的,这是一个安全问题 - 但即使使用也只会减少攻击者的机会之窗,而且仅适用于这种特定类型的攻击。char[]

如注释中所述,垃圾回收器移动的数组可能会在内存中留下数据的杂散副本。我相信这是特定于实现的 - 垃圾回收器可能会清除所有内存,以避免这种事情。即使确实如此,仍然有时间包含实际角色作为攻击窗口。char[]


答案 2

虽然这里的其他建议似乎有效,但还有另一个很好的理由。使用普通版,您有更高的机会意外地将密码打印到日志,监视器或其他一些不安全的地方。 不那么容易受到攻击。Stringchar[]

请考虑以下情况:

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