1. 程式人生 > >為什麽在密碼問題上char[]優先於String?(轉載自ImportNew)

為什麽在密碼問題上char[]優先於String?(轉載自ImportNew)

參考 java ecc 使用 .html lang ash net 收集

本文由 ImportNew - 範琦琦 翻譯自 stackoverflow。歡迎加入翻譯小組。轉載請見文末要求。

問題

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

回答1

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

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

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

回答2

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

參考一下這段代碼:

1 2 3 4 5 6 7 public static void main(String[] args) { Object pw = "Password";
System.out.println("String: " + pw); pw = "Password".toCharArray(); System.out.println("Array: " + pw); }

輸出結果:

1 String: PasswordArray: [C@5829428e

回答3

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

回答4

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

最後的思考

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

你還可以參考為什麽存儲密碼字符數組比字符串更合適?

原文鏈接: stackoverflow 翻譯: ImportNew.com - 範琦琦
譯文鏈接: http://www.importnew.com/10281.html
[ 轉載請保留原文出處、譯者和譯文鏈接。]

為什麽在密碼問題上char[]優先於String?(轉載自ImportNew)