問題:char[]與String相比,有什麼優勝的地方? 回答: 針對安全保密高的信息,char[]比String做得更好。因為String是不可變得,即使你修改原先的變數,實際上也是在記憶體中新建一個對象,原數據還是保留在記憶體中,等待回收。而char[]中的元素是可以更改的。這就意味著,如密碼等保密 ...
問題:char[]與String相比,有什麼優勝的地方?
回答:
針對安全保密高的信息,char[]比String做得更好。因為String是不可變得,即使你修改原先的變數,實際上也是在記憶體中新建一個對象,原數據還是保留在記憶體中,等待回收。而char[]中的元素是可以更改的。這就意味著,如密碼等保密信息用完之後,你可以馬上修改它而不能痕跡。從而相對於String有更好的安全性。可從下麵例子中看出,char[]變更內容後,仍是那個對象。而String已經不是原來的String了。
引用:
這個對比,在知乎中這個貼有非常好的回答,我把它引用在下麵:
作者:知乎用戶
鏈接:https://www.zhihu.com/question/36734157/answer/68767786
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
原答案
=====================
圖裡說的很清楚,雖然String載入密碼之後可以把這個變數扔掉,但是字元串並不會馬上被GC回收,一但進程在GC執行到這個字元串之前被dump,dump出的的轉儲中就會含有這個明文的字元串。
那如果我去"修改"這個字元串,比如把它賦一個新值,那麼是不是就沒有這個問題了?
答案是否定的,因為String本身是不可修改的,任何基於String的修改函數都是返回一個新的字元串,原有的還會在記憶體里。
對於char[]來說,你可以在拋棄它之前直接修改掉它裡面的內容,密碼就不會存在了。但是如果你什麼也不做直接交給gc的話,也會存在上面一樣的問題。
有的大神說這個是毫無根據的扯淡
這些所謂的大神應該沒有什麼安全方面的常識,這非常普遍。
FAQ
======================
1. 這種做法意義有多大?
如果沒有及時清空而由GC來清除的話,暴露視窗大約是秒這個數量級,如果能夠在計算HASH後立即清除,暴露視窗大約是微秒數量級。如此簡單的設計就可以降低如此多的被攻擊概率,性價比是非常高的。
2. 如何使用反射來修改String? 和修改char[] 相比,有何區別和風險?
通過reflection機制可以查看String的內部的記憶體成員,從而可以直接修改其中的數據區。但是這樣的做法會有問題,內部化的String為了提高HASH速度,節省空間,值相同的字元串通常只有一個實例。
你自己的char[],修改它是沒有副作用的。但是String里的char[],很可能是多個String所共用的,你改掉它就會殃及別的String。舉個例子,有一個密碼是"Password",而你密碼框提示密碼輸入的文字也是"Password",改掉第一個"Password"會把後面那個也改掉。
3. 如果一點明文也不想出現,應該怎麼做?
為了保證"全部處理流程均無明文密碼",需要底層API在給你密碼之前就做了HASH,並且這個HASH演算法就是你想要的那種。最好還加鹽。不過這隻是在用戶程式方面無明文,底層獲取中會不會有明文就保證不了了。
4. 有沒有絕對安全策略?
安全往往是相對於攻擊成本而言的,攻擊收益越高,黑客就越能接受攻擊成本高的方案。因此,你採取的安全策略應該與這個攻擊收益相匹配。對於極其敏感和寶貴的數據來源,就需要在安全方面上下很大功夫。目前來看,沒有絕對的安全,只有相對的安全。