1月4日云栖精选夜读:阿里工程师如何
630 2023-04-03 03:04:52
本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>
提问:为什么密码比字符串更喜欢char []?
在Swing中,密码字段具有getPassword()(returns char[])的方法,而不是通常的getText()(returns String)方法。同样,我也收到了不使用String密码的建议。
为什么String涉及密码安全性受到威胁?使用字符数组看起来感觉很不方便。
热门回答:字符串是不可变的。这意味着一旦创建了String,如果另一个进程此时转储内存(惊了,这竟然真的是专有名词,其实就是将内存中的数据写入到磁盘中,并发环境下多个进程之间切换时,将上一个进程的内存写入磁盘,并将新进程所需的数据从磁盘中装载到内存上,实现出一个虚拟内存的效果),则此时除了反射之外,您将无法清除数据,并进行垃圾回收。
使用数组,您可以在使用完数据后显式擦除数据。您可以使用任意内容覆盖数组,即使在垃圾回收之前(擦除数据后),密码也不会在系统中的任何位置出现。
因此,是的,这是一个安全性问题-但是即使使用,char[]也只会减少攻击者的机会窗口,并且仅适用于这种特定类型的攻击。
如评论中所述,垃圾回收器可能会将数据的零散副本保留在内存中。我相信,为了避免这种情况的发生,在该类场景下,一定会有特殊实现的垃圾收集器——他们工作时会清除所有内存。但即使这样做,字符数组仍然有一段时间是正存储着密码,此刻程序遭受攻击依旧会造成密码泄露。