国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

傳輸密碼動態(tài)加密解密(有缺陷放棄)

miguel.jiang / 3223人閱讀

摘要:有缺陷放棄傳輸密碼動態(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,秘鑰>的形式存儲到redis,設(shè)置其有效時間為5秒5秒看自己情況不要太大也不要太短,設(shè)置有效期是為了防止被其他人截取到加密密碼冒充用戶的情況,把風(fēng)險降更低

 // 判斷若為獲取登錄注冊加密動態(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) {
        Map map = 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

相關(guān)文章

  • 當(dāng)我們在談?wù)撉岸?em>加密時,我們在談些什么

    摘要:所以我們今天只談前端加密,一個部分人認為沒有意義的工作。在中,認證過程使用了非對稱加密算法,非認證過程中使用了對稱加密算法。非對稱加密上文中我們討論了前端的哈希加密以及應(yīng)用的場景。 showImg(https://segmentfault.com/img/bVAhTC); 當(dāng)然在談安全。 前端安全是Web安全的一部分,常見的安全問題會有XSS、CSRF、SQL注入等,然而這些已經(jīng)在程師...

    wizChen 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<