1吏够、盡量使用https
https可以過(guò)濾掉大部分的安全問(wèn)題推正。https在證書申請(qǐng)顿颅,服務(wù)器配置缸濒,性能優(yōu)化,客戶端配置上都需要投入精力粱腻,所以缺乏安全意識(shí)的開發(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做了證書綁定校驗(yàn)鸦难。
5根吁、http請(qǐng)求都帶上MAC(消息認(rèn)證碼)
所有客戶端發(fā)出的請(qǐng)求员淫,無(wú)論是查詢還是寫操作,都帶上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證書的電子簽名方式卻不一樣哮针,原因是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ù)器才能解開這個(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)算拴驮。