1. 程式人生 > >每天一道Java題[1]

每天一道Java題[1]

就會 p s 提高 清除 轉儲 處理 攻擊 大神 如何使用

問題: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. 有沒有絕對安全策略?

安全往往是相對於攻擊成本而言的,攻擊收益越高,黑客就越能接受攻擊成本高的方案。因此,你采取的安全策略應該與這個攻擊收益相匹配。對於極其敏感和寶貴的數據來源,就需要在安全方面上下很大功夫。目前來看,沒有絕對的安全,只有相對的安全。

每天一道Java題[1]