为什么我们在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
数组可以清除所有密码信息。
上一篇: Why we read password from console in char array instead of String