盡量使用https
https可以過(guò)濾掉大部分的安全問(wèn)題沃暗。https在證書(shū)申請(qǐng),服務(wù)器配置奏黑,性能優(yōu)化威兜,客戶(hù)端配置上都需要投入精力略水,所以缺乏安全意識(shí)的開(kāi)發(fā)人員容易跳過(guò)https郎汪,或者拖到以后遇到問(wèn)題再優(yōu)化赤赊。https除了性能優(yōu)化麻煩一些以外其他都比想象中的簡(jiǎn)單,如果沒(méi)精力優(yōu)化性能煞赢,至少在注冊(cè)登錄模塊需要啟用https,這部分業(yè)務(wù)對(duì)性能要求比較低哄孤。
不要傳輸明文密碼
不知道現(xiàn)在還有多少app后臺(tái)是明文存儲(chǔ)密碼的照筑。無(wú)論客戶(hù)端,server還是網(wǎng)絡(luò)傳輸都要避免明文密碼瘦陈,要使用hash值凝危。客戶(hù)端不要做任何密碼相關(guān)的存儲(chǔ)晨逝,hash值也不行蛾默。存儲(chǔ)token進(jìn)行下一次的認(rèn)證,而且token需要設(shè)置有效期捉貌,使用refresh
token去申請(qǐng)新的token支鸡。
Post并不比Get安全
事實(shí)上,Post和Get一樣不安全趁窃,都是明文牧挣。參數(shù)放在QueryString或者Body沒(méi)任何安全上的差別。在Http的環(huán)境下醒陆,使用Post或者Get都需要做加密和簽名處理瀑构。
不要使用301跳轉(zhuǎn)
301跳轉(zhuǎn)很容易被Http劫持攻擊。移動(dòng)端http使用301比桌面端更危險(xiǎn)刨摩,用戶(hù)看不到瀏覽器地址寺晌,無(wú)法察覺(jué)到被重定向到了其他地址世吨。如果一定要使用,確保跳轉(zhuǎn)發(fā)生在https的環(huán)境下呻征,而且https做了證書(shū)綁定校驗(yàn)另假。
http請(qǐng)求都帶上MAC
所有客戶(hù)端發(fā)出的請(qǐng)求,無(wú)論是查詢(xún)還是寫(xiě)操作怕犁,都帶上MAC(Message Authentication
Code)边篮。MAC不但能保證請(qǐng)求沒(méi)有被篡改(Integrity),還能保證請(qǐng)求確實(shí)來(lái)自你的合法客戶(hù)端(Signing)奏甫。當(dāng)然前提是你客戶(hù)端的key沒(méi)有被泄漏戈轿,如何保證客戶(hù)端key的安全是另一個(gè)話(huà)題。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)。
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的密鑰可以由客戶(hù)端來(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)景都是由客戶(hù)端發(fā)起,服務(wù)器響應(yīng)鹅巍,所以這種由客戶(hù)端單方生成密鑰的方式可以一定程度上便捷的保證通信安全千扶。
AES使用CBC模式
不要使用ECB模式,記得設(shè)置初始化向量昆著,每個(gè)block加密之前要和上個(gè)block的秘文進(jìn)行運(yùn)算县貌。