JavaRush /Java Blog /Random-TW /Q&A:為什麼在 Java 中將密碼儲存在字元陣列中而不是字串中更好?

Q&A:為什麼在 Java 中將密碼儲存在字元陣列中而不是字串中更好?

在 Random-TW 群組發布
您很可能在 Java Junior 職位的面試中聽到這樣的問題。但我的朋友在面試技術主管職位時被問到了這個問題。
Q&A:為什麼在 Java 中將密碼儲存在字元陣列中而不是字串中更好? - 1
String和字元數組都可以用來儲存文字資料。但是,如果您還沒有遇到類似的情況,那麼有意識地為特定任務選擇其中之一是很困難的。然而,正如我的朋友指出的,任何與 相關的問題String,通常都涉及字串的一個特殊屬性,稱為不變性 ( Immutable),他在面試中利用了這一點。char []那麼,讓我們看看您應該使用而不是儲存密碼的幾個原因String

原因 1. 字串是不可變的

由於字串在 Java 中是不可變的,因此您的純文字密碼將在記憶體中可用,直到垃圾收集器將其清除。而且由於String它們是String pool重複使用的,因此密碼很有可能會長期保留在記憶體中,這根本不安全。
Java 字串池是位於一個特殊位置(堆)的物件(字串)池或集合。Java 中的字串是最常見的資料類型之一。這不是一個原始類型,而是一個對象,因為它非常消耗資源。因此,要儲存四個字元的字串,需要分配 56 位元組的記憶體。這就是為什麼字串像其他物件一樣儲存在堆上。
任何有權存取記憶體轉儲的人都可以找到純文字形式的密碼,這是使用加密密碼而不是純文字形式的一個很好的理由。由於字串是不可變的,因此它們的內容無法更改。任何變更都會建立一個新行。但在 的情況下char [],您可以將其任何元素替換為零或空字元。因此,將密碼儲存在字元陣列中可以明顯降低密碼被攔截的風險。

原因2. 作者的推薦

Java 本身(當然是透過它的創建者)建議使用getPassword ()返回. 您也可以嘗試已棄用的方法。為什麼不遵循語言作者的建議呢? JPasswordFieldchar []getText ()

原因3.打印

對於類型,String始終存在儲存在字串中的文字將列印在日誌檔案或控制台中的危險。同時,如果使用Array,則不會列印數組的內容,而只會列印其在記憶體中的位置。當然,這並不是一個嚴肅的理由,但也有其道理。
String strPassword = "Unknown";
char [] charPassword = new char [] {'U', 'n', 'k', 'w', 'o', 'n'};
System.out.println ("String password:" + strPassword);
System.out.println ("char password:" + charPassword);

String password: Unknown
Character password: [C@110b053
當然,使用char []Java來儲存密碼本身並不是萬能的。您需要採取安全預防措施,例如使用雜湊值和加密密碼,而不是以純文字形式儲存它們。當然,在身份驗證過程結束後立即將其從記憶體中刪除。 基於Javarevisited 的材料
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION