在Swing中,密码字段有一个getPassword()
(返回char[]
)方法,而不是通常的getText()
(返回String
)方法。同样,我曾经遇到过一种建议,即不要使用String
来处理密码。
为什么String
在涉及到密码时会对安全造成威胁?
使用char[]
感觉不方便。
字符串是不可变的。这意味着一旦你创建了String
,如果另一个进程可以转储内存,除了反射(参考维基百科:反射_(计算机编程)),否则没有办法在垃圾回收(参考维基百科:垃圾回收_(计算机科学))开始之前清除数据。
使用数组时,你可以在完成操作后显式地擦除数据。你可以用你喜欢的任何内容覆盖数组,密码将不会存在于系统中,即使在垃圾回收之前也是如此。
所以是的,这确实是一个安全问题 - 但即使只使用char[]
也只能缩小攻击者的机会窗口,而且只针对这种特定类型的攻击。
正如评论中指出的,由于垃圾回收器移动数组可能会导致内存中留下数据副本的可能性。我认为这是实现特定的 - 垃圾回收器可能在所有内存被清除以避免这种情况的情况下清除所有内存。即使它这样做了,仍然有char[]
包含实际字符作为攻击窗口的时间。