請(qǐng)求安全性: 服務(wù)器端在接收到請(qǐng)求的時(shí)候,要主動(dòng)鑒別該請(qǐng)求是否有效刀闷,是否可接受熊泵。
token:已登陸用戶的識(shí)別碼
解決的問(wèn)題:用戶調(diào)用接口時(shí),不用每次都帶上用戶名和密碼甸昏,避免了頻繁在網(wǎng)絡(luò)中傳輸密碼被截獲的風(fēng)險(xiǎn)顽分。
使用場(chǎng)景:用戶登錄系統(tǒng)時(shí)傳入用戶名和密碼,服務(wù)器校驗(yàn)成功之后筒扒,根據(jù)uuid等參數(shù)生成token返回給客戶端怯邪,同時(shí)把該token和該用戶的對(duì)應(yīng)關(guān)系緩存在服務(wù)器端』ǘ眨客戶端在后續(xù)的請(qǐng)求接口中不用每次都傳入用戶名和密碼悬秉,只需要傳入token即可。服務(wù)器會(huì)根據(jù)token確定客戶端的身份冰蘑。
注意:token可設(shè)置生效時(shí)間和泌,token失效之后,客戶端重新請(qǐng)求token祠肥。
sign:請(qǐng)求參數(shù)的簽名
解決問(wèn)題:避免請(qǐng)求參數(shù)被惡意修改武氓。保證了請(qǐng)求數(shù)據(jù)的一致性。
使用場(chǎng)景:客戶端和服務(wù)端約定一個(gè)簽名生成算法仇箱∠厮。客戶端在請(qǐng)求接口之前調(diào)用簽名算法,根據(jù)參數(shù)生成sign值剂桥。然后把sign和請(qǐng)求參數(shù)一并傳給服務(wù)器忠烛。
服務(wù)器收到到參數(shù)和簽名之后,根據(jù)請(qǐng)求參數(shù)权逗,調(diào)用簽名算法計(jì)算出簽名美尸,然后比較該簽名和客戶端傳過(guò)來(lái)的簽名是否一致,如果一致斟薇,則說(shuō)明請(qǐng)求參數(shù)未被修改過(guò)师坎,如果不一致,則說(shuō)明請(qǐng)求參數(shù)被修改過(guò)堪滨。
nonce:請(qǐng)求中附帶的隨機(jī)數(shù)
解決問(wèn)題:防止惡意程序重復(fù)向服務(wù)器重復(fù)發(fā)送相同的請(qǐng)求胯陋。
使用場(chǎng)景:客服端在向服務(wù)器發(fā)出請(qǐng)求之前,隨機(jī)生成nonce參數(shù)。服務(wù)器在接收到請(qǐng)求之后惶岭,取出nonce參數(shù)寿弱,然后去緩存中查找是否已存在nonce的值。如果存在按灶,則說(shuō)明該請(qǐng)求已經(jīng)收到過(guò)症革,則 拒絕本次請(qǐng)求,如果不存在鸯旁,則說(shuō)明首次接收到該請(qǐng)求噪矛,正常進(jìn)行處理。
timestamp:客服端發(fā)送請(qǐng)求的時(shí)間戳(timestamp一般和nonce組合使用)
解決的問(wèn)題:防止服務(wù)器端緩存nonce數(shù)據(jù)量過(guò)大的問(wèn)題铺罢。當(dāng)服務(wù)器緩存的nonce較多時(shí)艇挨,每次查找nonce就會(huì)耗費(fèi)大量時(shí)間。通過(guò)添加請(qǐng)求時(shí)間戳韭赘,判斷請(qǐng)求時(shí)間到服務(wù)器接收到請(qǐng)求的時(shí)間差是否在有效處理時(shí)間內(nèi)(例如5分鐘)缩滨,如果在5分鐘之內(nèi)則進(jìn)行處理,如果超出五分鐘則拒絕該請(qǐng)求泉瞻。這樣脉漏,服務(wù)器端在緩存nonce的時(shí)候,可以設(shè)置nonce的緩存時(shí)間為5分鐘袖牙,超出5分鐘之后侧巨,自動(dòng)清除掉緩存中的nonce,這樣就避免了緩存大量nonce的問(wèn)題鞭达。
使用場(chǎng)景:客服端在發(fā)出請(qǐng)求時(shí)司忱,附帶timestamp,記錄下當(dāng)前的請(qǐng)求時(shí)間畴蹭。服務(wù)器接收到請(qǐng)求時(shí)坦仍,取出timestamp,判斷和當(dāng)前的時(shí)間差叨襟,如果超出一定的時(shí)間(例如5分鐘)桨踪,則放棄該請(qǐng)求。如果在5分鐘之內(nèi)芹啥,則取出nonce,去緩存中查找nonce铺峭,如果已存在則拒絕掉墓怀,如果不存在則正常處理。
數(shù)據(jù)保密性: http請(qǐng)求的數(shù)據(jù)無(wú)論是GET還是POST都可能會(huì)被抓包獲取到數(shù)據(jù)卫键。為了避免用戶的敏感數(shù)據(jù)被竊取傀履,則需要對(duì)數(shù)據(jù)進(jìn)行加密處理。
AES:對(duì)稱加密算法
使用方式:客服端和服務(wù)器端共同確定一個(gè)用來(lái)加密和解密的秘鑰。然后客服端在請(qǐng)求服務(wù)器是通過(guò)該秘鑰對(duì)數(shù)據(jù)進(jìn)行加密钓账,服務(wù)器端在接收到請(qǐng)求之后使用該秘鑰對(duì)數(shù)據(jù)進(jìn)行解密碴犬。
優(yōu)勢(shì):加密效率高
缺點(diǎn):秘鑰需要共享給客戶端,具有泄露的風(fēng)險(xiǎn)
RSA:非對(duì)稱加密算法
使用方式:服務(wù)器端生成公鑰和私鑰梆暮,把私鑰發(fā)送給客戶端服协。客服端在請(qǐng)求服務(wù)器是啦粹,通過(guò)公鑰對(duì)數(shù)據(jù)進(jìn)行加密偿荷。服務(wù)器端接收到請(qǐng)求之后,使用私鑰對(duì)加密的數(shù)據(jù)進(jìn)行解密唠椭。
優(yōu)勢(shì):不需要共享私鑰跳纳,避免了私鑰泄露的風(fēng)險(xiǎn)。
劣勢(shì):加密效率低贪嫂,數(shù)據(jù)量大是較為耗時(shí)
實(shí)際場(chǎng)景中寺庄,一般使用如下策略進(jìn)行加密:
服務(wù)器端通過(guò)RSA生成公鑰,然后把公鑰給客戶端力崇《诽粒客服端在請(qǐng)求服務(wù)器前, 隨機(jī)生成AES秘鑰餐曹,然后用AES秘鑰加密請(qǐng)求數(shù)據(jù)逛拱。之后用RSA公鑰對(duì)AES秘鑰進(jìn)行加密,然后把加密之后的AES秘鑰和加密后的請(qǐng)求數(shù)據(jù)一起發(fā)送給服務(wù)器台猴。服務(wù)器收到請(qǐng)求之后朽合,先用RSA私鑰解密出AES秘鑰,然后用AES秘鑰對(duì)請(qǐng)求數(shù)據(jù)進(jìn)行解密饱狂,獲取請(qǐng)求數(shù)據(jù)曹步。
其他常見(jiàn)算法說(shuō)明:
MD5:信息摘要算法,不是加密算法。
加密算法需要能夠解密出原始數(shù)據(jù)的休讳。MD5是不可逆的讲婚,不存在解密的說(shuō)法。MD5的目的是用來(lái)校驗(yàn)文件/數(shù)據(jù)是否和原始數(shù)據(jù)一致俊柔,是否被修改過(guò)筹麸。只要文件/數(shù)據(jù)被修改過(guò),則計(jì)算出的MD5就不一致雏婶。SHA-1類似,可以從來(lái)文件校驗(yàn)和計(jì)算數(shù)字簽名物赶。
應(yīng)用場(chǎng)景:作為計(jì)算sign簽名的算法,校驗(yàn)數(shù)據(jù)的一致性
Base64:編碼規(guī)范留晚,不是加密算法酵紫。
其存在的目的是為了解決部分網(wǎng)絡(luò)傳輸不支持不可見(jiàn)字符的問(wèn)題。通過(guò)Base64編碼把數(shù)據(jù)流轉(zhuǎn)化為可打印顯示的字符,之后通過(guò)網(wǎng)絡(luò)進(jìn)行傳輸奖地。既然是編碼橄唬,那么就可以被解碼還原的。其類似于URL編碼,為了把一些特殊字符轉(zhuǎn)化為安全字符参歹。
應(yīng)用場(chǎng)景:RSA的公鑰為byte數(shù)組仰楚,在傳給客戶端的時(shí)候 ,就可以通過(guò)Base64編碼把byte數(shù)組轉(zhuǎn)換為字符串泽示,然后傳給客戶端缸血。