摘要:有缺陷放棄傳輸密碼動態(tài)加密解密這個模塊分離至項目權(quán)限管理系統(tǒng)與前后端分離實踐,感覺那樣寫文章太長了找不到重點,分離出來要好點。這里的前后端加密解密下圖由于介紹的是動態(tài)加密解密傳輸信息方案,這里并不會涉及之后的簽發(fā)等。
有缺陷放棄 傳輸密碼動態(tài)加密解密
這個模塊分離至項目api權(quán)限管理系統(tǒng)與前后端分離實踐,感覺那樣寫文章太長了找不到重點,分離出來要好點。
在用戶密碼登錄認證中,明文傳輸用戶輸入的密碼是不可取的。在沒有用https的情況下,這里需要對用戶密碼加密傳輸,保證即使密碼泄露也不影響。
這里的前后端加密解密下圖:
由于介紹的是動態(tài)加密解密傳輸信息方案,這里并不會涉及之后的JWT簽發(fā)等。
下面是實現(xiàn)細節(jié):
angular 前端發(fā)送get動態(tài)秘鑰請求后會對對象進行監(jiān)聽,在回調(diào)函數(shù)里獲取后端返回的秘鑰后再進行加密處理,之后再發(fā)送登錄請求。在angular我把請求服務(wù)化了,下面的代碼片段會有點凌亂。
// 調(diào)用獲取tokenKey秘鑰服務(wù) this.loginService.getTokenKey().subscribe( data => { this.responseData = data; if (this.responseData.data.tokenKey !== undefined) { const tokenKey = this.responseData.data.tokenKey; // 調(diào)用服務(wù),發(fā)送認證請求 this.loginService.login(this.appId, this.password, tokenKey).subscribe( data2 => { // 認證成功返回jwt this.responseData = data2; if (this.responseData.meta.code === 1003 && this.responseData.data.jwt != null) { this.authService.updateAuthorizationToken(this.responseData.data.jwt); this.authService.updateUid(this.appId); this.authService.updateUser(this.responseData.data.user); this.router.navigateByUrl("/index"); } else { this.msg = "用戶名密碼錯誤"; this.isDisabled = true; } }, error => { console.error(error); this.msg = error; this.isDisabled = true; } ); } } );
@Injectable() export class LoginService { constructor(private httpUtil: HttpUtil) { } getTokenKey() { const url = "account/login?tokenKey=get"; // 先向后臺申請加密tokenKey tokenKey=get // const getKeyParam = new HttpParams().set("tokenKey", "get"); return this.httpUtil.get(url); } login(appId: string, password: string, tokenKey: string) { const url = "account/login"; tokenKey = CryptoJS.enc.Utf8.parse(tokenKey); password = CryptoJS.enc.Utf8.parse(password); password = CryptoJS.AES.encrypt(password, tokenKey, {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7}).toString(); console.log(password); const param = new HttpParams().append("appId", appId) .append("password", password) .append("methodName", "login") .append("timestamp", new Date().toUTCString()); return this.httpUtil.post(url, param); } }
后端是在一個filter中對登錄注冊請求進行攔截,判斷其是正常登錄注冊還是獲取動態(tài)加密秘鑰請求,正常認證就走shiro,判斷為獲取秘鑰則生成16隨機碼默認AES加密秘鑰為約定16位,小于16位會報錯,將秘鑰以<遠程IP,秘鑰>的
// 判斷若為獲取登錄注冊加密動態(tài)秘鑰請求 if (isPasswordTokenGet(request)) { //動態(tài)生成秘鑰,redis存儲秘鑰供之后秘鑰驗證使用,設(shè)置有效期5秒用完即丟棄 String tokenKey = CommonUtil.getRandomString(16); try { redisTemplate.opsForValue().set("PASSWORD_TOKEN_KEY_"+request.getRemoteAddr().toUpperCase(),tokenKey,5, TimeUnit.SECONDS); // 動態(tài)秘鑰response返回給前端 Message message = new Message(); message.ok(1000,"issued tokenKey success") .addData("tokenKey",tokenKey); RequestResponseUtil.responseWrite(JSON.toJSONString(message),response); }catch (Exception e) { LOGGER.warn(e.getMessage(),e); // 動態(tài)秘鑰response返回給前端 Message message = new Message(); message.ok(1000,"issued tokenKey fail"); RequestResponseUtil.responseWrite(JSON.toJSONString(message),response); } return false; }
// 創(chuàng)建認證信息,其中就有包括獲取redis中對應(yīng)IP的動態(tài)秘鑰 private AuthenticationToken createPasswordToken(ServletRequest request) { Mapmap = RequestResponseUtil.getRequestParameters(request); String appId = map.get("appId"); String timestamp = map.get("timestamp"); String password = map.get("password"); String host = request.getRemoteAddr(); String tokenKey = redisTemplate.opsForValue().get("PASSWORD_TOKEN_KEY_"+host.toUpperCase()); return new PasswordToken(appId,password,timestamp,host,tokenKey); }
github:
bootshiro
usthe
碼云:
bootshiro
usthe
持續(xù)更新。。。。。。
分享一波阿里云代金券快速上云
轉(zhuǎn)載請注明 from tomsun28
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/69184.html
摘要:所以我們今天只談前端加密,一個部分人認為沒有意義的工作。在中,認證過程使用了非對稱加密算法,非認證過程中使用了對稱加密算法。非對稱加密上文中我們討論了前端的哈希加密以及應(yīng)用的場景。 showImg(https://segmentfault.com/img/bVAhTC); 當(dāng)然在談安全。 前端安全是Web安全的一部分,常見的安全問題會有XSS、CSRF、SQL注入等,然而這些已經(jīng)在程師...
閱讀 429·2024-11-06 13:38
閱讀 809·2024-09-10 13:19
閱讀 937·2024-08-22 19:45
閱讀 1386·2021-11-19 09:40
閱讀 2626·2021-11-18 13:14
閱讀 4291·2021-10-09 10:02
閱讀 2318·2021-08-21 14:12
閱讀 1286·2019-08-30 15:54