繁体   English   中英

使用 char 数组而不是 String

[英]Using char array instead of String

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

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

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

我该如何解决这个问题。 有什么办法可以存储密码。 我了解 String 是不可变的,不建议将密码存储在 String 中。 那么我能做的替代方案是什么

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

使用数组,您可以在完成后显式擦除数据。 你可以用你喜欢的任何东西覆盖数组,密码不会出现在系统的任何地方,甚至在垃圾收集之前。

看看org.apache.http.auth.UsernamePasswordCredentialsUsernamePasswordCredentials只支持String 因此,我可能会根据您的安全建议将密码存储为字符数组,然后在调用此 class 时将其转换为字符串。 然后,如果您偏执,请在完成后处理 class 并立即运行 GC(这可能会占用您的 memory 使用量)。

此外,如果安全问题如此严重,那么您的管理员应该考虑其他替代方案,例如禁用核心转储

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM