为什么我们从char数组而不是字符串中的控制台读取密码

2022-09-02 03:56:02

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

当我准备时,我遇到了这个主题 - “从控制台读取用户输入”。OCPJP

有一个例子,它在引用中读取,而在数组中读取,但我不明白为什么它使用char数组。代码如下: -usernameStringpasswordchar[]

Console console = System.console();

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

这在我脑海中引起了怀疑。为什么我们没有使用字符串引用来存储密码。由于字符串是不可变的,因此读取字符串中的密码必须更安全,因为无法更改其内容。

那么,在数组中阅读的全部意义是什么。passwordchar[]

谁能对这件事有所了解?


答案 1

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

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


答案 2

来自 java.io.Console 的 Javadoc

安全说明:如果应用程序需要读取密码或其他安全数据,则应在处理后使用或并手动将返回的字符数组清零,以最大限度地缩短内存中敏感数据的生存期。readPassword()readPassword(String, Object...)

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

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


推荐