更新 - 2020-5-25
單純的隨機(jī)數(shù),同時(shí)也是偽隨機(jī)的,可能這個(gè)隨機(jī)因子不那么足夠。那么要依賴(lài)本機(jī)產(chǎn)生一個(gè)真隨機(jī),可以通過(guò)設(shè)備運(yùn)動(dòng)狀態(tài)、物理狀態(tài)垂直位移、水平位移、角度等,轉(zhuǎn)換成一個(gè)數(shù)值作為隨機(jī)因子,再與隨機(jī)數(shù)結(jié)合,提高隨機(jī)性。
前言:
一般app都支持本地記錄登錄狀態(tài),并支持離線的情況下加載用戶(hù)數(shù)據(jù),為了滿(mǎn)足這樣的場(chǎng)景,就需要把相關(guān)信息保存到本地。對(duì)于iOS持久化方面,無(wú)論使用userDefault、plist文件、歸檔、數(shù)據(jù)庫(kù)等存儲(chǔ)方式,都需要考慮一個(gè)問(wèn)題,如何安全的存儲(chǔ)數(shù)據(jù)?對(duì)于這個(gè)問(wèn)題,可以對(duì)數(shù)據(jù)加密保存,至于選擇哪種持久化方式,并不是那么重要。
加密方案
說(shuō)到對(duì)數(shù)據(jù)進(jìn)行加密,那么肯定是要有一套安全的加密方案才行。以下是一些方案例子:
A. 一些摘要算法或編碼處理。
B. 使用特定的秘鑰執(zhí)行某種對(duì)稱(chēng)加密。
C. 使用特定的公私鑰執(zhí)行某種非對(duì)稱(chēng)加密。
D. 某種自定義加密算法。
對(duì)于A,這只是一種把明文轉(zhuǎn)為非明文的一種方式。摘要算法不可逆,但數(shù)據(jù)無(wú)法還原,不符合需求。編碼處理,可以反編碼還原明文,實(shí)際上數(shù)據(jù)并沒(méi)有變得更安全,也是不符合需求。但采用編碼的方式,還是比直接使用明文要好那么一點(diǎn)點(diǎn)。
對(duì)于B.使用公開(kāi)的對(duì)稱(chēng)算法進(jìn)行加解密,只要保證秘鑰的安全,是可行的。
對(duì)于C.同B,但相對(duì)于對(duì)稱(chēng)加密,非對(duì)稱(chēng)加密效率較低,所以在保證秘鑰安全的前提下,選擇B,而不是選擇C。但C的安全系數(shù)會(huì)比B高。兩者都已經(jīng)滿(mǎn)足數(shù)據(jù)破解的成本超過(guò)其獲取的價(jià)值的要求。
對(duì)于D,自定義算法,就要具體分析了, 破解難度因算法本身設(shè)計(jì)有關(guān),但這個(gè)一般都是比較有實(shí)力的公司才這么搞吧,但一般都安全性比較高。是最好的方案之一,但其存在一定設(shè)計(jì)成本和測(cè)試成本。
從安全范圍的角度去考慮
到了這里,又面臨了一個(gè)秘鑰安全的問(wèn)題,一般來(lái)說(shuō),我們可能會(huì)把秘鑰硬編碼到代碼中,但我們的二進(jìn)制文件存在一個(gè)字符串常量區(qū),只要這個(gè)字符串在代碼中被引用了,那么編譯器就會(huì)把其寫(xiě)進(jìn)字符串常量區(qū)。如果這樣,稍微的分析下二進(jìn)制文件,就可能把秘鑰獲取。所以秘鑰硬編碼是比較危險(xiǎn)的。面對(duì)這個(gè)問(wèn)題,可以通過(guò)把秘鑰分拆成多個(gè)字符串,再通過(guò)某些處理生成真正的秘鑰,來(lái)提高安全性。這里會(huì)存在一個(gè)更值得思考的問(wèn)題,為了引出這個(gè)問(wèn)題,先回歸到方案的探索。
到目前為止討論到的都是本地怎么安全保存數(shù)據(jù),到如何安全保存秘鑰,都是圍繞著單體方案去考慮,而沒(méi)有從整體上去考慮。從安全范圍的角度去考慮,如果在每一個(gè)客戶(hù)端都是同樣的加密算法,同樣的秘鑰,那么只要其中一個(gè)被破解,整個(gè)大廈立馬倒塌。
為此,可以給安卓和蘋(píng)果分別分配不同的秘鑰,這樣就能把兩個(gè)平臺(tái),這塊的安全性隔離。既然有了這樣的想法,那么前進(jìn)一步,如果每個(gè)客戶(hù)端都擁有不同的秘鑰,并且是一種隨機(jī)秘鑰(隨機(jī)安全性更高,當(dāng)然可能偽隨機(jī),雖然偽隨機(jī)實(shí)際上是通過(guò)算法來(lái)生成的,有規(guī)律,但其破解難度很大),那么就能把這塊的安全性做到客戶(hù)端隔離。
最終選擇的方案:
使用AES對(duì)稱(chēng)加密算法;使用隨機(jī)算法生成本地秘鑰,秘鑰中添加時(shí)效性信息,并保存到keyChain中。
優(yōu)點(diǎn):客戶(hù)端隔離、對(duì)稱(chēng)加解密效率高,隨機(jī)秘鑰破解難度大。
缺點(diǎn):由于客戶(hù)端隔離,秘鑰都不一樣,數(shù)據(jù)無(wú)法統(tǒng)一分析,因此也影響了適用場(chǎng)景。
demo:LocalEncryptDemo