我们有一个安全建议,在存储密码时使用char数组代替String,然后清除char数组。但是问题是,某些罐子接受string作为参数。
例如,org.apache.http.auth.UsernamePasswordCredentials需要两个字符串参数。一个用于密码,一个用于用户名。现在,如何在不创建密码字符串的情况下调用此函数
httpClient.getCredentialsProvider().setCredentials(
new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT),
new UsernamePasswordCredentials(user.getUsername(), new String(user
.getPassword())));
我该如何解决。有什么办法可以存储密码。我了解String是不可变的,因此不建议将密码存储在String中。那我能做些什么呢?
答案 0 :(得分:0)
安全建议将密码存储为字符数组的原因是,与数组不同,字符串是不可变的。这基本上意味着,一旦您创建了String,即使您重写了它,它也将保留在内存中,直到垃圾回收将其删除为止。这意味着另一个进程可以转储内存(在GC运行之前),并有可能获取您的密码。另一方面,使用Arrays可以专门覆盖该数组,没有其他进程可以获取它。
使用数组,您可以在处理完数据后显式擦除数据。您可以用任何您喜欢的东西覆盖阵列,并且即使在垃圾回收之前,密码也不会出现在系统中的任何位置。
看看org.apache.http.auth.UsernamePasswordCredentials,而UsernamePasswordCredentials
仅支持String
。因此,根据您的安全建议,我可能会将密码存储为char数组,然后在调用此类时将其转换为String。然后,如果您偏执,则在处理完该类后立即将其丢弃,然后立即运行GC(这可能会增加您的内存使用量)。
此外,如果安全性是一个非常严重的问题,那么您的管理员应该考虑其他替代方法,例如disabling core dumps。