2017-03-17 74 views
1

在对我们的Swing应用程序进行审核之后,我们的用户的一些密码看起来在登录或超出后很长一段时间内仍保留在内存中。使用Apache HTTP客户端而不将字符串作为字符串传递?

其中一个原因似乎是Apache HttpClient的UsernamePasswordCredentials将密码存储为final String,阻止以编程方式将其从内存中擦除(请参阅Why is char[] preferred over String for passwords?)。

但是由于它实现的接口Credentials有一个String getPassword()方法,所以在某些时候似乎不可能避免转换为String

在这种情况下,是否有另一种方法可以避免将密码作为String传递?

我们正在使用HttpClient 4.0.3,但它似乎并没有在更新的版本中发生变化。

回答

0

阿帕奇说,与密码字符串初始化UsernamePasswordCredentials已被弃用

UsernamePasswordCredentials(String usernamePassword)
已过时。
(4.5)将与字符串来替换,炭[]在5.0

UsernamePasswordCredentials(String userName, String password)
与用户名和密码参数的构造函数。

https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/auth/UsernamePasswordCredentials.html

您使用的是最新版本的库?如果是这样,他们不会将密码存储为字符串,而是存储char []。

+0

我们没有使用最新版本,但版本5.0仍然是阿尔法。事实上,他们似乎会彻底改变声明在5中随处使用'char []',但现在并没有什么帮助。另外,我们正在使用的其他构造函数(尚)不会被弃用。 –

+0

我在想,如何子类化它,并重写getter返回一个新的字符串基于你的char []?您可以将一个空字符串传递给超级构造函数,并使该对象服务于您的char []。这样,保留的字符串实际上是空的 – Edd

+0

问题是,只要将它转换为String,就会复制'char []',并且您不能保证它何时会从记忆中消失。因此,这只是一种解决方法,可以通过将'String'尽可能短暂地提供帮助。请注意,它似乎工作,但我需要更多的保证,这是不可能与此解决方案。 –

相关问题