为什么我们在char数组而不是String中从控制台读取密码?

可能重复:
为什么char []优先于字符串的密码?

当我准备OCPJP我来到了主题 - “从控制台读取用户输入”。

有一个例子,它在String引用中读取username ,而在char[]数组中使用password ,但我无法理解它为什么使用char数组。下面是代码: -

Console console = System.console();

String username = console.readLine("User Name? ");
char[] password = console.readPassword("Password? "); 

这在我心中引起了怀疑。为什么我们没有使用String引用来存储密码。 由于Strings不可变的,所以它必须更安全地读取字符串中的密码,因为其内容不能改变。

那么,在char[]数组中读取password意义何在?

任何人都可以在这个问题上谈一谈?


正如你所说的,字符串是不可变的,这意味着一旦创建了字符串,如果另一个进程可以转储内存,就没有办法(可以用反射)在GC启动之前就可以清除数据。

使用数组,您可以在完成数据后显式清除数据:您可以使用任何您喜欢的任何方式覆盖数组,并且即使在垃圾收集之前密码也不会出现在系统的任何位置。


从java.io.Console的Javadoc:

安全注意事项 :如果应用程序需要读取密码或其他安全数据,则应使用readPassword()readPassword(String, Object...)并在处理后手动清零返回的字符数组,以尽量减少内存中敏感数据的生存期。

这只是为了防止其他应用程序(如键盘记录等)访问密码。

此外,如果您使用String ,由于它们是不可变的,所以修改它们会在内存中创建副本。 在这种情况下使用char[]会节省你。 由于它们是可变的,因此它们不会创建副本,并且可以在处理后将它们设为空。


由于字符串是不可变的,当应用程序处于活动状态时,它们不能被覆盖并保留在内存中。 另一方面, char数组可以清除所有密码信息。

链接地址: http://www.djcxy.com/p/17881.html

上一篇: Why we read password from console in char array instead of String

下一篇: Salted password hashes