【问题标题】:Java String vs Character ArrayJava 字符串与字符数组
【发布时间】:2014-12-15 18:24:24
【问题描述】:

如果我在我的应用程序中处理密码,我绝对有必要使用 char 数组而不是 String 对象吗?如果我的应用程序配置为不写入日志或任何内容,并且最不希望出现内存转储,那么使用 String 对象是否过于轻率?

如果我可以使用 String 对象将是有益的,因为这样我就可以使用我无法使用的库 (jBCrypt)。

【问题讨论】:

  • ???为什么有必要?
  • @brso05 因为字符串是内部的,所以密码可能会保存在内存中。
  • 使用 char 数组,您可以立即将所有值设置为 0,并在完成所需的密码后销毁密码。使用字符串,您将把它留给系统在垃圾收集中处理它。
  • @IngoBürk 根据stackoverflow.com/questions/8881291/…,您可能想要使用char[] 而不是String 的原因不是因为字符串不会被GC'd,而是因为您可以手动加扰/擦除使用完字符数组,而字符串则必须等待GC。
  • 我不建议这样做System.gc()。它可能会大大降低您的程序速度,并且实际上并不能保证您的字符串会立即被 GC 处理。如果您真的害怕安全问题并且被字符串卡住了,我想您可以使用反射来擦除您正在使用的字符串的内容stackoverflow.com/questions/17151382/… 尽管请注意该问题的答案说如果有人可以首先读取您的记忆使用char[] 或清除字符串对您没有帮助

标签: java arrays string security char


【解决方案1】:

这取决于您希望应用程序具有多少安全性。在大多数情况下,我想你会很好地使用字符串。特别是如果您没有转储任何可能包含此字符串的输出。

但是,这确实会降低您的应用程序的安全性。有关更多信息,请参阅此帖子:Why is char[] preferred over String for passwords?

【讨论】:

  • 安全专家(我不是)可能会说:没有“安全性稍差”。只有安全和不安全。
  • @IngoBürk 真正的安全专家会知道它的梯度谱,因为世界上唯一安全的机器是在保险库中且未插入电源的机器。
  • @IngoBürk - 只要没有日志记录和内存转储,使用字符串是否安全?
猜你喜欢
  • 2011-02-16
  • 1970-01-01
  • 2018-08-10
  • 2012-04-20
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多