In Swing, the password field has a getPassword()
(returns char[]
) method instead of the usual getText()
(returns String
) method.同样,我遇到了不要使用 String
处理密码的建议。
为什么 String
对密码安全构成威胁?感觉用起来不方便 char[]
。
原文由 Ahamed 发布,翻译遵循 CC BY-SA 4.0 许可协议
In Swing, the password field has a getPassword()
(returns char[]
) method instead of the usual getText()
(returns String
) method.同样,我遇到了不要使用 String
处理密码的建议。
为什么 String
对密码安全构成威胁?感觉用起来不方便 char[]
。
原文由 Ahamed 发布,翻译遵循 CC BY-SA 4.0 许可协议
虽然这里的其他建议似乎有效,但还有一个很好的理由。使用 plain 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
原文由 Konrad Garus 发布,翻译遵循 CC BY-SA 3.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
字符串是不可变的。这意味着一旦你创建了
String
,如果另一个进程可以转储内存,那么你就没有办法(除了 反射)在 垃圾收集 开始之前摆脱数据。使用数组,您可以在完成数据后显式擦除数据。你可以用任何你喜欢的东西覆盖数组,密码不会出现在系统的任何地方,甚至在垃圾收集之前。
所以,是的,这 是 一个安全问题 - 但即使使用
char[]
也只会减少攻击者的机会窗口,并且仅针对这种特定类型的攻击。如评论中所述,垃圾收集器移动的数组可能会在内存中留下数据的杂散副本。我相信这是特定于实现的——垃圾收集器 可能会 清除所有内存,以避免这种事情发生。即使是这样,
char[]
仍然有时间包含实际字符作为攻击窗口。