【问题标题】:Is it a good practice to nullifying String in java [duplicate]在java中使String无效是一种好习惯吗[重复]
【发布时间】:2018-08-21 07:23:30
【问题描述】:

我在将纯密码作为字符串存储在内存中时遇到问题。根据参考资料,由于字符串是不可变的,因此存在使用字符串数据类型将敏感数据存储在内存中的漏洞。

https://www.geeksforgeeks.org/use-char-array-string-storing-passwords-java/

Why is char[] preferred over String for passwords?

我可以通过取消字符串变量而不是使用字符数组或字符串缓冲区/构建器来克服这个安全问题吗?

例如:字符串密码=“密码”; 密码=空;

【问题讨论】:

  • 你的密码应该是一个字符数组
  • 使用字节数组?
  • 您无法通过使字符串变量无效来解决该问题,因为它不会从字符串常量池中删除该字符串对象,您只是分配了空“密码”而不是从内存中删除实际密码..
  • 清空字符串肯定有助于解决内存泄漏问题,但字符串仍将存在于 Java 字符串池中,尽管您无法访问字符串池,因为它是由 java 私下维护的。最好使用字节数组或字符数组,并应用适当的加密,以防您想让事情变得更加安全。

标签: java string


【解决方案1】:

没有。取消一个字符串只会delink引用。但该值仍将存在于字符串池中。因为为了节省内存,字符串值会保留在字符串池中。

任何潜在的黑客都可以通过访问字符串池来检索值。

而使用 char[],您可以简单地将该对象视为任何其他对象。并且取消 char 对象将在垃圾收集时清除堆中的数据。

更好的选择是使用字节数组。

阅读更多关于String Constant pool的信息。

【讨论】:

  • 感谢您的回答。但我还有一个担心如果我们在无效后强行调用垃圾收集器,它会保留在内存中吗?
  • 是的。垃圾收集器在字符串池上的运行方式与在其他对象上的运行方式不同。更多了解请见stackoverflow.com/a/18407081/2458858
  • 但是只有当它是一个字面量或者它是intern()ed 时,这个值才会进入字符串池。它更多地是关于控制密码在内存中的生命周期。使用char[]的建议是正确的,但是使用后需要将char[]清空,设置为null是不够的。
【解决方案2】:

如果你想要绝对的安全,不。清空字符串不是正确的解决方案。

这样做的原因是,将其清空并不能保证 String 不再可用。尽管它可能使其更有可能被垃圾收集(这只是一个“可能”),但无法保证何时(或什至)它会被垃圾收集。

您应该使用字节数组或字符数组,然后在完成后将数组中的每个元素设为空。

【讨论】:

  • 虽然它可能使其更有可能被垃圾收集(这只是一个“可能”),但无法保证何时(或什至)它会被垃圾收集。 如果我们强制调用垃圾收集器无效后,它可以保留在内存中吗?
  • @Sudesh 你不能强制垃圾收集。 (System.gc() 只是暗示你想要一个 GC,不能保证它会做任何事情)。
猜你喜欢
  • 2019-03-11
  • 2012-08-14
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
相关资源
最近更新 更多