為什麼存儲密碼字元數組比字元串更合適?
(點擊
上方公眾號
,可快速關注)
來源:ImportNew - 劉志軍
「為什麼存儲密碼用字元數組比字元串更合適」這個問題是我的一個朋友在最近一次面試中提到的。那哥們應聘的是一個技術lead職位,有超過六年的工作經驗。字元數組和字元串都可以用於存儲文本數據,但是在選擇具體哪一種時,如果你沒有針對具體的情況是很難回答這個問題的。但是正如這哥們說的任何與字元串相關的問題一定可以從字元串的屬性裡面的線索中找到,比如不可變性。他就用這種方式去說服面試官的。這裡我們就來探討一些關於為什麼你應該使用char[] 來存儲密碼而不是字元串。
1. 因為字元串是不可變對象,如果作為普通文本存儲密碼,那麼它會一直存在內存中直至被垃圾收集器回收。因為字元串從字元串池中取出的(如果池中有該字元串就直接從池中獲取,否則new 一個出來,然後把它放入池中),這樣有很大的機會長期保留在內存中,這樣會引發安全問題。因為任何可以訪問內存的人能以明碼的方式把密碼dump出來。另外你還應該始終以加密而不是普通的文本來表示密碼。因為字元串是不可變,因此沒有任何方法可以改變其內容,任何改變都將產生一個新的字元串,而如果使用char[],你就可以設置所有的元素為空或者為零(這裡作者的意思是說,讓認證完後該數組不再使用了,就可以用零或者null覆蓋原來的密碼,防止別人從內存中dump出來)。所以存儲密碼用字元數組可以明顯的減輕密碼被盜的危險。
2. Java官方本身也推薦字元數組,JpasswordField的方法getPassword()就是返回一個字元數組,而由於安全原因getText()方法是被廢棄掉的,因為它返回一個純文本字元串。跟隨Java 團隊的步伐吧,沒有錯。
3. 字元串以普通文本列印在在log文件或控制台中也易引起危險,但是如果使用數組你不能列印數組的內容,而是它的內存地址。儘管這不是它的真正原因,但仍值得注意。
String strPassword="Unknown";
char[] charPassword= new char[]{"U","n","k","w","o","n"};
System.out.println("String password: " + strPassword);
System.out.println("Character password: " + charPassword);
String password: Unknown
Character password: [C@110b053
以上所有就是為什麼字元數組比字元串保存密碼要好的原因,儘管使用char[]還不足以安全。我同樣建議你用hash或者密碼加密代替普通文本,而且一旦認證完成儘可能快的把他清除掉。
看完本文有收穫?請轉發分享給更多人
關注「ImportNew」,提升Java技能
TAG:ImportNew |