13

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

我在某处读到,将敏感密钥存储为 char[] 而不是 String 更好,因为后者可以在内存中找到。由于不推荐使用 JPasswordField 的 getText() 方法,这也有点道理。

这是真的?

4

1 回答 1

14

一旦你在 a 中使用完密码,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 数组。

于 2012-08-17T21:39:40.840 回答