Java将敏感的“键”存储为字符串或char[]?

2022-09-04 21:14:44

可能的重复:
为什么密码的 char[] 优先于字符串?

我在某处读到,将敏感键存储为char[]而不是String更好,因为后者可以在内存中找到。这也有点意义,因为JPasswordField的getText()方法被弃用了。

这是真的吗?


答案 1

在 中使用完密码后,您始终可以使用0或随机值覆盖它。但是,你不能对对象这样做,因为它们在Java中是不可变的对象,并且字符串将保持活动状态,直到垃圾回收器启动并清除它。char[]String

这里有一个有趣的说明,http://docs.oracle.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html

在此示例中,我们提示用户输入密码,从中派生加密密钥。

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

因此,javax.crypto.spec.PBEKeySpec 类采用(并返回)密码作为 char 数组。


答案 2