Assign null to string var to remove sensitive data
通过这里的一些强化发现,它告诉我不要对敏感数据使用字符串数据类型,因为它们在内存中的停留时间太长。如果发生不相关的内存攻击(如心血),这将暴露用户的数据。
如果我在使用后将字符串var设置为空,那么该内存位置实际上是被清除了,还是创建了一个var副本来存储空值?
谢谢
我认为你问错了问题。
如果您将变量设置为空,那么当然,该引用指向空。原始值可以被垃圾收集。
问题是字符串比这要复杂一些。你应该问的问题是,为什么弦能留在记忆中?
对此的一个答案是字符串文本池。谷歌是你的朋友,但这是一个不错的开端:
什么是Java字符串池,"S"如何与新字符串("S")不同?
何时用Java垃圾回收字符串
字符串文本的垃圾收集
- 因此,在阅读了所有这些内容之后,听起来最好的方法是fortify和@k139的建议——使用char[],完成后将其设为空。
- @如果你担心有人会遇到读取程序内存的麻烦,是什么阻止他们简单地读取字符数组?
- 我不认为防御是100%准确的,但逻辑是这样的。如果我用敏感数据加载char[],我可以在使用后立即擦除它,并且数据不再在内存中。像HeartBleed这样的攻击依赖于内存中足够长的数据来被漏洞代码读取。使用char[]并不能完全缓解Vuln,但是如果内存中的时间从x分钟数减少到x毫秒数,那么可能性会显著降低。
- 而且我有更少的噪音来巩固每次发布的发现。-D
- 另一方面,您的同事将继承和维护奇数代码。一切都有代价。
如果您将String引用设置为空,那么它可能无法从实际内存中删除,并且可能对潜在的黑客可用。
您可以使用Char[]并将其设置为空/无效字符以避免此问题,而且最好始终将sensitive数据保持为encrypted格式。
- 同意,加密是最好的,但在某种程度上,它必须是明文才能使用。