【问题标题】:Clearing a char array of sensitive data from memory [duplicate]从内存中清除敏感数据的char数组[重复]
【发布时间】:2019-05-22 07:35:17
【问题描述】:

使用Arrays.fill(password, 0) 而不是使用password = null 将char 数组“清零”以使其不会留在内存中是否有不同的好处?我不是在问为什么使用 char 数组而不是 String。我在问为什么将值设置为 0 而不是将数组设置为 null。是不是因为将值设置为 0 会立即更改内存中的值,而 null 不会立即将内存中的值更改为 null,而只是等待它被垃圾回收?将值设置为 0 然后立即将其设置为 null 以便垃圾收集,而不是作为 0 的数组闲置,是否有意义?

【问题讨论】:

  • 在 GC 启动之前,将变量设置为 null 不会从内存中擦除对象。
  • 我本可以发誓之前有人问过这个问题,但我认为将数组清零比重新引用对象要好,因为您可以确定内存已更改并且不必等到垃圾收集完毕。
  • @shmosel 这就是我所指的问题,谢谢!
  • 我不是在问为什么要使用 char 数组而不是字符串。我在问为什么将值设置为 0 而不是将数组设置为 null。这些答案都没有阐明这种差异。
  • 你看到我的回答了吗?

标签: java arrays memory char


【解决方案1】:

不,无论每个字符的值是多少,数组仍然保留在内存中并因此消耗它。

定义对 null 的引用可能如果它是对该数组的最后一个引用,则会导致 GC 选举。

另一方面,如果您有安全问题,最好在释放引用之前重置每个字符。

你可以阅读更多关于Why is char[] preferred over String for passwords?

【讨论】:

  • 为了他人的利益:“可能”是这里的关键字。不保证会调用 GC。
  • @zeratul 在 Stackoverflow 上,您可以将 up-vote 提供给人们有用的答案以感谢他们,并从所有答案中选择 correct answer 中的任何一个。
猜你喜欢
  • 2015-09-11
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 2021-09-09
  • 2013-03-24
  • 2016-04-22
相关资源
最近更新 更多