2015-09-30 22 views
1

雖然在Java中處理密碼,但我的理解是,它們應該始終在char []的處理中,以允許GC和刪除掛起的引用。Interning String.valueOf()

我的問題是會,

char[] password = String.valueOf(authentication.getCredentials()).toCharArray(); 

能authentication.getCredentials的值()被扣留與否?

+0

你從哪裏聽到這個「密碼應該總是被處理爲'char []'」? – Kayaman

+0

@Kayaman - 嗯。在java中他們應該。因爲如果一個猥瑣程序訪問字符串常量池的內存區域,那麼實例化字符串可能會導致問題。 ''char []'''''''''''''''''''''''''''''''''''''''在某種意義上說它更安全,我們只是不知道它代表什麼(字符串也可能是這種情況),並且很容易得到GCed – TheLostMind

+0

@Kayaman I guest read。 http://stackoverflow.com/questions/8881291/why-is-char-preferred-over-string-for-passwords-in-java – Vishrant

回答

1

String.valueOf()不實習字符串。在運行時實現字符串的唯一方法是使用password.intern() 沒有必要使用 char[]作爲密碼。 使用char[]可讓您在使用後直接清除陣列,縮小攻擊者的時間範圍以轉儲內存並檢索純文本密碼。

一個字符串本身對於GC來說並沒什麼特別之處。實習對此有一定的影響,但在常規使用中,您不會遇到任何與衆不同的事情。

+0

好的,謝謝@Kayaman。我從這個[post]中獲取了char [](http://stackoverflow.com/questions/12937641/handling-passwords-used-for-auth-in-source-code)。我也有一個理解,即所有在java中的字符串都是被實施的,但我現在認爲這只是字符串文字的情況? –

+1

@JacobCartledge - 字符串文字和顯式調用'intern()':) – TheLostMind

2

這不是實習String的問題,任何有關使用字符串存儲密碼的安全問題都是由於它們存在於內存中的時間長短造成的。

使用char數組,您可以在完成讀取內容後擦除內容。使用String(它是不可變的),您仍然依賴垃圾回收器,這意味着如果某人有權訪問您的服務器並轉儲內存,則可能會看到密碼。

+1

啊,所以這就是「使用char []'輸入密碼」的原因。 – Kayaman

+0

因此,char []的上述用法然後設置爲null會很好嗎? –

+1

@JacobCartledge不,將'char []'的內容清零或者其他任何事情都很重要。將它設置爲null會將它保留在內存中,等待GC拿起它(這正是'String'發生的情況)。 – Kayaman