问题

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

为什么 String 对密码造成安全威胁? 使用 char [] 感觉不方便.



解决方法

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

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

是的,这是一个安全问题 - 但即使使用 char [] 只会减少攻击者的机会窗口,而且只有这种特定类型攻击.

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




相关问题推荐