Java 使用字符数组代替字符串

Java 使用字符数组代替字符串,java,arrays,char,Java,Arrays,Char,我们有一个安全建议,在存储密码时使用字符数组而不是字符串,然后清除字符数组。但问题是,一些JAR接受字符串作为参数 例如,org.apache.http.auth.UsernamePasswordCredentials需要两个字符串参数;一个用于密码,一个用于用户名。现在,如何在不创建密码字符串的情况下调用此函数 httpClient.getCredentialsProvider().setCredentials( new AuthScope(AuthScope.

我们有一个安全建议,在存储密码时使用字符数组而不是字符串,然后清除字符数组。但问题是,一些JAR接受字符串作为参数

例如,org.apache.http.auth.UsernamePasswordCredentials需要两个字符串参数;一个用于密码,一个用于用户名。现在,如何在不创建密码字符串的情况下调用此函数

httpClient.getCredentialsProvider().setCredentials(
                new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),
                new UsernamePasswordCredentials(user.getUsername(), new String(user
                        .getPassword())));

我如何解决这个问题。有没有办法储存密码。我知道字符串是不可变的,不建议将密码存储在字符串中。那么,我可以做什么呢?

因此,安全建议将密码存储为字符数组的原因是,与数组不同,字符串是不可变的。这基本上意味着一旦您创建了字符串,它就在内存中,即使您重写了它,直到垃圾回收将其删除为止。这意味着另一个进程可以转储内存(在GC运行之前)并可能获取您的密码。另一方面,使用数组,您可以专门覆盖数组,而其他进程将无法获得它

使用数组,可以在使用完数据后显式擦除数据。您可以用任何您喜欢的内容覆盖数组,密码将不会出现在系统中的任何位置,甚至在垃圾收集之前

看了一下,
UsernamePasswordCredentials
只支持
字符串
。因此,我可能会根据您的安全建议将密码存储为字符数组,然后在调用此类时将其转换为字符串。然后,如果你有这种妄想症,一旦你完成了这个类,就处理它,并立即运行GC(这可能会增加你的内存使用)


此外,如果安全问题如此严重,那么管理员应该考虑其他替代方案,例如。

如果参数是字符串,那么您需要传递字符串,您要问的到底是什么?仅仅因为您必须将某些内容存储为字符数组并不意味着您可以在内存中将其转换为字符串或?忘记字符数组,访问:@Madhan,这回答了您的问题吗?如果有,请检查左侧的空复选标记。