2015-09-30 23 views
1

虽然在Java中处理密码,但我的理解是,它们应该始终在char []的处理中,以允许GC和删除挂起的引用。Interning String.valueOf()

我的问题是会,

char[] password = String.valueOf(authentication.getCredentials()).toCharArray(); 

能authentication.getCredentials的值()被扣留与否?

+0

你从哪里听到这个“密码应该总是被处理为'char []'”? – Kayaman

+0

@Kayaman - 嗯。在java中他们应该。因为如果一个猥琐程序访问字符串常量池的内存区域,那么实例化字符串可能会导致问题。 ''char []'''''''''''''''''''''''''''''''''''''''在某种意义上说它更安全,我们只是不知道它代表什么(字符串也可能是这种情况),并且很容易得到GCed – TheLostMind

+0

@Kayaman I guest read。 http://stackoverflow.com/questions/8881291/why-is-char-preferred-over-string-for-passwords-in-java – Vishrant

回答

1

String.valueOf()不实习字符串。在运行时实现字符串的唯一方法是使用password.intern() 没有必要使用 char[]作为密码。 使用char[]可让您在使用后直接清除阵列,缩小攻击者的时间范围以转储内存并检索纯文本密码。

一个字符串本身对于GC来说并没什么特别之处。实习对此有一定的影响,但在常规使用中,您不会遇到任何与众不同的事情。

+0

好的,谢谢@Kayaman。我从这个[post]中获取了char [](http://stackoverflow.com/questions/12937641/handling-passwords-used-for-auth-in-source-code)。我也有一个理解,即所有在java中的字符串都是被实施的,但我现在认为这只是字符串文字的情况? –

+1

@JacobCartledge - 字符串文字和显式调用'intern()':) – TheLostMind

2

这不是实习String的问题,任何有关使用字符串存储密码的安全问题都是由于它们存在于内存中的时间长短造成的。

使用char数组,您可以在完成读取内容后擦除内容。使用String(它是不可变的),您仍然依赖垃圾回收器,这意味着如果某人有权访问您的服务器并转储内存,则可能会看到密码。

+1

啊,所以这就是“使用char []'输入密码”的原因。 – Kayaman

+0

因此,char []的上述用法然后设置为null会很好吗? –

+1

@JacobCartledge不,将'char []'的内容清零或者其他任何事情都很重要。将它设置为null会将它保留在内存中,等待GC拿起它(这正是'String'发生的情况)。 – Kayaman