为什么 char\[\] 优于 String 作为密码?

新手上路,请多包涵

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 许可协议

阅读 589
2 个回答

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

使用数组,您可以在完成数据后显式擦除数据。你可以用任何你喜欢的东西覆盖数组,密码不会出现在系统的任何地方,甚至在垃圾收集之前。

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

如评论中所述,垃圾收集器移动的数组可能会在内存中留下数据的杂散副本。我相信这是特定于实现的——垃圾收集器 可能会 清除所有内存,以避免这种事情发生。即使是这样, char[] 仍然有时间包含实际字符作为攻击窗口。

原文由 Jon Skeet 发布,翻译遵循 CC BY-SA 3.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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题