为什么密码的 char[] 优先于 String?
在 Swing 中,密码字段具有 (返回 ) 方法,而不是通常的 (返回 ) 方法。同样,我遇到了一个建议,不要用于处理密码。getPassword()
char[]
getText()
String
String
为什么在密码方面会对安全构成威胁?使用感觉不方便。String
char[]
在 Swing 中,密码字段具有 (返回 ) 方法,而不是通常的 (返回 ) 方法。同样,我遇到了一个建议,不要用于处理密码。getPassword()
char[]
getText()
String
String
为什么在密码方面会对安全构成威胁?使用感觉不方便。String
char[]
字符串是不可变的。这意味着一旦你创建了 ,如果另一个进程可以转储内存,你就没有办法(除了反射)在垃圾回收开始之前摆脱数据。String
使用数组,可以在完成数据后显式擦除数据。您可以使用您喜欢的任何内容覆盖数组,并且密码不会出现在系统中的任何位置,即使在垃圾回收之前也是如此。
所以,是的,这是一个安全问题 - 但即使使用也只会减少攻击者的机会之窗,而且仅适用于这种特定类型的攻击。char[]
如注释中所述,垃圾回收器移动的数组可能会在内存中留下数据的杂散副本。我相信这是特定于实现的 - 垃圾回收器可能会清除所有内存,以避免这种事情。即使确实如此,仍然有时间包含实际角色作为攻击窗口。char[]
虽然这里的其他建议似乎有效,但还有另一个很好的理由。使用普通版,您有更高的机会意外地将密码打印到日志,监视器或其他一些不安全的地方。 不那么容易受到攻击。String
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