【问题标题】:Java storing sensitive 'key' as String or char[]? [duplicate]Java 将敏感的“密钥”存储为字符串或字符 []? [复制]
【发布时间】:2012-08-14 08:29:02
【问题描述】:

可能重复:
Why is char[] preferred over string for passwords?

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

这是真的吗?

【问题讨论】:

  • 仅供参考:String 将其内容存储为 char[]
  • @SoboLAN 是的,String 基本上是一个 char[] 内部,但是我们可以篡改声明为 char[] 的变量中保存的单个字符,而我们不能做任何事情来修改保存在一个String 对象,并且简单地将指向 String 的变量置空并不能保证它会被垃圾收集器删除。而且即使删除也不能保证String使用的内存很快就会被覆盖。
  • @user1515834 我的意思是说:如果您查看 RAM 内部,那么 Stringchar[] 看起来都一样。因为它们基本相同。对于黑客来说,这不会有太大的不同。至于char[] 内容的即时更改与垃圾收集String:是的,你是对的。

标签: java string security


【解决方案1】:

使用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 数组。

【讨论】:

  • 谢谢,你解释得很好!
猜你喜欢
  • 1970-01-01
  • 2018-06-05
  • 2010-11-26
  • 2020-07-15
  • 2019-08-15
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
相关资源
最近更新 更多