为什么使用 char[] 而不是 String 作为密码存储的类型?

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

为什么String说密码会有安全隐患呢?感觉用起来很不方便char[]

将密码收集并存储在 类型的对象中似乎合乎逻辑java.lang.String。但是,这里有一个警告:Object类型的String是不可变的,即没有定义允许您在String 使用后更改(覆盖)或将 的内容清零的方法。此功能使String对象不适合存储安全敏感信息(例如用户密码)。您应该始终在数组中收集和存储安全敏感信息 char

String是不可变的。这意味着,一旦创建了String,如果另一个进程可以转储内存,则除了反射之外,在垃圾回收启动之前删除数据。

使用数组,您可以在使用完数据后明确擦除数据。您可以用任何内容覆盖数组,并且密码不会出现在系统的任何地方,甚至在垃圾回收之前也不会出现。

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

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

你可能感兴趣的:(Java,java,开发语言)