2017-03-17 48 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'儘可能短暫地提供幫助。請注意,它似乎工作,但我需要更多的保證,這是不可能與此解決方案。 –

相關問題