為什麼在密碼問題上char[]優先於String?

問題

在 中,密碼域( )用getPassword()函數(用來返回char[])取代getText()函數(返回字符串)。在工作中我得到類似的建議是不要用字符串去處理密碼相關的問題,為什麼涉及到密碼問題時字符串會對安全構成威脅呢?(譯註:這是提問者在Stackoverflow提了問題,他覺得用char[]處理密碼並沒有String方便,但為什麼還要推薦使用char[]處理呢?下面是幾個比較精彩的回答)。

回答1

String在Java中是不可變對象,這就意味著一旦創建了一個字符串,如果另一個進程把嘗試內存的數據導出(dump),在GC進行垃圾回收之前該字符串會一直保留在內存中,那麼該進程就可以輕易的讀取到該字符串。

而對於數組,可以在該數組處理它之後再顯示地擦掉數組中內容,可以以任何方式把數組內容覆蓋掉,即使是GC觸發前密碼也不會出現在系統的任何地方。

所以,這是從安全角度來選擇的,但是即便是用char[]也只是降低被攻擊的概率而已,還是會有一些特定的手法攻破數組處理的密碼。

回答2

從另一方面來,若是普通的字符串,有時你會不經意間打印密碼到日誌中或者其他不安全的地方,而char[] 就沒那麼顯而易見。

參考一下這段代碼:

為什麼在密碼問題上char[]優先於String?


輸出結果:

為什麼在密碼問題上char[]優先於String?


回答3

引用 , 說到char[] vs String。在對象java.lang.String中收集和存儲密碼看似符合邏輯,但是字符串對象是不可變的,沒有任何方法可以改變(重寫)或清空內容。這一特性使得字符串對象不適合存儲安全敏感信息,比如用戶密碼。你應當使用一個字符數組來代替,以便收集和存儲安全敏感的信息。 也提到了類似的問題。

回答4

字符數組(char[])在使用之後裡面的元素可以被清除,字符串並不如此。如果有人能以某種方式看到內存映像,如果字符串被使用了,它們可以以純文本方式看到密碼。但如果是char[], 看到的是清除後的數據(用0替換的數據),這種方式是安全的。

最後的思考

儘管使用char[]並不能保證足夠安全,但我也建議使用hash’d或者加密的密碼來代替普通的文本字符串密碼,而且使用完後立即清除。

為什麼在密碼問題上char[]優先於String?


分享到:


相關文章: