一脊岳、簡(jiǎn)述
安全是恒久的話題逝段,如果不注意防范,會(huì)帶來(lái)很嚴(yán)重的后果割捅。比如:
1.接口被大規(guī)模調(diào)用消耗系統(tǒng)資源奶躯,影響系統(tǒng)的正常訪問,甚至系統(tǒng)癱瘓
2.數(shù)據(jù)泄露
3.偽造(篡改)數(shù)據(jù)亿驾,制造垃圾數(shù)據(jù)
4.App被仿制…
那么我們?cè)O(shè)計(jì)API時(shí)嘹黔,就要保證RESTful API的安全性,主要包括三大方面:
a) 對(duì)受限資源的登錄授權(quán)
b) 對(duì)請(qǐng)求做身份認(rèn)證莫瞬,并且防止篡改儡蔓,重放攻擊
c) 對(duì)敏感的數(shù)據(jù)做加密
二醉锄、受限資源的登錄授權(quán)
此流程不是本文重點(diǎn),不贅述浙值,基本流程如下:
1. 客戶端提交賬號(hào)信息(用戶名+密碼)到服務(wù)端
2.? 服務(wù)端驗(yàn)證成功恳不,返回AccessToken給客戶端存儲(chǔ)
3.訪問受限資源時(shí),客戶端帶入AccessToken就可訪問开呐。
三烟勋、請(qǐng)求認(rèn)證
如果不對(duì)請(qǐng)求進(jìn)行簽名認(rèn)證,那么可以簡(jiǎn)單的通過fiddler等工具輕易抓包拿到數(shù)據(jù)筐付,并進(jìn)行篡改卵惦,提交,大規(guī)模批量調(diào)用瓦戚,則會(huì)使系統(tǒng)產(chǎn)生大量垃圾數(shù)據(jù)沮尿,系統(tǒng)資源被大量消耗,甚至無(wú)法正常使用(另說(shuō)较解,當(dāng)然可以通過GateWay進(jìn)行限流)畜疾,因而我們需要對(duì)請(qǐng)求進(jìn)行簽名認(rèn)證。
URL格式
URL:schema://domain/path?query&imei×tamp&sign
簽名方法
sign=signature(path?query&imei&timetamp&SIGN_KEY)
認(rèn)證邏輯
1印衔、初始時(shí)啡捶,服務(wù)端存有各App版本的SIGN_KEY,客戶端存有對(duì)應(yīng)版本的SIGN_KEY
2奸焙、當(dāng)要發(fā)送請(qǐng)求之前瞎暑,通過簽名方法加密,得到一個(gè)sign
3与帆、發(fā)送請(qǐng)求的時(shí)候了赌,連同sign一起發(fā)送給服務(wù)器端
4、服務(wù)器端首先驗(yàn)證時(shí)間戳timestamp是否有效玄糟,比如是服務(wù)器時(shí)間戳5分鐘之前的請(qǐng)求視為無(wú)效勿她;
5、然后取對(duì)應(yīng)版本的SIGN_KEY驗(yàn)證sign是否合法
6茶凳、為了防止重放攻擊嫂拴,需要檢查sign是否在redis中存儲(chǔ)播揪,如不存在則存入redis(緩存5分鐘)
如何防止數(shù)據(jù)篡改
這里通過簽名參數(shù)中包含原有請(qǐng)求的所有參數(shù)贮喧,改動(dòng)任意參數(shù),sign值都會(huì)不同猪狈,因此無(wú)法篡改箱沦。
如何防止重放攻擊
由于簽名算法中還有imei(設(shè)備唯一Id)、timestamp參數(shù)雇庙,且簽名算法為不可逆算法(如md5或sha1)谓形,因而對(duì)于正常的每個(gè)請(qǐng)求sign值不會(huì)重復(fù)灶伊。此時(shí)服務(wù)端可以存儲(chǔ)5分鐘的sign值,來(lái)做重放攻擊時(shí)的驗(yàn)證過濾寒跳,超過5分鐘的請(qǐng)求則直接被timestamp校驗(yàn)過濾聘萨。
總結(jié)
如此便實(shí)現(xiàn)了請(qǐng)求認(rèn)證,防止數(shù)據(jù)篡改童太,重放攻擊米辐,但是需要確保App密鑰(SIGN_KEY)的安全保存,其優(yōu)點(diǎn)是容易理解與實(shí)現(xiàn)书释,缺點(diǎn)是需要承擔(dān)安全保存密鑰和定期更新密鑰的負(fù)擔(dān)翘贮。
四、敏感據(jù)加密
1)爆惧、部署SSL基礎(chǔ)設(shè)施(即HTTPS)狸页,敏感數(shù)據(jù)的傳輸全部基于SSL。
2)扯再、僅對(duì)部分敏感數(shù)據(jù)做加密(例如賬號(hào)+密碼)芍耘,并加入某種隨機(jī)數(shù)作為加密鹽,以防范數(shù)據(jù)被篡改熄阻。