1、盡量使用https
https可以過(guò)濾掉大部分的安全問(wèn)題。https在證書(shū)申請(qǐng),服務(wù)器配置,性能優(yōu)化,客戶端配置上都需要投入精力,所以缺乏安全意識(shí)的開(kāi)發(fā)人員容易跳過(guò)https,或者拖到以后遇到問(wèn)題再優(yōu)化。https除了性能優(yōu)化麻煩一些以外其他都比想象中的簡(jiǎn)單,如果沒(méi)精力優(yōu)化性能,至少在注冊(cè)登錄模塊需要啟用https,這部分業(yè)務(wù)對(duì)性能要求比較低。
2、不要傳輸明文密碼
不知道現(xiàn)在還有多少app后臺(tái)是明文存儲(chǔ)密碼的。無(wú)論客戶端,server還是網(wǎng)絡(luò)傳輸都要避免明文密碼,要使用hash值。客戶端不要做任何密碼相關(guān)的存儲(chǔ),hash值也不行。存儲(chǔ)token進(jìn)行下一次的認(rèn)證,而且token需要設(shè)置有效期,使用refresh
token去申請(qǐng)新的token。
3、Post并不比Get安全
事實(shí)上,Post和Get一樣不安全,都是明文。參數(shù)放在QueryString或者Body沒(méi)任何安全上的差別。在Http的環(huán)境下,使用Post或者Get都需要做加密和簽名處理。
4、不要使用301跳轉(zhuǎn)
301跳轉(zhuǎn)很容易被Http劫持攻擊。移動(dòng)端http使用301比桌面端更危險(xiǎn),用戶看不到瀏覽器地址,無(wú)法察覺(jué)到被重定向到了其他地址。如果一定要使用,確保跳轉(zhuǎn)發(fā)生在https的環(huán)境下,而且https做了證書(shū)綁定校驗(yàn)。
5、http請(qǐng)求都帶上MAC
所有客戶端發(fā)出的請(qǐng)求,無(wú)論是查詢還是寫(xiě)操作,都帶上MAC(Message Authentication
Code)。MAC不但能保證請(qǐng)求沒(méi)有被篡改(Integrity),還能保證請(qǐng)求確實(shí)來(lái)自你的合法客戶端(Signing)。當(dāng)然前提是你客戶端的key沒(méi)有被泄漏,如何保證客戶端key的安全是另一個(gè)話題。MAC值的計(jì)算可以簡(jiǎn)單的處理為hash(request
params+key)。帶上MAC之后,服務(wù)器就可以過(guò)濾掉絕大部分的非法請(qǐng)求。MAC雖然帶有簽名的功能,和RSA證書(shū)的電子簽名方式卻不一樣,原因是MAC簽名和簽名驗(yàn)證使用的是同一個(gè)key,而RSA是使用私鑰簽名,公鑰驗(yàn)證,MAC的簽名并不具備法律效應(yīng)。
6、http請(qǐng)求使用臨時(shí)密鑰
高延遲的網(wǎng)絡(luò)環(huán)境下,不經(jīng)優(yōu)化https的體驗(yàn)確實(shí)會(huì)明顯不如http。在不具備https條件或?qū)W(wǎng)絡(luò)性能要求較高且缺乏https優(yōu)化經(jīng)驗(yàn)的場(chǎng)景下,http的流量也應(yīng)該使用AES進(jìn)行加密。AES的密鑰可以由客戶端來(lái)臨時(shí)生成,不過(guò)這個(gè)臨時(shí)的AES
key需要使用服務(wù)器的公鑰進(jìn)行加密,確保只有自己的服務(wù)器才能解開(kāi)這個(gè)請(qǐng)求的信息,當(dāng)然服務(wù)器的response也需要使用同樣的AES
key進(jìn)行加密。由于http的應(yīng)用場(chǎng)景都是由客戶端發(fā)起,服務(wù)器響應(yīng),所以這種由客戶端單方生成密鑰的方式可以一定程度上便捷的保證通信安全。
7、AES使用CBC模式
不要使用ECB模式,記得設(shè)置初始化向量,每個(gè)block加密之前要和上個(gè)block的秘文進(jìn)行運(yùn)算。
7.main()之前的過(guò)程有哪些?
1、main之前的加載過(guò)程
1)dyld 開(kāi)始將程序二進(jìn)制文件初始化
2)交由ImageLoader 讀取 image,其中包含了我們的類(lèi),方法等各種符號(hào)(Class、Protocol 、Selector、 IMP)
3)由于runtime 向dyld 綁定了回調(diào),當(dāng)image加載到內(nèi)存后,dyld會(huì)通知runtime進(jìn)行處理
4)runtime 接手后調(diào)用map_images做解析和處理
5)接下來(lái)load_images 中調(diào)用call_load_methods方法,遍歷所有加載進(jìn)來(lái)的Class,按繼承層次依次調(diào)用Class的+load和其他Category的+load方法
6)至此 所有的信息都被加載到內(nèi)存中
7)最后dyld調(diào)用真正的main函數(shù)