我在某处读到将敏感键存储为char []而不是String更好,因为后者可以在内存中找到。由于JPasswordField的getText()方法已被弃用,因此它也有一点意义。
这是真的吗?
答案 0 :(得分:9)
在char[]
中使用密码后,您始终可以使用0或随机值覆盖密码。但是,对于String
对象,你不能这样做,因为它们是Java中的不可变对象,并且字符串将保持活动状态,直到垃圾收集器启动并清除它。
以下是http://docs.oracle.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html
的有趣说明在此示例中,我们提示用户输入我们从中获取加密密钥的密码。
将密码收集并存储在java.lang.String类型的对象中似乎是合乎逻辑的。但是,这里有一点需要注意:String类型的对象是不可变的,即没有定义允许您在使用后更改(覆盖)或清零String内容的方法。此功能使String对象不适合存储安全敏感信息,如用户密码。您应该始终在char数组中收集和存储安全敏感信息。
因此,javax.crypto.spec.PBEKeySpec类将一个密码作为char数组(并返回)。