粗略地分析, 登錄機(jī)制主要分為登錄驗證、登錄保持、登出三個部分。登錄驗證是指客戶端提供用戶名和密碼,向服務(wù)器提出登錄請求,服務(wù)器判斷客戶端是否可以登錄并向客戶端確認(rèn)。 登錄認(rèn)保持是指客戶端登錄后, 服務(wù)器能夠分辨出已登錄的客戶端,并為其持續(xù)提供登錄權(quán)限的服務(wù)器。登出是指客戶端主動退出登錄狀態(tài)。容易想到的方案是,客戶端登錄成功后, 服務(wù)器為其分配sessionId, 客戶端隨后每次請求資源時都帶上sessionId。
創(chuàng)新互聯(lián)建站專業(yè)網(wǎng)站建設(shè),網(wǎng)站制作與網(wǎng)站建設(shè)公司,1800元做網(wǎng)站建設(shè)全包,免費(fèi)贈送網(wǎng)站基礎(chǔ)優(yōu)化服務(wù),讓你的網(wǎng)站變得更有價值,公司擁有完善的專業(yè)的建站公司流程,能夠為企業(yè)提供建站服務(wù)。使用PHP+MYSQL開發(fā)可交付網(wǎng)站源代碼;符合網(wǎng)站優(yōu)化排名的后臺管理系統(tǒng);網(wǎng)站制作收費(fèi)合理;免費(fèi)進(jìn)行網(wǎng)站備案等企業(yè)網(wǎng)站建設(shè)一條龍服務(wù).
上述簡易的登錄驗證策略存在明顯的安全漏洞,需要優(yōu)化。
客戶端第一次發(fā)出登錄請求時, 用戶密碼以明文的方式傳輸, 一旦被截獲, 后果嚴(yán)重。因此密碼需要加密,例如可采用RSA非對稱加密。具體流程如下:
再仔細(xì)核對上述登錄流程, 我們發(fā)現(xiàn)服務(wù)器判斷用戶是否登錄, 完全依賴于sessionId, 一旦其被截獲, 黑客就能夠模擬出用戶的請求。于是我們需要引入token的概念: 用戶登錄成功后, 服務(wù)器不但為其分配了sessionId, 還分配了token, token是維持登錄狀態(tài)的關(guān)鍵秘密數(shù)據(jù)。在服務(wù)器向客戶端發(fā)送的token數(shù)據(jù),也需要加密。于是一次登錄的細(xì)節(jié)再次擴(kuò)展。
在最原始的方案中, 登錄保持僅僅靠服務(wù)器生成的sessionId: 客戶端的請求中帶上sessionId, 如果服務(wù)器的redis中存在這個id,就認(rèn)為請求來自相應(yīng)的登錄客戶端。 但是只要sessionId被截獲, 請求就可以為偽造, 存在安全隱患。
引入token后,上述問題便可得到解決。 服務(wù)器將token和其它的一些變量, 利用散列加密算法得到簽名后,連同sessionId一并發(fā)送給服務(wù)器; 服務(wù)器取出保存于服務(wù)器端的token,利用相同的法則生成校驗簽名, 如果客戶端簽名與服務(wù)器的校驗簽名一致, 就認(rèn)為請求來自登錄的客戶端。
1.3 TOKEN失效
用戶登錄出系統(tǒng)
失效原理:
在服務(wù)器端的redis中刪除相應(yīng)key為session的鍵值對。
App因為要實現(xiàn)自動登陸功能,所以必然要保存一些憑據(jù),所以比較復(fù)雜。
App登陸要實現(xiàn)的功能:
這里判斷時間,主要是防止攻擊者截取到加密串后,可以長久地利用這個加密串來登陸。
不用AES加密,用RSA公鑰加密也是可以的。AES速度比RSA要快,RSA只能存儲有限的數(shù)據(jù)。
做個攔截器 把沒登錄的攔截了
或者后臺生成token app端每次憑token訪問
apk簽名相當(dāng)于程序的身份識別代碼。
apk簽名用于程序編譯打包之后,手機(jī)在運(yùn)行程序之前會先去驗證程序的簽名(可以看作類似于我們電腦上常說的md5)是否合法,只有通過了驗證的文件才會被運(yùn)行,所以簽名軟件的作用的讓文件通過手機(jī)的驗證為合法,不同的手機(jī)、系統(tǒng)是對應(yīng)不同的簽名的。
進(jìn)行加密通訊防止API外部調(diào)用
服務(wù)器端與客戶端各自會存儲一個TOKEN,這個TOKEN我們?yōu)榱朔乐狗淳幾g是用C語言來寫的一個文件并做了加殼和混淆處理。
在客戶端訪問服務(wù)器API任何一個接口的時候,客戶端需要帶上一個特殊字段,這個字段就是簽名signature,簽名的生成方式為:
訪問的接口名+時間戳+加密TOKEN 進(jìn)行整體MD5,并且客戶端將本地的時間戳作為明文參數(shù)提交到服務(wù)器
服務(wù)器首先會驗證這兩個參數(shù):驗證時間戳,如果時間誤差與服務(wù)器超過正負(fù)一分鐘,服務(wù)器會拒絕訪問(防止被抓包重復(fù)請求服務(wù)器,正負(fù)一分鐘是防止時間誤差,參數(shù)可調(diào)整),
然后服務(wù)器會根據(jù)請求的API地址和提交過來的時間戳再加上本地存儲的token按照MD5重新生成一個簽名,并比對簽名,簽名一致才會通過服務(wù)器的驗證,進(jìn)入到下一步的API邏輯
用HTTPS通信,另外APP往服務(wù)器接口發(fā)送的參數(shù)帶token,還要加上簽名,服務(wù)器端驗簽名(以防參數(shù)被篡改),校驗token;同時加上時間戳,防止重放。(簽名算法、密鑰的分配安全存儲要設(shè)計好)
對服務(wù)器接口要有監(jiān)控,監(jiān)控到異常情況要有處理方案。