在Swing中,密码字段有一个getPassword()
(返回char[]
)方法,而不是通常的getText()
(返回String
)方法.类似地,我遇到一个建议不要使用String
来处理密码.
当涉及到口令时,为什么String
会对安全构成威胁?
使用char[]
感觉不方便.
在Swing中,密码字段有一个getPassword()
(返回char[]
)方法,而不是通常的getText()
(返回String
)方法.类似地,我遇到一个建议不要使用String
来处理密码.
当涉及到口令时,为什么String
会对安全构成威胁?
使用char[]
感觉不方便.
Strings are immutable.这意味着,一旦你创建了String
,如果另一个进程可以转储内存,那么在garbage collection启动之前,你就无法(除了reflection之外)清除数据.
使用数组,您可以在处理完数据后显式擦除数据.您可以使用您喜欢的任何内容覆盖数组,并且密码不会出现在系统中的任何位置,甚至在垃圾收集之前也不会出现.
因此,是的,这is是一个安全问题-但即使使用char[]
也只会减少攻击者的机会窗口,而且它只适用于这种特定类型的攻击.
正如注释中所指出的,垃圾收集器移动的数组可能会在内存中留下数据的散乱副本.我相信这是特定于实现的——垃圾收集器may会在运行时清除所有内存,以避免此类事情.即使是这样,仍然有一段时间,在这段时间里,char[]
包含实际的角色作为攻击窗口.