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

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

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

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肉三

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值