【发布时间】:2015-07-31 16:51:03
【问题描述】:
在这里查看 Fortify 的一些发现,它告诉我不要将字符串数据类型用于敏感数据,因为它们可能会在内存中停留太久。如果发生不相关的内存攻击(例如 Heartbleed),这会暴露用户的数据。
如果我在使用后将字符串 var 设置为 null,该内存位置是否真的被清除了,或者是为存储 null 而创建的 var 的副本?
谢谢
【问题讨论】:
在这里查看 Fortify 的一些发现,它告诉我不要将字符串数据类型用于敏感数据,因为它们可能会在内存中停留太久。如果发生不相关的内存攻击(例如 Heartbleed),这会暴露用户的数据。
如果我在使用后将字符串 var 设置为 null,该内存位置是否真的被清除了,或者是为存储 null 而创建的 var 的副本?
谢谢
【问题讨论】:
我认为你问错了问题。
如果您将变量设置为 null,那么可以肯定,该引用指向 null。原始值可以被垃圾回收。
问题是字符串比这要复杂一些。您应该问的问题是为什么字符串可以留在内存中?
一个答案是字符串文字池。 Google 是您的朋友,但这是一个不错的开始:
What is the Java string pool and how is “s” different from new String(“s”)?
【讨论】:
如果您将String 引用设置为null,则它可能不会从实际内存中删除,并且可能可供潜在的黑客使用。
您可以使用Char[] 并将其设置为空/无效字符以避免此问题,而且最好将sensitive 数据保持为encrypted 格式。
【讨论】: