先聲明本人是Java初學者,僅寫自己感悟,不專業處,僅供參考。
最近在弄Java后臺接口加密,公司之前的后臺接口加密方式是,用戶在登錄接口成功后,生成一個userToken,還有一個userTokenExpire也就是userToken過期時間,把這兩個字段更新存入數據庫對應user表,然后把userId和userToken這兩個字段返給客戶端保存,后面在每個需要驗證的接口,客戶端都傳給服務器userId和一個apiToken,期中apiToken的生成規則是,當前時間年月日+接口Url+userToken進行兩次MD5加密,客戶端在收到請求后根據userId去user數據庫去查用戶信息,查不到返回uerId錯誤,查到再判斷userTokenExpire是否過期,如果過期,直接返回,并提示客戶端身份信息過期,請重新登錄,userTokenExpire沒有過期情況下從數據庫user表里取出userToken,用和客戶端同樣的方式即當前時間年月日+接口Url+userToken進行兩次MD5加密生成apiToken,進行比較,相同則驗證通過繼續執行接口邏輯,不相同直接返回,提示客戶端apiToken錯誤。
這兩天又接觸了JWT,Json Web Token認證技術該技術比較成熟,感興趣的可以自行百度,大致分為頭部,荷載(可以存一些不重要的信息),簽證這三部分,請求頭一般放加密方式,荷載這里面信息可以存放簽發時間,過期時間,等,簽證是用前面兩部分內容再結合secret服務器私鑰檢驗,用來檢驗整個信息是否合法,是否是該服務器發出的。然后將這三者分別Base64加密用逗號隔開生存token在登陸時傳給客戶端,后面在需要驗證的接口請求頭部,客戶端再傳給服務器驗證。
總結第二種方式和第一種方式比較,第二種方式不需要第一種方式那樣專門在數據庫存一個userTokenExpire用來記錄token過期時間,直接在荷載里記錄,且第二種方式在每個接口不用去查詢數據庫user表,減少數據庫操作。且第一種apiToken生成的方式看似很安全,但是客戶端源代碼很容易暴露,一旦暴露作用也不大。
不管咋樣,如果在登錄接口就不安全,token就暴露了,啥都白搭,但用JWT技術用比“裸奔”強,后面為了進一步安全所有請求都用Https即可。